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
48
49
50
51
52
53
54
55
56
57
|
# File 'lib/fp/fn.rb', line 16
def self.arguments(*args)
maybe_spec = args.last
if maybe_spec.is_a?(Hash)
@arguments = args[0..-2]
@spec = args.last
else
@arguments = args
@spec = nil
end
by_name = @spec && @spec[:by] == :name
by_position = @spec && [:pos, :position].include?(@spec[:by])
no_spec = !@spec
attr_readers = @arguments.map { |arg| ":#{arg}"}.join ", "
eval "attr_reader #{attr_readers}"
attr_assignments = @arguments.map { |arg|
"@#{arg} = #{arg}"
}.join("\n")
if by_position || no_spec
arguments_string = @arguments.join(", ")
eval <<-EOS
def initialize(#{arguments_string})
#{attr_assignments}
end
EOS
elsif by_name
arguments_string = @arguments.map{ |arg| "#{arg}:"}.join(", ")
eval <<-EOS
def initialize(#{arguments_string})
#{attr_assignments}
end
EOS
else
raise "Unknown value (#{@spec && @spec[:by]}) for arguments spec :by parameter; valid options are :name and :position"
end
end
|