Module: KeywordParams

Defined in:
lib/keyword_params.rb,
lib/keyword_params/version.rb

Defined Under Namespace

Classes: KeywordList

Constant Summary collapse

VERSION =
"0.0.1"

Instance Method Summary collapse

Instance Method Details

#keyword(name, &default_block) ⇒ Object



19
20
21
22
# File 'lib/keyword_params.rb', line 19

def keyword(name, &default_block)
  @keyword_list ||= KeywordList.new
  @keyword_list.add_keyword(name, default_block)
end

#method_added(name) ⇒ Object



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

def method_added(name)
  # Avoid crazy stack recursion
  return if Thread.current[:in_keyword_params_method_added]
  Thread.current[:in_keyword_params_method_added] = true
  original_method = instance_method(name)
  keyword_list = @keyword_list
  @keyword_list = nil
  define_method(name) do |*args|
    options = args.last.is_a?(Hash) ? args.pop : {}
    keyword_args = keyword_list.values(options)
    # We only need keyword arg values for as many positional args
    # as are NOT supplied.
    needed_keyword_args = keyword_args[(args.size..-1)]
    original_method.bind(self).call(*(args + needed_keyword_args))
  end
  super
  Thread.current[:in_keyword_params_method_added] = false
end