Module: Storext::ClassMethods

Defined in:
lib/storext.rb

Instance Method Summary collapse

Instance Method Details

#store_attribute(column, attr, type = nil, opts = {}) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# File 'lib/storext.rb', line 21

def store_attribute(column, attr, type=nil, opts={})
  store_attribute_defs[column] ||= []
  store_attribute_defs[column] << attr

  storext_proxy_class.attribute "_casted_#{attr}", type, opts

  define_method "#{attr}=" do |value|
    storext_proxy.send("_casted_#{attr}=", value)
    write_store_attribute column, attr, storext_proxy.send("_casted_#{attr}")
  end

  define_method attr do
    if store_val = read_store_attribute(column, attr)
      storext_proxy.send("_casted_#{attr}=", store_val)
    end
    storext_proxy.send("_casted_#{attr}")
  end

  store_accessor column, *store_attribute_defs[column]
end

#store_attributes(column, &block) ⇒ Object



42
43
44
# File 'lib/storext.rb', line 42

def store_attributes(column, &block)
  storext_proxy_class.define_store_attributes self, column, &block
end

#storext_proxy_classObject



46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
# File 'lib/storext.rb', line 46

def storext_proxy_class
  @storext_proxy_class ||= Class.new do
    include Virtus.model

    def self.define_store_attributes(source_class, column, &block)
      @source_class = source_class
      @column = column
      instance_eval &block
    end

    def self.method_missing(method_name, *args, &block)
      @source_class.store_attribute @column, method_name, *args
    end
  end
end