4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
# File 'lib/keyword_struct.rb', line 4
def self.new(*attrs, &block)
Class.new do
attr_reader *attrs
define_method :initialize do |**kwargs|
missing_args = attrs.reject { |a| kwargs.key?(a) }
unless missing_args.empty?
message = (missing_args.length == 1) ? "missing keyword: #{missing_args.first}" : "missing keywords: #{missing_args.join(', ')}"
fail ArgumentError, message
end
attrs.each do |attr|
instance_variable_set("@#{attr}", kwargs[attr])
end
end
class_eval &block if block
end
end
|