65 lines
1.5 KiB
Ruby
65 lines
1.5 KiB
Ruby
#
|
|
# Wrapper around Array so that the casted_by attribute is set in all
|
|
# elements of the array.
|
|
#
|
|
|
|
module CouchRest::Model
|
|
class CastedArray < Array
|
|
include CouchRest::Model::Dirty
|
|
attr_accessor :casted_by
|
|
attr_accessor :property
|
|
|
|
def initialize(array, property)
|
|
self.property = property
|
|
super(array)
|
|
end
|
|
|
|
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 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)
|
|
else
|
|
obj.casted_by = self.casted_by if obj.respond_to?(:casted_by)
|
|
obj
|
|
end
|
|
end
|
|
end
|
|
end
|