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



33
34
35
36
37
38
39
40
# File 'lib/l43/open_object/initializer.rb', line 33

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



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/l43/open_object/initializer.rb', line 7

def define_initialize(klass, atts, defaults, blk)
  klass.define_method :initialize do |**kwds|
    missing = atts - kwds.keys
    raise ArgumentError, "missing required keyword parameters: #{missing.inspect}" unless missing.empty?
    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 respond_to?(:_init)
      $stderr.puts("Automatic invocation the `_init` method is deprected and will be removed in v0.3")
      _init
    end
    do_we_freeze = instance_exec(&blk) if blk
    if do_we_freeze == :stay_warm
      Initializer.define_dynamic_to_h(klass, values.keys)
    else
      Initializer.define_to_h(klass, values.keys)
      to_h
      freeze
    end
  end
end

#define_to_h(klass, keys) ⇒ Object



42
43
44
45
46
47
48
49
# File 'lib/l43/open_object/initializer.rb', line 42

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