traits 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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: []
|