gnapse/redis-attrs

View on GitHub
lib/redis-attrs/complex.rb

Summary

Maintainability
A
0 mins
Test Coverage
require "redis/hash_key"
require "redis/list"
require "redis/set"
require "redis/sorted_set"
require "redis/lock"
require "redis/counter"
require "redis-attrs/objects_extensions"

class Redis
  module Attrs
    class Complex < Base

      def initialize(klass, name, type, options)
        super
        attr = self
        attr_class = self.class.redis_object_class[type]

        # Define the getter
        klass.send(:define_method, name) do
          instance_variable_get("@#{name}") || begin
            obj = attr_class.new attr.redis_key(id), redis, options
            instance_variable_set("@#{name}", obj)
          end
        end

        # TODO: Add support for collection setters
        if self.respond_to?(:setter)
          klass.send(:define_method, "#{name}=") do |value|
            obj = send(name)
            attr.setter(id, obj, value)
          end
        end
      end

      def self.redis_object_class
        @@redis_object_class ||= {
          lock:       Redis::Lock,
          counter:    Redis::Counter,
          hash:       Redis::HashKey,
          list:       Redis::Attrs::FilteredList,
          set:        Redis::Attrs::FilteredSet,
          sorted_set: Redis::SortedSet,
        }
      end

    end
  end
end