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
|
# File 'lib/oop/tools.rb', line 12
def konstructor(*parts, &block)
parts_hsh = if parts.last.is_a?(Hash)
*parts, hsh = parts
parts += hsh.keys
parts.reduce({}){|m,e| m[e] = nil; m}.merge(hsh)
else
parts.reduce({}){|m,e| m[e] = nil; m}
end
define_method(:initialize) do |opts|
if block
opts = block.call(opts) || raise("#{self} invalid with #{opts}")
end
opts = opts.map{|k,v| [k.to_sym, v] }.to_h
@opts = {}
= (opts.keys - parts)
missing_args = parts.select do |k|
!opts.has_key?(k) && !parts_hsh.has_key?(k)
end
if .any?
raise "extra args: #{}"
elsif missing_args.any?
raise "missing args: #{missing_args}"
end
opts.each do |k, v|
k = k.to_sym
if self.is_a? Value
@opts[_rules.cast_to_value(k)] = _rules.cast_to_value(v)
else
@opts[k] = v
end
end
@opts
end
parts_hsh.each do |part, defaultt|
part = part.to_sym
define_method(part) do
@opts[part] ||= defaultt
end
end
end
|