@@ -26,34 +26,24 @@ 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
37
-
38
- def self . boolean ( attr )
39
- define_method :"#{ attr } =" do |val | super !!val end
40
- define_method :"#{ attr } ?" do send attr end
41
- end
29
+ Types = Hash . new do |h , type | type => Proc | nil ; type end
30
+ Types [ :boolean ] = Boolean = -> { !!_1 }
31
+ Types [ Integer ] = -> { Integer ( _1 ) }
42
32
43
- def self . integer ( attr )
44
- define_method :"#{ attr } =" do |val | super Integer val end
33
+ def self . attr_accessor ( attr , type : nil )
34
+ type = Types [ type ] or return
35
+ define_method :"#{ attr } =" do |val | super type [ val ] end
36
+ define_method :"#{ attr } ?" do send attr end if type == Boolean
45
37
end
46
38
47
- def self . enum ( attr , enum )
39
+ Enum = -> ( * enum ) {
48
40
enum = enum . dup . freeze
49
41
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
42
+ -> val {
43
+ return val if enum . include? ( val )
44
+ raise ArgumentError , "expected %s, got %p" % [ expected , val ]
45
+ }
46
+ }
57
47
58
48
end
59
49
end
0 commit comments