module DurableHash

Public Class Methods

deserializer(durable_hash_class, value_class) click to toggle source
# File lib/durable_hash.rb, line 7
def self.deserializer(durable_hash_class, value_class)
  deserializer = deserializers[durable_hash_class][value_class]
  unless deserializer
    match_class = deserializers[durable_hash_class].keys.detect { |klass|
      value_class < klass
    }
    deserializer = deserializers[durable_hash_class][match_class]
  end
  deserializer
end
included(includer) click to toggle source
# File lib/durable_hash.rb, line 34
def self.included(includer)
  def includer.acts_as_durable_hash
    self.validates_uniqueness_of :key
    self.validates_presence_of :key, :value_class
    self.serialize :value
  
    def self.[](key)
      if record = find_by_key(key.to_s)
        record.value
      end
    end
    
    def self.[]=(key, value)
      if record = find_by_key(key.to_s)
        record.value = value
        record.save!
      else
        create! :key => key.to_s, :value => value
      end
    end
    
    self.before_validation do |record|
      record.value_class = record.value.class.name
      serializer = DurableHash.serializer(record.class, record.value.class)
      record.value = serializer.call(record.value) if serializer
    end
    
    if ActiveRecord::VERSION::MAJOR == 3
      define_method(:durable_hash_after_find) do
        if attributes['value_class']
          serializer = DurableHash.deserializer(
            self.class, value_class.constantize
          )
          if serializer
            self.value = serializer.call self.value
          elsif value_class == 'Fixnum'
            self.value = self.value.to_i
          elsif value_class == 'Float'
            self.value = self.value.to_f
          end
        end
      end
      self.after_find :durable_hash_after_find
    else
      define_method(:after_find) do
        if attributes['value_class']
          serializer = DurableHash.deserializer(
            self.class, value_class.constantize
          )
          if serializer
            self.value = serializer.call self.value
          elsif value_class == 'Fixnum'
            self.value = self.value.to_i
          elsif value_class == 'Float'
            self.value = self.value.to_f
          end
        end
      end
    end
    
    if block_given?
      yield DurableHash::Builder.new(self)
    end
  end
end
serializer(durable_hash_class, value_class) click to toggle source
# File lib/durable_hash.rb, line 23
def self.serializer(durable_hash_class, value_class)
  serializer = serializers[durable_hash_class][value_class]
  unless serializer
    match_class = serializers[durable_hash_class].keys.detect { |klass|
      value_class < klass
    }
    serializer = serializers[durable_hash_class][match_class]
  end
  serializer
end