def migrate_property(obj, property, value, row)
      # if there is a shim migrate_<attribute> method, then call it on the input value
      value = filter_value(obj, property, value, row)
      return if value.nil?
      # set the attribute
      begin
        obj.send(property.writer, value)
      rescue Exception
        raise MigrationError.new("Could not set #{obj.qp} #{property} to #{value.qp} - " + $!)
      end
      logger.debug { "Migrated #{obj.qp} #{property} to #{value}." }
    end
def migrate_property(obj, property, value, row)
      # if there is a shim migrate_<attribute> method, then call it on the input value
      value = filter_value(obj, property, value, row)
      return if value.nil?
      # set the attribute
      begin
        obj.send(property.writer, value)
      rescue Exception
        raise MigrationError.new("Could not set #{obj.qp} #{property} to #{value.qp} - " + $!)
      end
      logger.debug { "Migrated #{obj.qp} #{property} to #{value}." }
    end
Sets the given property value to the filtered input value. If there is a filter
 defined for the property, then that filter is applied. If there is a migration
 shim method with name +migrate_+_attribute_, then that method is called on the
 (possibly filtered) value. The target object property is set to the resulting
 filtered value.

 @param [Migratable] obj the target domain object
 @param [Property] property the property to set
 @param value the input value
 @param [{Symbol => Object}] row the input row