lib/redis/objects/hashes.rb in redis-objects-0.7.0 vs lib/redis/objects/hashes.rb in redis-objects-0.8.0
- old
+ new
@@ -13,27 +13,30 @@
module ClassMethods
# Define a new hash key. It will function like a regular instance
# method, so it can be used alongside ActiveRecord, DataMapper, etc.
def hash_key(name, options={})
redis_objects[name.to_sym] = options.merge(:type => :dict)
- klass_name = '::' + self.name
+
+ mod = Module.new do
+ define_method(name) do
+ instance_variable_get("@#{name}") or
+ instance_variable_set("@#{name}",
+ Redis::HashKey.new(
+ redis_field_key(name), redis, redis_objects[name.to_sym]
+ )
+ )
+ end
+ end
+
if options[:global]
- instance_eval <<-EndMethods
- def #{name}
- @#{name} ||= Redis::HashKey.new(redis_field_key(:#{name}), #{klass_name}.redis, #{klass_name}.redis_objects[:#{name}])
- end
- EndMethods
- class_eval <<-EndMethods
- def #{name}
- self.class.#{name}
- end
- EndMethods
+ extend mod
+
+ # dispatch to class methods
+ define_method(name) do
+ self.class.public_send(name)
+ end
else
- class_eval <<-EndMethods
- def #{name}
- @#{name} ||= Redis::HashKey.new(redis_field_key(:#{name}), #{klass_name}.redis, #{klass_name}.redis_objects[:#{name}])
- end
- EndMethods
+ include mod
end
end
end
# Instance methods that appear in your class when you include Redis::Objects.