traits 0.8.1 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,12 +1,14 @@
1
1
  $__TRAIT_DEBUG__ = ENV['__TRAIT_DEBUG__'] || ENV['TRAIT_DEBUG'] || ENV['DEBUG']
2
- $__TRAIT_VERSION__ = "0.8.1"
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, hashes = [ args ].flatten.partition{|arg| not Hash === arg}
71
- opts = hashes.inject({}){|accum,h| accum.update h}
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
- names_and_defaults = opts
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
- 'hooks' => hooks,
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
@@ -1,12 +1,14 @@
1
1
  $__TRAIT_DEBUG__ = ENV['__TRAIT_DEBUG__'] || ENV['TRAIT_DEBUG'] || ENV['DEBUG']
2
- $__TRAIT_VERSION__ = "0.8.1"
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, hashes = [ args ].flatten.partition{|arg| not Hash === arg}
71
- opts = hashes.inject({}){|accum,h| accum.update h}
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
- names_and_defaults = opts
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
- 'hooks' => hooks,
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.8.1
7
- date: 2005-11-11 00:00:00.000000 -07:00
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.8.1.rb
33
+ - lib/traits-0.9.0.rb
34
34
  test_files: []
35
35
  rdoc_options: []
36
36
  extra_rdoc_files: []