lib/mongomodel/support/map.rb in mongomodel-0.5.5 vs lib/mongomodel/support/map.rb in mongomodel-0.5.6

- old
+ new

@@ -3,152 +3,152 @@ module MongoModel class Map < Hash module PropertyDefaults def property(name, *args, &block) #:nodoc: property = super(name, *args, &block) - + if property.type <= Map property.options[:default] ||= lambda { property.type.new } end - + property end end - + class_attribute :from self.from = String - + class_attribute :to self.to = Object - + HASH_CONVERTER = Types.converter_for(Hash) - + class << self def [](mapping) raise "Exactly one mapping must be specified" unless mapping.keys.size == 1 - + from = mapping.keys.first to = mapping.values.first - + @map_class_cache ||= {} @map_class_cache[[from, to]] ||= begin map = Class.new(Map) map.from = from map.to = to map end end - + def from_mongo(hash) result = new hash.each_pair { |k, v| result[from_converter.from_mongo(k)] = instantiate(v) } result end - + def inspect if self == Map "Map" else "Map[#{from} => #{to}]" end end - + def from_converter @from_converter ||= Types.converter_for(from) end - + def to_converter @to_converter ||= Types.converter_for(to) end - + private def instantiate(item) if item.is_a?(Hash) && item['_type'] item['_type'].constantize.from_mongo(item) else to_converter.from_mongo(item) end end end - + def initialize(hash={}) super() update(hash) end - + def to_mongo HASH_CONVERTER.to_mongo(self) end - + def [](key) super(convert_key(key)) end - + def []=(key, value) super(convert_key(key), convert_value(value)) end - + def store(key, value) super(convert_key(key), convert_value(value)) end - + def delete(key) super(convert_key(key)) end - + def fetch(key, *args, &block) super(convert_key(key), *args, &block) end - + def key?(key) super(convert_key(key)) end - + alias_method :include?, :key? alias_method :has_key?, :key? alias_method :member?, :key? - + def value?(value) super(convert_value(value)) end - + alias_method :has_value?, :value? - + def index(value) super(convert_value(value)) end - + def key(value) super(convert_value(value)) end - + def update(hash) hash.each_pair { |k, v| self[k] = v } self end - + def replace(hash) clear update(hash) end - + def merge(hash) dup.update(super(hash)) end - + def merge!(hash) update(merge(hash)) end - + def values_at(*keys) super(*keys.map { |k| convert_key(k) }) end - + private def convert_key(key) self.class.from_converter.cast(key) end - + def convert_value(value) self.class.to_converter.cast(value) end end end