striuct 0.3.2 → 0.3.3

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.
Files changed (65) hide show
  1. data/History.rdoc +12 -0
  2. data/LICENSE +2 -2
  3. data/Manifest.txt +34 -24
  4. data/README.md +34 -5
  5. data/example/README.rb +20 -1
  6. data/lib/striuct/classmethods/README.md +5 -0
  7. data/lib/striuct/classmethods/adjustment.rb +5 -3
  8. data/lib/striuct/classmethods/default.rb +2 -2
  9. data/lib/striuct/classmethods/enum.rb +3 -3
  10. data/lib/striuct/classmethods/inner.rb +28 -49
  11. data/lib/striuct/classmethods/named.rb +22 -2
  12. data/lib/striuct/classmethods/object.rb +35 -5
  13. data/lib/striuct/instancemethods/README.md +5 -0
  14. data/lib/striuct/instancemethods/assign.rb +1 -1
  15. data/lib/striuct/instancemethods/cast.rb +35 -0
  16. data/lib/striuct/instancemethods/compare.rb +4 -5
  17. data/lib/striuct/instancemethods/delegate_class_methods.rb +12 -4
  18. data/lib/striuct/instancemethods/hashy.rb +0 -11
  19. data/lib/striuct/instancemethods/keyvalidatable.rb +14 -0
  20. data/lib/striuct/instancemethods/lock.rb +15 -4
  21. data/lib/striuct/instancemethods/object.rb +11 -6
  22. data/lib/striuct/instancemethods/requirements.rb +2 -2
  23. data/lib/striuct/instancemethods/subscript.rb +1 -1
  24. data/lib/striuct/instancemethods/values.rb +1 -8
  25. data/lib/striuct/singleton_class.rb +9 -36
  26. data/lib/striuct/version.rb +1 -1
  27. data/striuct.gemspec +4 -4
  28. data/test/{test_striuct_define.rb → test_striuct-singleton_class-define.rb} +1 -1
  29. data/test/test_striuct-subclass-class-cloning.rb +21 -0
  30. data/test/{test_striuct_subclass_classlock.rb → test_striuct-subclass-class-close.rb} +2 -2
  31. data/test/{test_striuct_subclass_classmethods.rb → test_striuct-subclass-class-constructor.rb} +15 -20
  32. data/test/test_striuct-subclass-class-freeze.rb +36 -0
  33. data/test/{test_striuct_subclass_inheritable.rb → test_striuct-subclass-class-inheritable.rb} +1 -1
  34. data/test/test_striuct-subclass-class-macro.rb +13 -0
  35. data/test/{test_striuct_subclass_safetynaming.rb → test_striuct-subclass-class-safety_naming.rb} +1 -1
  36. data/test/test_striuct-subclass-class-validation.rb +26 -0
  37. data/test/{test_striuct_subclass_alias_member.rb → test_striuct-subclass-feature-alias_member.rb} +1 -1
  38. data/test/{test_striuct_subclass_to_struct.rb → test_striuct-subclass-feature-to_struct.rb} +1 -1
  39. data/test/test_striuct-subclass-instance-accessor.rb +137 -0
  40. data/test/{test_striuct_subclass_adjuster.rb → test_striuct-subclass-instance-adjuster.rb} +28 -28
  41. data/test/{test_striuct_subclass_assign.rb → test_striuct-subclass-instance-assign.rb} +1 -1
  42. data/test/test_striuct-subclass-instance-basic.rb +32 -0
  43. data/test/test_striuct-subclass-instance-cloning.rb +23 -0
  44. data/test/test_striuct-subclass-instance-compare.rb +52 -0
  45. data/test/{test_striuct_subclass_default_value.rb → test_striuct-subclass-instance-default_value.rb} +2 -2
  46. data/test/test_striuct-subclass-instance-enum.rb +93 -0
  47. data/test/{test_striuct_subclass_freeze.rb → test_striuct-subclass-instance-freeze.rb} +1 -1
  48. data/test/{test_striuct_subclass_hashlike.rb → test_striuct-subclass-instance-hashlike.rb} +1 -1
  49. data/test/test_striuct-subclass-instance-keyvalidatable.rb +25 -0
  50. data/test/{test_striuct_subclass_lock.rb → test_striuct-subclass-instance-lock.rb} +1 -1
  51. data/test/test_striuct-subclass-instance-to_s_family.rb +25 -0
  52. data/test/{test_striuct_subclass_functional_condition.rb → test_striuct-subclass-instance-validation_functional_condition.rb} +0 -0
  53. data/test/{test_striuct_subclass_inference.rb → test_striuct-subclass-instance-validation_inference.rb} +1 -1
  54. data/test/{test_striuct_subclass_specific_conditions.rb → test_striuct-subclass-instance-validation_specific_conditions.rb} +1 -1
  55. data/test/{test_striuct_subclass_getter_validation.rb → test_striuct-subclass-instance-validation_with_getter.rb} +1 -1
  56. data/test/test_striuct-subclass-instance_names.rb +18 -0
  57. data/test/test_striuct-version.rb +11 -0
  58. metadata +68 -50
  59. data/lib/striuct/instancemethods/singleton_class.rb +0 -22
  60. data/lib/striuct/instancemethods/to_struct.rb +0 -12
  61. data/test/test_striuct.rb +0 -24
  62. data/test/test_striuct_subclass_cloning.rb +0 -36
  63. data/test/test_striuct_subclass_for_pairs.rb +0 -20
  64. data/test/test_striuct_subclass_instance.rb +0 -289
  65. data/test/test_striuct_version.rb +0 -9
data/History.rdoc CHANGED
@@ -1,3 +1,15 @@
1
+ === 0.3.3 2012-9-7
2
+
3
+ * modify:
4
+ * SubClass#to_s
5
+ * SubClass#inspect
6
+
7
+ * fix:
8
+ * SubClass.freeze
9
+
10
+ * add:
11
+ * compatibility with keyvalidatable-API
12
+
1
13
  === 0.3.2 2012-9-4
2
14
 
3
15
  * fix:
data/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
- (The MIT License)
1
+ (The MIT X11 License)
2
2
 
3
- Copyright (c) 2011 Kenichi Kamiya
3
+ Copyright (c) 2011 Kenichi Kamiya
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining
6
6
  a copy of this software and associated documentation files (the
data/Manifest.txt CHANGED
@@ -13,6 +13,7 @@ lib/striuct/version.rb
13
13
  lib/striuct/specificcontainer.rb
14
14
  lib/striuct/singleton_class.rb
15
15
 
16
+ lib/striuct/classmethods/README.md
16
17
  lib/striuct/classmethods.rb
17
18
  lib/striuct/classmethods/requirements.rb
18
19
  lib/striuct/classmethods/inner.rb
@@ -28,15 +29,16 @@ lib/striuct/classmethods/macro.rb
28
29
  lib/striuct/classmethods/prevent_conflicts.rb
29
30
  lib/striuct/classmethods/validation.rb
30
31
 
32
+ lib/striuct/instancemethods/README.md
31
33
  lib/striuct/instancemethods.rb
32
34
  lib/striuct/instancemethods/requirements.rb
33
- lib/striuct/instancemethods/singleton_class.rb
34
35
  lib/striuct/instancemethods/delegate_class_methods.rb
36
+ lib/striuct/instancemethods/keyvalidatable.rb
35
37
  lib/striuct/instancemethods/inner.rb
36
38
  lib/striuct/instancemethods/object.rb
37
39
  lib/striuct/instancemethods/compare.rb
38
40
  lib/striuct/instancemethods/values.rb
39
- lib/striuct/instancemethods/to_struct.rb
41
+ lib/striuct/instancemethods/cast.rb
40
42
  lib/striuct/instancemethods/default.rb
41
43
  lib/striuct/instancemethods/enum.rb
42
44
  lib/striuct/instancemethods/hashy.rb
@@ -47,28 +49,36 @@ lib/striuct/instancemethods/validation.rb
47
49
  lib/striuct/instancemethods/safety.rb
48
50
 
49
51
  test/helper.rb
50
- test/test_striuct.rb
51
- test/test_striuct_define.rb
52
- test/test_striuct_subclass_adjuster
53
- test/test_striuct_subclass_alias_member.rb
54
- test/test_striuct_subclass_assign.rb
55
- test/test_striuct_subclass_classlock.rb
56
- test/test_striuct_subclass_classmethods.rb
57
- test/test_striuct_subclass_cloning.rb
58
- test/test_striuct_subclass_default_value.rb
59
- test/test_striuct_subclass_for_pairs.rb
60
- test/test_striuct_subclass_freeze.rb
61
- test/test_striuct_subclass_functional_condition.rb
62
- test/test_striuct_subclass_getter_validation.rb
63
- test/test_striuct_subclass_hashlike.rb
64
- test/test_striuct_subclass_inference.rb
65
- test/test_striuct_subclass_inheritable.rb
66
- test/test_striuct_subclass_instance.rb
67
- test/test_striuct_subclass_lock.rb
68
- test/test_striuct_subclass_safetynaming.rb
69
- test/test_striuct_subclass_specific_conditions.rb
70
- test/test_striuct_subclass_to_struct.rb
71
- test/test_striuct_version.rb
52
+ test/test_striuct-version.rb
53
+ test/test_striuct-singleton_class-define.rb
54
+ test/test_striuct-subclass-class-cloning.rb
55
+ test/test_striuct-subclass-class-close.rb
56
+ test/test_striuct-subclass-class-freeze.rb
57
+ test/test_striuct-subclass-class-constructor.rb
58
+ test/test_striuct-subclass-class-inheritable.rb
59
+ test/test_striuct-subclass-class-macro.rb
60
+ test/test_striuct-subclass-class-safety_naming.rb
61
+ test/test_striuct-subclass-class-validation.rb
62
+ test/test_striuct-subclass-feature-alias_member.rb
63
+ test/test_striuct-subclass-feature-to_struct.rb
64
+ test/test_striuct-subclass-instance-accessor.rb
65
+ test/test_striuct-subclass-instance-adjuster.rb
66
+ test/test_striuct-subclass-instance-assign.rb
67
+ test/test_striuct-subclass-instance-basic.rb
68
+ test/test_striuct-subclass-instance-cloning.rb
69
+ test/test_striuct-subclass-instance-compare.rb
70
+ test/test_striuct-subclass-instance-default_value.rb
71
+ test/test_striuct-subclass-instance-enum.rb
72
+ test/test_striuct-subclass-instance-freeze.rb
73
+ test/test_striuct-subclass-instance-hashlike.rb
74
+ test/test_striuct-subclass-instance-keyvalidatable.rb
75
+ test/test_striuct-subclass-instance-lock.rb
76
+ test/test_striuct-subclass-instance-to_s_family.rb
77
+ test/test_striuct-subclass-instance-validation_functional_condition.rb
78
+ test/test_striuct-subclass-instance-validation_inference.rb
79
+ test/test_striuct-subclass-instance-validation_specific_conditions.rb
80
+ test/test_striuct-subclass-instance-validation_with_getter.rb
81
+ test/test_striuct-subclass-instance_names.rb
72
82
 
73
83
  example/README.rb
74
84
  example/example1.rb
data/README.md CHANGED
@@ -21,7 +21,7 @@ Features
21
21
  * Default value
22
22
  * Member aliasing
23
23
  * Inheritable
24
- * Hndling between nil <-> unassigned
24
+ * Handling between nil <-> unassigned
25
25
  * More flendly API for Hash
26
26
 
27
27
  ### Onepoint
@@ -32,7 +32,7 @@ Features
32
32
  Usage
33
33
  -----
34
34
 
35
- ### Overview
35
+ ### Overview - Case 1
36
36
 
37
37
  ```ruby
38
38
  require 'striuct'
@@ -59,6 +59,36 @@ john.id #=> 1
59
59
  ken = User[name: 'ken'] # Construct from hash
60
60
  ken.id #=> 2
61
61
  ```
62
+ ### Overview - Case 2
63
+
64
+ ```ruby
65
+ class Foo < Striuct
66
+ member :foo
67
+ member :bar, Numeric, inference: true
68
+ member :with_adjuster, Integer, &->v{Integer v}
69
+ end
70
+
71
+ foo = Foo.new
72
+
73
+ # nil <-> unaasigned
74
+ foo.foo #=> nil
75
+ foo.assign?(:foo) #=> false
76
+ foo.foo = nil
77
+ foo.assign?(:foo) #=> true
78
+
79
+ # Lock to a member
80
+ foo.lock(:foo)
81
+ foo.foo = nil #=> error
82
+
83
+ # Inference Validation
84
+ foo.bar = 1.2 #=> pass # memorize 1.2's class is Float
85
+ foo.bar = 1 #=> error # 1 is not Float
86
+
87
+ # With adjuster
88
+ foo.with_adjuster = '5'
89
+ foo.with_adjuster #=> 5 # Casted via adjuster
90
+ ```
91
+
62
92
 
63
93
  ### More Examples
64
94
 
@@ -71,7 +101,7 @@ Requirements
71
101
 
72
102
  * Ruby 1.9.2 or later [MRI/YARV, Rubinius](http://travis-ci.org/#!/kachick/striuct)
73
103
  * validation - 0.0.3
74
- * keyvalidatable - 0.0.2
104
+ * keyvalidatable - 0.0.3
75
105
 
76
106
  Install
77
107
  -------
@@ -88,12 +118,11 @@ Link
88
118
  * [issues](https://github.com/kachick/striuct/issues)
89
119
  * [CI](http://travis-ci.org/#!/kachick/striuct)
90
120
  * [gem](https://rubygems.org/gems/striuct)
91
- * [gem+](http://metagem.info/gems/striuct)
92
121
 
93
122
  License
94
123
  --------
95
124
 
96
- The MIT X License
125
+ The MIT X11 License
97
126
  Copyright (c) 2011 Kenichi Kamiya
98
127
  See the file LICENSE for further details.
99
128
 
data/example/README.rb CHANGED
@@ -22,4 +22,23 @@ p john[:name] #=> 'john'
22
22
  #~ p john.name = '' #=> error
23
23
  p john.id #=> 1
24
24
  ken = User[name: 'ken'] # Construct from hash
25
- p ken.id #=> 2
25
+ p ken.id #=> 2
26
+
27
+ class Foo < Striuct
28
+ member :foo
29
+ member :bar, Numeric, inference: true
30
+ member :with_adjuster, Integer, &->v{Integer v}
31
+ end
32
+
33
+ foo = Foo.new
34
+ p foo.foo #=> nil
35
+ p foo.assign?(:foo) #=> false
36
+ foo.foo = nil
37
+ p foo.assign?(:foo) #=> true
38
+ foo.lock(:foo)
39
+ #~ foo.foo = nil #=> error
40
+ foo.bar = 1.2
41
+ #~ foo.bar = 1 #=> error
42
+
43
+ foo.with_adjuster = '5'
44
+ p foo.with_adjuster
@@ -0,0 +1,5 @@
1
+ For developer
2
+ ==============
3
+
4
+ * This dir's tree is diveded under roles/features.
5
+ Not under CONSTANT names.
@@ -13,15 +13,17 @@ class Striuct; module ClassMethods
13
13
 
14
14
  # @param [Symbol, String] name
15
15
  def adjuster_for(name)
16
- _adjuster_for autonym_for(name)
16
+ autonym = autonym_for name
17
+
18
+ _adjuster_for autonym
17
19
  end
18
20
 
19
21
  alias_method :flavor_for, :adjuster_for
20
22
 
21
23
  private
22
24
 
23
- def _adjuster_for(name)
24
- @adjusters[name]
25
+ def _adjuster_for(autonym)
26
+ @adjusters[autonym]
25
27
  end
26
28
 
27
29
  alias_method :_flavor_for, :_adjuster_for
@@ -19,8 +19,8 @@ class Striuct; module ClassMethods
19
19
 
20
20
  private
21
21
 
22
- def _default_for(name)
23
- @defaults[name]
22
+ def _default_for(autonym)
23
+ @defaults[autonym]
24
24
  end
25
25
 
26
26
  # @endgroup
@@ -9,7 +9,7 @@ class Striuct; module ClassMethods
9
9
  def each_autonym
10
10
  return to_enum(__callee__) unless block_given?
11
11
 
12
- _autonyms.each{|autonym|yield autonym}
12
+ @autonyms.each{|autonym|yield autonym}
13
13
  self
14
14
  end
15
15
 
@@ -24,7 +24,7 @@ class Striuct; module ClassMethods
24
24
  def each_index
25
25
  return to_enum(__callee__) unless block_given?
26
26
 
27
- _autonyms.each_index{|index|yield index}
27
+ @autonyms.each_index{|index|yield index}
28
28
  self
29
29
  end
30
30
 
@@ -36,7 +36,7 @@ class Striuct; module ClassMethods
36
36
  def each_autonym_with_index
37
37
  return to_enum(__callee__) unless block_given?
38
38
 
39
- _autonyms.each_with_index{|autonym, index|yield autonym, index}
39
+ @autonyms.each_with_index{|autonym, index|yield autonym, index}
40
40
  self
41
41
  end
42
42
 
@@ -12,69 +12,49 @@ class Striuct; module ClassMethods
12
12
  nil
13
13
  end
14
14
 
15
- def _autonyms
16
- @autonyms
15
+ def _remove_inference(autonym)
16
+ @inferences.delete autonym
17
17
  end
18
18
 
19
- alias_method :_names, :_autonyms
20
-
21
- def _alias_member(aliased, original)
22
- @aliases[aliased] = original
23
- end
24
-
25
- def _autonym_for(aliased)
26
- @aliases[aliased]
27
- end
28
-
29
- alias_method :_original_for, :_autonym_for
30
-
31
- def _aliases_for(original)
32
- @aliases.group_by{|aliased, org|org}[original]
33
- end
34
-
35
- def _remove_inference(name)
36
- @inferences.delete name
37
- end
38
-
39
- def _mark_setter_validation(name)
40
- @setter_validations[name] = true
19
+ def _mark_setter_validation(autonym)
20
+ @setter_validations[autonym] = true
41
21
  end
42
22
 
43
- def _mark_getter_validation(name)
44
- @getter_validations[name] = true
23
+ def _mark_getter_validation(autonym)
24
+ @getter_validations[autonym] = true
45
25
  end
46
26
 
47
- def _mark_inference(name)
48
- @inferences[name] = true
27
+ def _mark_inference(autonym)
28
+ @inferences[autonym] = true
49
29
  end
50
30
 
51
- def _set_adjuster(name, adjuster)
52
- @adjusters[name] = adjuster
31
+ def _set_adjuster(autonym, adjuster)
32
+ @adjusters[autonym] = adjuster
53
33
  end
54
34
 
55
- def _set_condition(name, condition)
56
- @conditions[name] = condition
35
+ def _set_condition(autonym, condition)
36
+ @conditions[autonym] = condition
57
37
  end
58
38
 
59
- def _set_default_value(name, value)
60
- @defaults[name] = value
39
+ def _set_default_value(autonym, value)
40
+ @defaults[autonym] = value
61
41
  end
62
42
 
63
- def __setter__!(name, condition, &adjuster)
64
- __set_condition__! name, condition unless Validation::Condition::ANYTHING.equal? condition
65
- __set_adjuster__! name, &adjuster if block_given?
43
+ def __setter__!(autonym, condition, &adjuster)
44
+ __set_condition__! autonym, condition unless Validation::Condition::ANYTHING.equal? condition
45
+ __set_adjuster__! autonym, &adjuster if block_given?
66
46
 
67
- define_method :"#{name}=" do |value|
68
- __set__ name, value
47
+ define_method :"#{autonym}=" do |value|
48
+ __set__ autonym, value
69
49
  end
70
50
 
71
51
  nil
72
52
 
73
53
  end
74
54
 
75
- def __set_condition__!(name, condition)
55
+ def __set_condition__!(autonym, condition)
76
56
  if ::Validation.conditionable? condition
77
- _set_condition name, condition
57
+ _set_condition autonym, condition
78
58
  else
79
59
  raise TypeError, 'wrong object for condition'
80
60
  end
@@ -82,9 +62,9 @@ class Striuct; module ClassMethods
82
62
  nil
83
63
  end
84
64
 
85
- def __set_adjuster__!(name, &adjuster)
65
+ def __set_adjuster__!(autonym, &adjuster)
86
66
  if ::Validation.adjustable? adjuster
87
- _set_adjuster name, adjuster
67
+ _set_adjuster autonym, adjuster
88
68
  else
89
69
  raise ArgumentError, "wrong number of block argument #{arity} for 1"
90
70
  end
@@ -92,18 +72,17 @@ class Striuct; module ClassMethods
92
72
  nil
93
73
  end
94
74
 
95
- def __found_family__!(_caller, name, our)
75
+ def __found_family__!(_caller, autonym, our)
96
76
  family = our.class
97
77
 
98
- raise 'must not happen' unless name.instance_of?(Symbol) and
99
- inference?(name) and
100
- member?(name) and
78
+ raise 'must not happen' unless inference?(autonym) and
79
+ autonym?(autonym) and
101
80
  _caller.instance_of?(self)
102
81
 
103
82
  raise ArgumentError unless Validation.conditionable? family
104
83
 
105
- _set_condition name, family
106
- _remove_inference name
84
+ _set_condition autonym, family
85
+ _remove_inference autonym
107
86
 
108
87
  nil
109
88
  end
@@ -39,7 +39,7 @@ class Striuct; module ClassMethods
39
39
  def autonym_for(name)
40
40
  name = keyable_for name
41
41
 
42
- if _autonyms.include? name
42
+ if @autonyms.include? name
43
43
  name
44
44
  else
45
45
  if autonym = _autonym_for(name)
@@ -61,13 +61,15 @@ class Striuct; module ClassMethods
61
61
  alias_method :original?, :autonym?
62
62
 
63
63
  # @param [Symbol, String] name
64
- def aliased?(name)
64
+ def alias?(name)
65
65
  name = keyable_for name
66
66
  raise NameError unless member? name
67
67
 
68
68
  @aliases.has_key? name
69
69
  end
70
70
 
71
+ alias_method :aliased?, :alias?
72
+
71
73
  # @param [Symbol, String] autonym
72
74
  def has_aliases?(autonym)
73
75
  raise NameError unless autonym? autonym
@@ -88,6 +90,24 @@ class Striuct; module ClassMethods
88
90
  def aliases
89
91
  @aliases.dup
90
92
  end
93
+
94
+ private
95
+
96
+ def _autonyms
97
+ @autonyms
98
+ end
99
+
100
+ def _alias_member(aliased, autonym)
101
+ @aliases[aliased] = autonym
102
+ end
103
+
104
+ def _autonym_for(aliased)
105
+ @aliases[aliased]
106
+ end
107
+
108
+ def _aliases_for(autonym)
109
+ @aliases.group_by{|aliased, an|an}.fetch(autonym)
110
+ end
91
111
 
92
112
  # @endgroup
93
113
 
@@ -4,7 +4,7 @@ class Striuct; module ClassMethods
4
4
 
5
5
  # @return [self]
6
6
  def freeze
7
- __stores__.each(&:freeze)
7
+ __floating_attributes__.each(&:freeze)
8
8
  super
9
9
  end
10
10
 
@@ -12,12 +12,42 @@ class Striuct; module ClassMethods
12
12
  def dup
13
13
  r = super
14
14
  @autonyms, @adjusters, @defaults, @aliases,
15
- @setter_validations, @getter_validations =
16
- *[@autonyms, @adjusters, @defaults, @aliases,
17
- @setter_validations, @getter_validations].map(&:dup)
18
- @conditions, @inferences = @conditions.dup, @inferences.dup
15
+ @setter_validations, @getter_validations,
16
+ @conditions, @inferences =
17
+ *__floating_attributes__.map(&:dup)
19
18
  r
20
19
  end
20
+
21
+ private
22
+
23
+ def inherited(subclass)
24
+ autonyms = @autonyms.dup
25
+ attributes = [@conditions, @adjusters, @defaults, @inferences, @aliases, @setter_validations, @getter_validations].map(&:dup)
26
+ protect_level = @protect_level
27
+
28
+ subclass.class_eval do
29
+ original_inherited subclass
30
+
31
+ @autonyms = autonyms
32
+ @conditions, @adjusters, @defaults, @inferences, @aliases, @setter_validations, @getter_validations = *attributes
33
+ @protect_level = protect_level
34
+ end
35
+ end
36
+
37
+ def initialize_copy(original)
38
+ ret = super original
39
+ @autonyms, @adjusters, @defaults, @aliases,
40
+ @setter_validations, @getter_validations,
41
+ @conditions, @inferences =
42
+ *__floating_attributes__.map(&:dup)
43
+ ret
44
+ end
45
+
46
+ def __floating_attributes__
47
+ [@autonyms, @adjusters, @defaults, @aliases,
48
+ @setter_validations, @getter_validations,
49
+ @conditions, @inferences]
50
+ end
21
51
 
22
52
  # @endgroup
23
53
 
@@ -0,0 +1,5 @@
1
+ For developer
2
+ ==============
3
+
4
+ * This dir's tree is diveded under roles/features.
5
+ Not under CONSTANT names.
@@ -23,7 +23,7 @@ class Striuct; module InstanceMethods
23
23
 
24
24
  # all members aren't assigned
25
25
  def empty?
26
- autonyms.none?{|autonym|assign? autonym}
26
+ _autonyms.none?{|autonym|assign? autonym}
27
27
  end
28
28
 
29
29
  # @endgroup
@@ -0,0 +1,35 @@
1
+ class Striuct; module InstanceMethods
2
+
3
+ # @group Cast
4
+
5
+ # @return [self]
6
+ def to_striuct
7
+ self
8
+ end
9
+
10
+ # @return [Struct]
11
+ def to_struct
12
+ self.class.to_struct_class.new(*values)
13
+ end
14
+
15
+ # @return [Hash]
16
+ def to_h(reject_no_assign=false)
17
+ return @db.dup if reject_no_assign
18
+
19
+ {}.tap {|h|
20
+ each_pair do |autonym, val|
21
+ h[autonym] = val
22
+ end
23
+ }
24
+ end
25
+
26
+ # @return [Array]
27
+ def values
28
+ each_value.to_a
29
+ end
30
+
31
+ alias_method :to_a, :values
32
+
33
+ # @endgroup
34
+
35
+ end; end
@@ -4,13 +4,13 @@ class Striuct; module InstanceMethods
4
4
 
5
5
  # @return [Boolean]
6
6
  def ==(other)
7
- __compare_all__ other, :==
7
+ __compare_all__? other, :==
8
8
  end
9
9
 
10
10
  alias_method :===, :==
11
11
 
12
12
  def eql?(other)
13
- __compare_all__ other, :eql?
13
+ __compare_all__? other, :eql?
14
14
  end
15
15
 
16
16
  # @return [Integer]
@@ -21,9 +21,8 @@ class Striuct; module InstanceMethods
21
21
  private
22
22
 
23
23
  # @param [Symbol] method
24
- def __compare_all__(other, method)
25
- instance_of?(other.class) && \
26
- each_pair.all?{|k, v|v.__send__ method, other[k]}
24
+ def __compare_all__?(other, method)
25
+ other.instance_of?(self.class) && each_pair.all?{|k, v|v.__send__ method, other[k]}
27
26
  end
28
27
 
29
28
  # @endgroup
@@ -1,9 +1,16 @@
1
+ require 'forwardable'
2
+
1
3
  class Striuct; module InstanceMethods
4
+
5
+ extend Forwardable
6
+
7
+ # Forwardable has public/protected class_macro
8
+ private_class_method(*Forwardable.instance_methods)
2
9
 
3
10
  # @group Delegate Class Methods
4
11
 
5
- # @see self.class.*args
6
- delegate_class_methods(
12
+ def_delegators :'self.class',
13
+ :_autonyms,
7
14
  :keyable_for, :autonym_for, :aliases_for,
8
15
  :validator_for, :condition_for,
9
16
  :adjuster_for, :flavor_for,
@@ -13,8 +20,9 @@ class Striuct; module InstanceMethods
13
20
  :restrict?, :has_validator?, :has_condition?,
14
21
  :safety_getter?, :safety_reader?, :safety_setter?, :safty_writer?, :inference?,
15
22
  :has_default?, :default_for, :has_adjuster?, :has_flavor?
16
- )
17
23
 
18
- # @endgroup
24
+ private :_autonyms
19
25
 
26
+ # @endgroup
27
+
20
28
  end; end
@@ -5,17 +5,6 @@ class Striuct; module InstanceMethods
5
5
  # @group Like Ruby's Hash
6
6
 
7
7
  alias_method :fetch, :[]
8
-
9
- # @return [Hash]
10
- def to_h(reject_no_assign=false)
11
- return @db.dup if reject_no_assign
12
-
13
- {}.tap {|h|
14
- each_pair do |autonym, val|
15
- h[autonym] = val
16
- end
17
- }
18
- end
19
8
 
20
9
  def has_value?(value)
21
10
  @db.has_value? value
@@ -0,0 +1,14 @@
1
+ require 'keyvalidatable'
2
+
3
+ class Striuct; module InstanceMethods
4
+
5
+ extend Forwardable
6
+ include KeyValidatable
7
+
8
+ KeyValidatable.instance_methods.each do |feature|
9
+ if specific_feature = feature.to_s.sub!('members'){'autonyms'}
10
+ def_delegator :self, feature, specific_feature.to_sym
11
+ end
12
+ end
13
+
14
+ end; end