Module: SmartMethodParameters::Kernel

Defined in:
lib/smart_method_parameters.rb

Instance Method Summary collapse

Instance Method Details

#method_parameters(b) ⇒ 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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/smart_method_parameters.rb', line 7

def method_parameters(b)
  fail "binding expected" unless b.is_a? Binding
  groupnames = [:keywords, :required, :positional, :optional, :predefined]
  groups = Hash[groupnames.map {|x| [x, Set.new]}]
  groupings = {
    :req     => i(positional required),
    :opt     => i(positional optional predefined),
    :key     => i(keywords required predefined),
    :keyreq  => i(keywords required),
    :keyrest => i(keywords optional),
  }

  hash = Hash.new
  parameters = eval("method(__method__).parameters",b)
  parameters.each do |pair|
    ptype, pname = *pair
    next if ptype == :rest
    pvalue = eval(pname.to_s, b)
    groupings[ptype].each do |groupname|
      if ptype == :keyrest
      groups[groupname].merge(pvalue.keys)
      hash.merge! pvalue
      else
      groups[groupname] << pname
      hash[pname] = pvalue
      end
    end
  end

  hash.define_singleton_method(:parameter_groups) {groups}
  hash.define_singleton_method(:limit_to) do |*groupnames|
    self if groupnames == []
    self.select do |pname,pvalue|
      groupnames.all? do |groupname|
        groups[groupname].include? pname
      end
    end
  end

  hash
end