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
|