traits 0.8.1 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/{traits-0.8.1.rb → traits-0.9.0.rb} +37 -14
- data/lib/traits.rb +37 -14
- metadata +3 -3
@@ -1,12 +1,14 @@
|
|
1
1
|
$__TRAIT_DEBUG__ = ENV['__TRAIT_DEBUG__'] || ENV['TRAIT_DEBUG'] || ENV['DEBUG']
|
2
|
-
$__TRAIT_VERSION__ = "0.
|
2
|
+
$__TRAIT_VERSION__ = "0.9.0"
|
3
3
|
|
4
4
|
class Object
|
5
5
|
#--{{{
|
6
6
|
def singleton_method_added(*a, &b)
|
7
7
|
#--{{{
|
8
|
+
ret = super rescue nil
|
8
9
|
obj = self
|
9
10
|
obj.__trait_singleton_class.__trait_module_eval{ @__trait_singleton_super = obj }
|
11
|
+
ret
|
10
12
|
#--}}}
|
11
13
|
end
|
12
14
|
def __trait_singleton_class
|
@@ -32,19 +34,16 @@ class Object
|
|
32
34
|
|
33
35
|
key = "#{ key }"
|
34
36
|
return opts.delete(key) if opts.has_key? key
|
35
|
-
|
36
37
|
key = key.intern
|
37
38
|
return opts.delete(key) if opts.has_key? key
|
38
39
|
|
39
40
|
key = "#{ key }s"
|
40
41
|
return opts.delete(key) if opts.has_key? key
|
41
|
-
|
42
42
|
key = key.intern
|
43
43
|
return opts.delete(key) if opts.has_key? key
|
44
44
|
|
45
45
|
key = "#{ key }es"
|
46
46
|
return opts.delete(key) if opts.has_key? key
|
47
|
-
|
48
47
|
key = key.intern
|
49
48
|
return opts.delete(key) if opts.has_key? key
|
50
49
|
|
@@ -67,8 +66,8 @@ class Object
|
|
67
66
|
block.__trait_singleton_class.class_eval{ attr '__trait_default' }
|
68
67
|
end
|
69
68
|
|
70
|
-
list
|
71
|
-
opts =
|
69
|
+
list = [ args ].flatten.dup
|
70
|
+
opts = Hash::new.update(((list.size > 1 and Hash === list.last) ? list.pop : {}))
|
72
71
|
|
73
72
|
pre = __trait_getopt opts, 'pre'
|
74
73
|
post = __trait_getopt opts, 'post'
|
@@ -79,7 +78,10 @@ class Object
|
|
79
78
|
ducktype = __trait_getopt opts, 'ducktype'
|
80
79
|
default = __trait_getopt opts, 'default'
|
81
80
|
|
82
|
-
|
81
|
+
list, hashes = list.partition{|arg| not Hash === arg}
|
82
|
+
hashes << opts unless opts.empty? # in which case it was not, in fact, opts
|
83
|
+
|
84
|
+
names_and_defaults = hashes.inject({}){|h,h2| h.update h2}
|
83
85
|
|
84
86
|
raise ArgumentError,
|
85
87
|
"cannot specify both 'default' keyword and 'default' block" if
|
@@ -87,6 +89,10 @@ class Object
|
|
87
89
|
|
88
90
|
default ||= block
|
89
91
|
|
92
|
+
# force list and names_and_defaults.keys to strings
|
93
|
+
list = list.map{|t| "#{ t }"}
|
94
|
+
names_and_defaults = Hash[ *names_and_defaults.to_a.map{|k,v| ["#{ k }", v]}.flatten ]
|
95
|
+
|
90
96
|
list.each{|name| names_and_defaults[name] = default}
|
91
97
|
|
92
98
|
names = list + (names_and_defaults.keys - list)
|
@@ -103,14 +109,10 @@ class Object
|
|
103
109
|
|
104
110
|
names_and_hooks = names.inject({}){|h, name| h.update name => hooks}
|
105
111
|
|
106
|
-
{
|
107
|
-
'names' => names,
|
112
|
+
ret = {
|
108
113
|
'names_and_defaults' => names_and_defaults,
|
109
114
|
'names_and_hooks' => names_and_hooks,
|
110
|
-
|
111
|
-
#'pre' => pre, 'post' => post, 'validate' => validate, 'munge' => munge, 'cast' => cast,
|
112
|
-
'default' => default,
|
113
|
-
}.update hooks
|
115
|
+
}
|
114
116
|
#--}}}
|
115
117
|
end
|
116
118
|
def __trait_instance_method_list
|
@@ -477,7 +479,7 @@ class Module
|
|
477
479
|
return nil
|
478
480
|
end
|
479
481
|
else
|
480
|
-
@#{ name }
|
482
|
+
defined? @#{ name } and @#{ name }
|
481
483
|
end
|
482
484
|
end
|
483
485
|
end
|
@@ -502,8 +504,11 @@ class Module
|
|
502
504
|
hook_types = %w( pre munge cast type ducktype validate post )
|
503
505
|
|
504
506
|
#{ klass }::__trait_search_path.each do |obj|
|
507
|
+
|
505
508
|
break if hooks.values_at(*hook_types).compact.size == hook_types.size
|
509
|
+
|
506
510
|
hook_types.each{|ht| hooks[ht] ||= obj.#{ hooks }['#{ name }'][ht]}
|
511
|
+
|
507
512
|
end
|
508
513
|
|
509
514
|
pre_hook, munge_hook, cast_hook, type_hook, ducktype_hook, validate_hook, post_hook =
|
@@ -662,3 +667,21 @@ class Module
|
|
662
667
|
end
|
663
668
|
#--}}}
|
664
669
|
end
|
670
|
+
|
671
|
+
module TraitInit
|
672
|
+
#--{{{
|
673
|
+
def trait_init opts = {}
|
674
|
+
#--{{{
|
675
|
+
opts.each do |k,v|
|
676
|
+
k = "#{ k }"
|
677
|
+
if respond_to? k
|
678
|
+
send k, v
|
679
|
+
else
|
680
|
+
raise ArgumentError, "invalid trait -- #{ self.class }##{ k }"
|
681
|
+
end
|
682
|
+
end
|
683
|
+
#--}}}
|
684
|
+
end
|
685
|
+
alias_method "traitinit", "trait_init"
|
686
|
+
#--}}}
|
687
|
+
end
|
data/lib/traits.rb
CHANGED
@@ -1,12 +1,14 @@
|
|
1
1
|
$__TRAIT_DEBUG__ = ENV['__TRAIT_DEBUG__'] || ENV['TRAIT_DEBUG'] || ENV['DEBUG']
|
2
|
-
$__TRAIT_VERSION__ = "0.
|
2
|
+
$__TRAIT_VERSION__ = "0.9.0"
|
3
3
|
|
4
4
|
class Object
|
5
5
|
#--{{{
|
6
6
|
def singleton_method_added(*a, &b)
|
7
7
|
#--{{{
|
8
|
+
ret = super rescue nil
|
8
9
|
obj = self
|
9
10
|
obj.__trait_singleton_class.__trait_module_eval{ @__trait_singleton_super = obj }
|
11
|
+
ret
|
10
12
|
#--}}}
|
11
13
|
end
|
12
14
|
def __trait_singleton_class
|
@@ -32,19 +34,16 @@ class Object
|
|
32
34
|
|
33
35
|
key = "#{ key }"
|
34
36
|
return opts.delete(key) if opts.has_key? key
|
35
|
-
|
36
37
|
key = key.intern
|
37
38
|
return opts.delete(key) if opts.has_key? key
|
38
39
|
|
39
40
|
key = "#{ key }s"
|
40
41
|
return opts.delete(key) if opts.has_key? key
|
41
|
-
|
42
42
|
key = key.intern
|
43
43
|
return opts.delete(key) if opts.has_key? key
|
44
44
|
|
45
45
|
key = "#{ key }es"
|
46
46
|
return opts.delete(key) if opts.has_key? key
|
47
|
-
|
48
47
|
key = key.intern
|
49
48
|
return opts.delete(key) if opts.has_key? key
|
50
49
|
|
@@ -67,8 +66,8 @@ class Object
|
|
67
66
|
block.__trait_singleton_class.class_eval{ attr '__trait_default' }
|
68
67
|
end
|
69
68
|
|
70
|
-
list
|
71
|
-
opts =
|
69
|
+
list = [ args ].flatten.dup
|
70
|
+
opts = Hash::new.update(((list.size > 1 and Hash === list.last) ? list.pop : {}))
|
72
71
|
|
73
72
|
pre = __trait_getopt opts, 'pre'
|
74
73
|
post = __trait_getopt opts, 'post'
|
@@ -79,7 +78,10 @@ class Object
|
|
79
78
|
ducktype = __trait_getopt opts, 'ducktype'
|
80
79
|
default = __trait_getopt opts, 'default'
|
81
80
|
|
82
|
-
|
81
|
+
list, hashes = list.partition{|arg| not Hash === arg}
|
82
|
+
hashes << opts unless opts.empty? # in which case it was not, in fact, opts
|
83
|
+
|
84
|
+
names_and_defaults = hashes.inject({}){|h,h2| h.update h2}
|
83
85
|
|
84
86
|
raise ArgumentError,
|
85
87
|
"cannot specify both 'default' keyword and 'default' block" if
|
@@ -87,6 +89,10 @@ class Object
|
|
87
89
|
|
88
90
|
default ||= block
|
89
91
|
|
92
|
+
# force list and names_and_defaults.keys to strings
|
93
|
+
list = list.map{|t| "#{ t }"}
|
94
|
+
names_and_defaults = Hash[ *names_and_defaults.to_a.map{|k,v| ["#{ k }", v]}.flatten ]
|
95
|
+
|
90
96
|
list.each{|name| names_and_defaults[name] = default}
|
91
97
|
|
92
98
|
names = list + (names_and_defaults.keys - list)
|
@@ -103,14 +109,10 @@ class Object
|
|
103
109
|
|
104
110
|
names_and_hooks = names.inject({}){|h, name| h.update name => hooks}
|
105
111
|
|
106
|
-
{
|
107
|
-
'names' => names,
|
112
|
+
ret = {
|
108
113
|
'names_and_defaults' => names_and_defaults,
|
109
114
|
'names_and_hooks' => names_and_hooks,
|
110
|
-
|
111
|
-
#'pre' => pre, 'post' => post, 'validate' => validate, 'munge' => munge, 'cast' => cast,
|
112
|
-
'default' => default,
|
113
|
-
}.update hooks
|
115
|
+
}
|
114
116
|
#--}}}
|
115
117
|
end
|
116
118
|
def __trait_instance_method_list
|
@@ -477,7 +479,7 @@ class Module
|
|
477
479
|
return nil
|
478
480
|
end
|
479
481
|
else
|
480
|
-
@#{ name }
|
482
|
+
defined? @#{ name } and @#{ name }
|
481
483
|
end
|
482
484
|
end
|
483
485
|
end
|
@@ -502,8 +504,11 @@ class Module
|
|
502
504
|
hook_types = %w( pre munge cast type ducktype validate post )
|
503
505
|
|
504
506
|
#{ klass }::__trait_search_path.each do |obj|
|
507
|
+
|
505
508
|
break if hooks.values_at(*hook_types).compact.size == hook_types.size
|
509
|
+
|
506
510
|
hook_types.each{|ht| hooks[ht] ||= obj.#{ hooks }['#{ name }'][ht]}
|
511
|
+
|
507
512
|
end
|
508
513
|
|
509
514
|
pre_hook, munge_hook, cast_hook, type_hook, ducktype_hook, validate_hook, post_hook =
|
@@ -662,3 +667,21 @@ class Module
|
|
662
667
|
end
|
663
668
|
#--}}}
|
664
669
|
end
|
670
|
+
|
671
|
+
module TraitInit
|
672
|
+
#--{{{
|
673
|
+
def trait_init opts = {}
|
674
|
+
#--{{{
|
675
|
+
opts.each do |k,v|
|
676
|
+
k = "#{ k }"
|
677
|
+
if respond_to? k
|
678
|
+
send k, v
|
679
|
+
else
|
680
|
+
raise ArgumentError, "invalid trait -- #{ self.class }##{ k }"
|
681
|
+
end
|
682
|
+
end
|
683
|
+
#--}}}
|
684
|
+
end
|
685
|
+
alias_method "traitinit", "trait_init"
|
686
|
+
#--}}}
|
687
|
+
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: traits
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.
|
7
|
-
date: 2005-
|
6
|
+
version: 0.9.0
|
7
|
+
date: 2005-12-29 00:00:00.000000 -07:00
|
8
8
|
summary: traits
|
9
9
|
require_paths:
|
10
10
|
- lib
|
@@ -30,7 +30,7 @@ authors:
|
|
30
30
|
- Ara T. Howard
|
31
31
|
files:
|
32
32
|
- lib/traits.rb
|
33
|
-
- lib/traits-0.
|
33
|
+
- lib/traits-0.9.0.rb
|
34
34
|
test_files: []
|
35
35
|
rdoc_options: []
|
36
36
|
extra_rdoc_files: []
|