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
48
49
50
51
52
53
54
55
|
# File 'lib/kwattr.rb', line 9
def initializer(attrs, opts)
required_attrs = @required
defaults = @defaults
required_attrs.concat(attrs).uniq!
defaults.merge!(opts)
iv_cache = Hash.new { |h, k| h[k] = :"@#{k}" }
verbose, $VERBOSE = $VERBOSE, false
define_method :initialize do |*args, **kwargs, &block|
required = required_attrs.dup
defaults.merge(kwargs).each_pair do |key, value|
next unless required.delete(key) || defaults.key?(key)
kwargs.delete(key)
instance_variable_set iv_cache[key], value
end
unless required.empty?
super_required = []
initialize = method(:initialize)
initialize.super_method.parameters.each do |type, name|
super_required << name if type == :keyreq && !kwargs.key?(name)
end
required.unshift(*super_required)
raise ArgumentError,
"missing keyword#{'s' if required.size > 1}: #{KWAttr.keywords_for_error(required).join(', ')}"
end
begin
if kwargs.empty?
super(*args, &block) else super(*args, **kwargs, &block)
end
rescue ArgumentError
arity = method(:initialize).super_method.arity
if !kwargs.empty? && arity != -1 && arity == args.size
raise ArgumentError,
"unknown keyword#{'s' if kwargs.size > 1}: #{KWAttr.keywords_for_error(kwargs.keys).join(', ')}"
end
raise
end
end
$VERBOSE = verbose
end
|