@@ -26,34 +26,27 @@ def self.included(mod)
2626 end
2727 private_class_method :included
2828
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
3731
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 ) } }
4235
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
4540 end
4641
47- def self . enum ( attr , enum )
48- enum = enum . dup . freeze
42+ Enum = -> ( * enum ) {
43+ enum = safe { enum }
4944 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+ }
5750
5851 end
5952 end
0 commit comments