def load(values, query)
repository = query.repository
model = self
if inheritance_property_index = query.inheritance_property_index
model = values.at(inheritance_property_index) || model
end
if key_property_indexes = query.key_property_indexes(repository)
key_values = values.values_at(*key_property_indexes)
identity_map = repository.identity_map(model)
if resource = identity_map.get(key_values)
return resource unless query.reload?
else
resource = model.allocate
resource.instance_variable_set(:@repository, repository)
identity_map.set(key_values, resource)
end
else
resource = model.allocate
resource.readonly!
end
resource.instance_variable_set(:@new_record, false)
query.fields.zip(values) do |property,value|
value = property.custom? ? property.type.load(value, property) : property.typecast(value)
property.set!(resource, value)
if track = property.track
case track
when :hash
resource.original_values[property.name] = value.dup.hash unless resource.original_values.has_key?(property.name) rescue value.hash
when :load
resource.original_values[property.name] = value unless resource.original_values.has_key?(property.name)
end
end
end
resource
end