Class: Teyu::DefineInitializer

Inherits:
Object
  • Object
show all
Defined in:
lib/teyu.rb

Instance Method Summary collapse

Constructor Details

#initialize(klass, arg_names) ⇒ DefineInitializer

Returns a new instance of DefineInitializer.



12
13
14
15
# File 'lib/teyu.rb', line 12

def initialize(klass, arg_names)
  @klass = klass
  @arg_names = arg_names
end

Instance Method Details

#applyObject



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

def apply
  sorter = Teyu::ArgsSorter.new(@arg_names)

  validate_number_of_req_args = method(:validate_number_of_req_args)
  validate_keyreq_args = method(:validate_keyreq_args)

  @klass.send(:define_method, :initialize) do |*arg_values|
    validate_number_of_req_args.call(sorter.req_args, arg_values)
    validate_keyreq_args.call(sorter.keyreq_args, arg_values)

    sorter.req_args.zip(arg_values).each do |name, value|
      instance_variable_set(:"@#{name}", value)
    end

    sorter.key_args.each do |name, value|
      instance_variable_set(:"@#{name}", value)
    end

    keyword_arg_values = arg_values[sorter.req_args.length..].find { |value| value.is_a?(Hash) } || {}
    (sorter.keyword_args & keyword_arg_values.keys).each do |name|
      instance_variable_set(:"@#{name}", keyword_arg_values[name])
    end
  end
end