@@ -26,34 +26,27 @@ def self.included(mod)
26
26
end
27
27
private_class_method :included
28
28
29
- def self . attr_accessor ( attr , type : nil )
30
- return unless type
31
- if :boolean == type then boolean attr
32
- elsif Integer == type then integer attr
33
- elsif Array === type then enum attr , type
34
- else raise ArgumentError , "unknown type coercion %p" % [ type ]
35
- end
36
- end
29
+ def self . safe ( ...) = Ractor . make_shareable nil . instance_eval ( ...) . freeze
30
+ private_class_method :safe
37
31
38
- def self . boolean ( attr )
39
- define_method :"#{ attr } =" do |val | super !!val end
40
- define_method :"#{ attr } ?" do send attr end
41
- end
32
+ Types = Hash . new do |h , type | type => Proc | nil ; safe { type } end
33
+ Types [ :boolean ] = Boolean = safe { -> { !!_1 } }
34
+ Types [ Integer ] = safe { -> { Integer ( _1 ) } }
42
35
43
- def self . integer ( attr )
44
- define_method :"#{ attr } =" do |val | super Integer val end
36
+ def self . attr_accessor ( attr , type : nil )
37
+ type = Types [ type ] or return
38
+ define_method :"#{ attr } =" do |val | super type [ val ] end
39
+ define_method :"#{ attr } ?" do send attr end if type == Boolean
45
40
end
46
41
47
- def self . enum ( attr , enum )
48
- enum = enum . dup . freeze
42
+ Enum = -> ( * enum ) {
43
+ enum = safe { enum }
49
44
expected = -"one of #{ enum . map ( &:inspect ) . join ( ", " ) } "
50
- define_method :"#{ attr } =" do |val |
51
- unless enum . include? ( val )
52
- raise ArgumentError , "expected %s, got %p" % [ expected , val ]
53
- end
54
- super val
55
- end
56
- end
45
+ safe { -> val {
46
+ return val if enum . include? ( val )
47
+ raise ArgumentError , "expected %s, got %p" % [ expected , val ]
48
+ } }
49
+ }
57
50
58
51
end
59
52
end
0 commit comments