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.
@@ -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: []