lib/couchrest/model/casted_array.rb in couchrest_model-1.1.0.beta3 vs lib/couchrest/model/casted_array.rb in couchrest_model-1.1.0.beta4

- old
+ new

@@ -3,61 +3,64 @@ # elements of the array. # module CouchRest::Model class CastedArray < Array + include CouchRest::Model::CastedBy include CouchRest::Model::Dirty - attr_accessor :casted_by - attr_accessor :property + attr_accessor :casted_by_property - def initialize(array, property) - self.property = property + def initialize(array, property, parent = nil) + self.casted_by_property = property + self.casted_by = parent unless parent.nil? super(array) end - + + # Adding new entries + def << obj - couchrest_parent_will_change! if use_dirty? super(instantiate_and_cast(obj)) end - + def push(obj) - couchrest_parent_will_change! if use_dirty? super(instantiate_and_cast(obj)) end + def unshift(obj) + super(instantiate_and_cast(obj)) + end + + def []= index, obj + value = instantiate_and_cast(obj, false) + couchrest_parent_will_change! if use_dirty? && value != self[index] + super(index, value) + end + def pop couchrest_parent_will_change! if use_dirty? && self.length > 0 super end def shift couchrest_parent_will_change! if use_dirty? && self.length > 0 super end - def unshift(obj) - couchrest_parent_will_change! if use_dirty? - super(instantiate_and_cast(obj)) - end - - def []= index, obj - value = instantiate_and_cast(obj) - couchrest_parent_will_change! if use_dirty? && value != self[index] - super(index, value) - end - def clear couchrest_parent_will_change! if use_dirty? && self.length > 0 super end protected - def instantiate_and_cast(obj) - if self.casted_by && self.property && obj.class != self.property.type_class - self.property.cast_value(self.casted_by, obj) + def instantiate_and_cast(obj, change = true) + property = casted_by_property + couchrest_parent_will_change! if change && use_dirty? + if casted_by && property && obj.class != property.type_class + property.cast_value(casted_by, obj) else - obj.casted_by = self.casted_by if obj.respond_to?(:casted_by) + obj.casted_by = casted_by if obj.respond_to?(:casted_by) + obj.casted_by_property = casted_by_property if obj.respond_to?(:casted_by_property) obj end end end end