Module: ModelPack::ClassMethods

Defined in:
lib/model_pack/class_methods.rb

Instance Method Summary collapse

Instance Method Details

#array(name, default: nil, serialize: nil, writer: nil, class_name: nil) ⇒ Object



45
46
47
48
49
50
51
# File 'lib/model_pack/class_methods.rb', line 45

def array(name, default: nil, serialize: nil, writer: nil, class_name: nil)
  attribute(name,
      default: default,
      serialize: serialize,
      as: Array,
      writer: writer || lambda { |array| array.is_a?(Array) ? (array.collect { |v| v.is_a?(Hash) && class_name ? class_name.new(v) : v }) : [] })
end

#attribute(name, writer: lambda { |v| v }, default: nil, as: nil, serialize: nil, predicate: nil) ⇒ Object



4
5
6
7
8
# File 'lib/model_pack/class_methods.rb', line 4

def attribute(name, writer: lambda { |v| v }, default: nil, as: nil, serialize: nil, predicate: nil)
  register_attribute(name)
  attribute_reader(name, default: default, as: as, serialize: serialize, predicate: predicate)
  attribute_writer(name, writer: writer)
end

#attribute_reader(name, default: nil, as: nil, serialize: nil, predicate: nil) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
# File 'lib/model_pack/class_methods.rb', line 16

def attribute_reader(name, default: nil, as: nil, serialize: nil, predicate: nil)
  dv = default.dup rescue default

  define_method name do
    instance_variable_defined?("@#{name}") ?
      instance_variable_get("@#{name}") : instance_variable_set("@#{name}", (as ? as.new : (dv.is_a?(Proc) ? dv.call : dv )))
  end

  # define predicate method if required
  define_method "#{name}?" do
    value = (instance_variable_defined?("@#{name}") ?
      instance_variable_get("@#{name}") : instance_variable_set("@#{name}", (as ? as.new : (dv.is_a?(Proc) ? dv.call : dv ))))
    predicate.is_a?(Proc) ? predicate.call(value)  : !!value  # false for nil or false
  end if predicate

  define_method "#{name}_hash" do
    instance_exec(send(name), &serialize)
  end if serialize
end

#attribute_writer(name, writer: lambda { |v| v }) ⇒ Object



10
11
12
13
14
# File 'lib/model_pack/class_methods.rb', line 10

def attribute_writer(name, writer: lambda { |v| v })
  define_method "#{name}=" do |value|
    instance_variable_set("@#{name}", instance_exec(value, &writer))
  end
end

#dictionary(name, class_name: nil, default: nil, serialize: nil, writer: nil) ⇒ Object



53
54
55
56
57
58
59
# File 'lib/model_pack/class_methods.rb', line 53

def dictionary(name, class_name: nil, default: nil, serialize: nil, writer: nil)
  attribute(name,
      default: default,
      serialize: serialize,
      writer: writer || lambda { |dictionary| Hash[dictionary.map { |k,v| [k, v.is_a?(Hash) && class_name ? class_name.new(v) : v]}] },
      as: Hash)
end

#object(name, class_name: nil, default: nil, as: nil, serialize: nil, predicate: nil) ⇒ Object



36
37
38
39
40
41
42
43
# File 'lib/model_pack/class_methods.rb', line 36

def object(name, class_name: nil, default: nil, as: nil, serialize: nil, predicate: nil)
  attribute(name,
    default: default,
    serialize: serialize,
    predicate: predicate,
    as: as,
    writer: lambda { |v| v.is_a?(Hash) && class_name ? class_name.new(v) : v })
end