Module: L43::OpenObject::Initializer

Extended by:
Initializer
Included in:
Initializer
Defined in:
lib/l43/open_object/initializer.rb

Instance Method Summary collapse

Instance Method Details

#define_dynamic_to_h(klass, keys) ⇒ Object



51
52
53
54
55
56
57
58
# File 'lib/l43/open_object/initializer.rb', line 51

def define_dynamic_to_h(klass, keys)
  klass.define_method :to_h do |*|
    keys.inject({}) do |r, k|
      r.update(k => instance_variable_get("@#{k}"))
    end
  end
  klass.alias_method :deconstruct_keys, :to_h
end

#define_initialize(klass, atts, defaults, blk) ⇒ Object



8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
# File 'lib/l43/open_object/initializer.rb', line 8

def define_initialize(klass, atts, defaults, blk)
  klass.define_method :initialize do |**kwds|
    spurious = kwds.keys - atts - defaults.keys
    raise ArgumentError, "spurious keyword parameters: #{spurious.inspect}" unless spurious.empty?

    values = defaults.merge(kwds)
    values.each do |key, value|
      instance_variable_set("@#{key}", value)
    end


    if blk
      more_values = instance_exec(OpenStruct.new(values), &blk)
      if Hash === more_values 
        more_values.each do |key, value|
          instance_variable_set("@#{key}", value)
        end
        values = values.merge(more_values)
      end
    end

    missing = atts - values.keys
    raise ArgumentError, "missing required keyword parameters: #{missing.inspect}" unless missing.empty?

    if respond_to?(:_init)
      _init
    end

    if klass.mutable?
      Initializer.define_dynamic_to_h(klass, values.keys)
    else
      Initializer.define_to_h(klass, values.keys)
      to_h
      freeze
    end
  end

  klass.instance_eval do
    @__atts__ = atts.freeze
    @__defaults__ = defaults.freeze
  end
end

#define_to_h(klass, keys) ⇒ Object



60
61
62
63
64
65
66
67
# File 'lib/l43/open_object/initializer.rb', line 60

def define_to_h(klass, keys)
  klass.define_method :to_h do |*|
    @__to_h__ ||= keys.inject({}) do |r, k|
      r.update(k => instance_variable_get("@#{k}"))
    end
  end
  klass.alias_method :deconstruct_keys, :to_h
end