module-cluster 1.0.3 → 1.1.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/README.md +106 -6
- data/README.rdoc +182 -0
- data/lib/module-cluster.rb +8 -0
- data/lib/module-cluster/ModuleCluster.rb +100 -12
- data/lib/module-cluster/ModuleCluster/ExtendSupport.rb +76 -4
- data/lib/module-cluster/ModuleCluster/IncludeExtendSupport.rb +84 -20
- data/lib/module-cluster/ModuleCluster/IncludeSupport.rb +75 -4
- data/lib/module-cluster/ModuleCluster/_private_/IncludeExtendSupport.rb +56 -0
- data/lib/module-cluster/_private_/ModuleCluster.rb +3 -4
- data/spec/ModuleCluster_spec.rb +2289 -16
- metadata +5 -4
data/README.md
CHANGED
@@ -8,7 +8,17 @@ Adds methods for defining module clusters using #included and #extended.
|
|
8
8
|
|
9
9
|
# Summary #
|
10
10
|
|
11
|
-
Provides
|
11
|
+
Provides:
|
12
|
+
|
13
|
+
* :define_module_included
|
14
|
+
* :define_module_extended
|
15
|
+
* :define_module_cluster
|
16
|
+
* :define_module_included_cascades
|
17
|
+
* :define_module_extended_cascades
|
18
|
+
* :define_module_cluster_cascades
|
19
|
+
* :define_module_included_cascades_to_class
|
20
|
+
* :define_module_extended_cascades_to_class
|
21
|
+
* :define_module_cluster_cascades_to_class
|
12
22
|
|
13
23
|
# Install #
|
14
24
|
|
@@ -24,6 +34,16 @@ module SomeModule
|
|
24
34
|
end
|
25
35
|
```
|
26
36
|
|
37
|
+
## The Basic Idea ##
|
38
|
+
|
39
|
+
We use blocks to define cascading module includes/extends. This automates calls to super (so we don't forget) and puts self.included/self.extended support into a module so that local overriding is still possible.
|
40
|
+
|
41
|
+
The block provides arrays to hold includes/extends. If two arrays [ includes, extends ] are returned by the block, they will be used. Otherwise the arrays passed in by parameters will be used. This means, due to how Ruby handles references, that *if you set one of the parameter arrays to a new array you have to return both arrays* or your changes won't be added.
|
42
|
+
|
43
|
+
Calls to define_module_... functions are cumulative, permitting multiple calls (whether subsequently or otherwise). This is particularly useful for configuring including/extending modules from the included/extended module (and so on - nested blocks permit this sort of determination indefinitely).
|
44
|
+
|
45
|
+
## define_module_included ##
|
46
|
+
|
27
47
|
To cause modules to be included when this module is included:
|
28
48
|
|
29
49
|
```ruby
|
@@ -44,7 +64,9 @@ module SomeModule
|
|
44
64
|
end
|
45
65
|
```
|
46
66
|
|
47
|
-
|
67
|
+
## define_module_extended ##
|
68
|
+
|
69
|
+
To cause modules to be included when this module is extended:
|
48
70
|
|
49
71
|
```ruby
|
50
72
|
module SomeModule
|
@@ -54,7 +76,7 @@ module SomeModule
|
|
54
76
|
end
|
55
77
|
```
|
56
78
|
|
57
|
-
or
|
79
|
+
or extended when this module is extended:
|
58
80
|
|
59
81
|
```ruby
|
60
82
|
module SomeModule
|
@@ -64,7 +86,9 @@ module SomeModule
|
|
64
86
|
end
|
65
87
|
```
|
66
88
|
|
67
|
-
|
89
|
+
## define_module_cluster ##
|
90
|
+
|
91
|
+
To cause modules to be included when this module is included or extended:
|
68
92
|
|
69
93
|
```ruby
|
70
94
|
module SomeModule
|
@@ -74,7 +98,7 @@ module SomeModule
|
|
74
98
|
end
|
75
99
|
```
|
76
100
|
|
77
|
-
or
|
101
|
+
or extended when this module is included or extended:
|
78
102
|
|
79
103
|
```ruby
|
80
104
|
module SomeModule
|
@@ -84,7 +108,83 @@ module SomeModule
|
|
84
108
|
end
|
85
109
|
```
|
86
110
|
|
87
|
-
|
111
|
+
## define_module_included_cascades ##
|
112
|
+
|
113
|
+
To cause modules to be included or extended when this module is used to include in a class or module.
|
114
|
+
|
115
|
+
```ruby
|
116
|
+
module SomeModule
|
117
|
+
define_module_included_cascades do |includes, extends|
|
118
|
+
includes.concat [ SomeOtherModule ]
|
119
|
+
extends.concat [ SomeOtherModule ]
|
120
|
+
end
|
121
|
+
end
|
122
|
+
```
|
123
|
+
|
124
|
+
## define_module_extended_cascades ##
|
125
|
+
|
126
|
+
To cause modules to be included or extended when this module is used to extend in a class or module:
|
127
|
+
|
128
|
+
```ruby
|
129
|
+
module SomeModule
|
130
|
+
define_module_extended_cascades do |includes, extends|
|
131
|
+
includes.concat [ SomeOtherModule ]
|
132
|
+
extends.concat [ SomeOtherModule ]
|
133
|
+
end
|
134
|
+
end
|
135
|
+
```
|
136
|
+
|
137
|
+
## define_module_cluster_cascades ##
|
138
|
+
|
139
|
+
To cause modules to be included or extended when this module is used to include or extend in a class or module:
|
140
|
+
|
141
|
+
```ruby
|
142
|
+
module SomeModule
|
143
|
+
define_module_cluster_cascades do |includes, extends|
|
144
|
+
includes.concat [ SomeOtherModule ]
|
145
|
+
extends.concat [ SomeOtherModule ]
|
146
|
+
end
|
147
|
+
end
|
148
|
+
```
|
149
|
+
|
150
|
+
## define_module_included_cascades_to_class ##
|
151
|
+
|
152
|
+
To cause modules to be included or extended when this module is used to include in a class (and not a module):
|
153
|
+
|
154
|
+
```ruby
|
155
|
+
module SomeModule
|
156
|
+
define_module_included_cascades_to_class do |includes, extends|
|
157
|
+
includes.concat [ SomeOtherModule ]
|
158
|
+
extends.concat [ SomeOtherModule ]
|
159
|
+
end
|
160
|
+
end
|
161
|
+
```
|
162
|
+
|
163
|
+
## define_module_extended_cascades_to_class ##
|
164
|
+
|
165
|
+
To cause modules to be included or extended when this module is used to extend in a class (and not a module):
|
166
|
+
|
167
|
+
```ruby
|
168
|
+
module SomeModule
|
169
|
+
define_module_extended_cascades_to_class do |includes, extends|
|
170
|
+
includes.concat [ SomeOtherModule ]
|
171
|
+
extends.concat [ SomeOtherModule ]
|
172
|
+
end
|
173
|
+
end
|
174
|
+
```
|
175
|
+
|
176
|
+
## define_module_cluster_cascades_to_class ##
|
177
|
+
|
178
|
+
To cause modules to be included or extended when this module is used to include or extend in a class (and not a module):
|
179
|
+
|
180
|
+
```ruby
|
181
|
+
module SomeModule
|
182
|
+
define_module_cluster_cascades_to_class do |includes, extends|
|
183
|
+
includes.concat [ SomeOtherModule ]
|
184
|
+
extends.concat [ SomeOtherModule ]
|
185
|
+
end
|
186
|
+
end
|
187
|
+
```
|
88
188
|
|
89
189
|
# License #
|
90
190
|
|
data/README.rdoc
CHANGED
@@ -0,0 +1,182 @@
|
|
1
|
+
== Module Cluster
|
2
|
+
|
3
|
+
http://rubygems.org/gems/module-cluster
|
4
|
+
|
5
|
+
== Description
|
6
|
+
|
7
|
+
Adds methods for defining module clusters using #included and #extended.
|
8
|
+
|
9
|
+
== Summary
|
10
|
+
|
11
|
+
Provides:
|
12
|
+
* :define_module_included
|
13
|
+
* :define_module_extended
|
14
|
+
* :define_module_cluster
|
15
|
+
* :define_module_included_cascades_to_class
|
16
|
+
* :define_module_extended_cascades_to_class
|
17
|
+
* :define_module_cluster_cascades_to_class
|
18
|
+
|
19
|
+
== Install
|
20
|
+
|
21
|
+
* sudo gem install module-cluster
|
22
|
+
|
23
|
+
== Usage
|
24
|
+
|
25
|
+
Simply:
|
26
|
+
|
27
|
+
module SomeModule
|
28
|
+
include ModuleCluster
|
29
|
+
end
|
30
|
+
|
31
|
+
=== The Basic Idea
|
32
|
+
|
33
|
+
We use blocks to define cascading module includes/extends. This automates calls to super (so we don't forget) and puts self.included/self.extended support into a module so that local overriding is still possible.
|
34
|
+
|
35
|
+
The block provides arrays with the current set of includes/extends to cascade for the module. If two arrays [ includes, extends ] are returned by the block, they will be used. Otherwise the arrays passed in by parameters will be used. This means, due to how Ruby handles references, that *if you set one of the parameter arrays to a new array you have to return both arrays* or your changes won't be added.
|
36
|
+
|
37
|
+
Calls to define_module_... functions are cumulative, permitting multiple calls (whether subsequently or otherwise). This is particularly useful for configuring including/extending modules from the included/extended module (and so on - nested blocks permit this sort of determination indefinitely).
|
38
|
+
|
39
|
+
=== define_module_included
|
40
|
+
|
41
|
+
To cause modules to be included when this module is included:
|
42
|
+
|
43
|
+
module SomeModule
|
44
|
+
define_module_included do |includes, extends|
|
45
|
+
includes.concat [ SomeOtherModule ]
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
or extended when this module is included:
|
50
|
+
|
51
|
+
module SomeModule
|
52
|
+
define_module_included do |includes, extends|
|
53
|
+
extends.concat [ SomeOtherModule ]
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
=== define_module_extended
|
58
|
+
|
59
|
+
To cause modules to be included when this module is extended:
|
60
|
+
|
61
|
+
module SomeModule
|
62
|
+
define_module_extended do |includes, extends|
|
63
|
+
includes.concat [ SomeOtherModule ]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
or extended when this module is extended:
|
68
|
+
|
69
|
+
module SomeModule
|
70
|
+
define_module_extended do |includes, extends|
|
71
|
+
extends.concat [ SomeOtherModule ]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
=== define_module_cluster
|
76
|
+
|
77
|
+
To cause modules to be included when this module is included or extended:
|
78
|
+
|
79
|
+
module SomeModule
|
80
|
+
define_module_cluster do |includes, extends|
|
81
|
+
includes.concat [ SomeOtherModule ]
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
or extended when this module is included or extended:
|
86
|
+
|
87
|
+
module SomeModule
|
88
|
+
define_module_cluster do |includes, extends|
|
89
|
+
extends.concat [ SomeOtherModule ]
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
=== define_module_included_cascades
|
94
|
+
|
95
|
+
To cause modules to be included or extended when this module is used to include in a class or module.
|
96
|
+
|
97
|
+
module SomeModule
|
98
|
+
define_module_included_cascades do |includes, extends|
|
99
|
+
includes.concat [ SomeOtherModule ]
|
100
|
+
extends.concat [ SomeOtherModule ]
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
=== define_module_extended_cascades
|
105
|
+
|
106
|
+
To cause modules to be included or extended when this module is used to extend in a class or module:
|
107
|
+
|
108
|
+
module SomeModule
|
109
|
+
define_module_extended_cascades do |includes, extends|
|
110
|
+
includes.concat [ SomeOtherModule ]
|
111
|
+
extends.concat [ SomeOtherModule ]
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
=== define_module_cluster_cascades
|
116
|
+
|
117
|
+
To cause modules to be included or extended when this module is used to include or extend in a class or module:
|
118
|
+
|
119
|
+
module SomeModule
|
120
|
+
define_module_cluster_cascades do |includes, extends|
|
121
|
+
includes.concat [ SomeOtherModule ]
|
122
|
+
extends.concat [ SomeOtherModule ]
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
=== define_module_included_cascades_to_class
|
127
|
+
|
128
|
+
To cause modules to be included or extended when this module is used to include a class (and not a module):
|
129
|
+
|
130
|
+
module SomeModule
|
131
|
+
define_module_included_cascades_to_class do |includes, extends|
|
132
|
+
includes.concat [ SomeOtherModule ]
|
133
|
+
extends.concat [ SomeOtherModule ]
|
134
|
+
end
|
135
|
+
end
|
136
|
+
|
137
|
+
=== define_module_extended_cascades_to_class
|
138
|
+
|
139
|
+
To cause modules to be included or extended when this module is used to extend a class (and not a module):
|
140
|
+
|
141
|
+
module SomeModule
|
142
|
+
define_module_extended_cascades_to_class do |includes, extends|
|
143
|
+
includes.concat [ SomeOtherModule ]
|
144
|
+
extends.concat [ SomeOtherModule ]
|
145
|
+
end
|
146
|
+
end
|
147
|
+
|
148
|
+
=== define_module_cluster_cascades_to_class
|
149
|
+
|
150
|
+
To cause modules to be included or extended when this module is used to include or extend a class (and not a module):
|
151
|
+
|
152
|
+
module SomeModule
|
153
|
+
define_module_cluster_cascades_to_class do |includes, extends|
|
154
|
+
includes.concat [ SomeOtherModule ]
|
155
|
+
extends.concat [ SomeOtherModule ]
|
156
|
+
end
|
157
|
+
end
|
158
|
+
|
159
|
+
== License
|
160
|
+
|
161
|
+
(The MIT License)
|
162
|
+
|
163
|
+
Copyright (c) 2011 Asher
|
164
|
+
|
165
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
166
|
+
a copy of this software and associated documentation files (the
|
167
|
+
'Software'), to deal in the Software without restriction, including
|
168
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
169
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
170
|
+
permit persons to whom the Software is furnished to do so, subject to
|
171
|
+
the following conditions:
|
172
|
+
|
173
|
+
The above copyright notice and this permission notice shall be
|
174
|
+
included in all copies or substantial portions of the Software.
|
175
|
+
|
176
|
+
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
177
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
178
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
179
|
+
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
180
|
+
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
181
|
+
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
182
|
+
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/lib/module-cluster.rb
CHANGED
@@ -6,8 +6,16 @@ module ModuleCluster
|
|
6
6
|
end
|
7
7
|
end
|
8
8
|
|
9
|
+
class Array::ClassOrModule < Array
|
10
|
+
end
|
11
|
+
class Array::CascadeToClass < Array
|
12
|
+
end
|
13
|
+
class Array::CascadeToClassOrModule < Array
|
14
|
+
end
|
15
|
+
|
9
16
|
require_relative 'module-cluster/ModuleCluster.rb'
|
10
17
|
require_relative 'module-cluster/_private_/ModuleCluster.rb'
|
11
18
|
require_relative 'module-cluster/ModuleCluster/IncludeExtendSupport.rb'
|
19
|
+
require_relative 'module-cluster/ModuleCluster/_private_/IncludeExtendSupport.rb'
|
12
20
|
require_relative 'module-cluster/ModuleCluster/IncludeSupport.rb'
|
13
21
|
require_relative 'module-cluster/ModuleCluster/ExtendSupport.rb'
|
@@ -1,26 +1,26 @@
|
|
1
1
|
|
2
2
|
module ModuleCluster
|
3
3
|
|
4
|
-
|
4
|
+
############################
|
5
5
|
# define_module_included #
|
6
|
-
|
6
|
+
############################
|
7
7
|
|
8
|
-
def define_module_included( &
|
9
|
-
inclusion_array, extension_array = yield_for_includes_extends(
|
10
|
-
ModuleCluster::IncludeSupport.
|
11
|
-
ModuleCluster::IncludeSupport.
|
8
|
+
def define_module_included( & include_extend_block )
|
9
|
+
inclusion_array, extension_array = yield_for_includes_extends( Array::ClassOrModule.new, Array::ClassOrModule.new, include_extend_block )
|
10
|
+
ModuleCluster::IncludeSupport.add_includes_for_class_or_module( self, inclusion_array )
|
11
|
+
ModuleCluster::IncludeSupport.add_extends_for_class_or_module( self, extension_array )
|
12
12
|
extend ModuleCluster::IncludeSupport
|
13
13
|
return self
|
14
14
|
end
|
15
15
|
|
16
|
-
|
16
|
+
############################
|
17
17
|
# define_module_extended #
|
18
|
-
|
18
|
+
############################
|
19
19
|
|
20
|
-
def define_module_extended( &
|
21
|
-
inclusion_array, extension_array = yield_for_includes_extends(
|
22
|
-
ModuleCluster::ExtendSupport.
|
23
|
-
ModuleCluster::ExtendSupport.
|
20
|
+
def define_module_extended( & include_extend_block )
|
21
|
+
inclusion_array, extension_array = yield_for_includes_extends( Array::ClassOrModule.new, Array::ClassOrModule.new, include_extend_block )
|
22
|
+
ModuleCluster::ExtendSupport.add_includes_for_class_or_module( self, inclusion_array )
|
23
|
+
ModuleCluster::ExtendSupport.add_extends_for_class_or_module( self, extension_array )
|
24
24
|
extend ModuleCluster::ExtendSupport
|
25
25
|
return self
|
26
26
|
end
|
@@ -35,4 +35,92 @@ module ModuleCluster
|
|
35
35
|
return self
|
36
36
|
end
|
37
37
|
|
38
|
+
#####################################
|
39
|
+
# define_module_included_cascades #
|
40
|
+
#####################################
|
41
|
+
|
42
|
+
def define_module_included_cascades( & include_extend_block )
|
43
|
+
# any time we are included or extended in a module we want to add cascading extends:
|
44
|
+
# * to the module cascading includes
|
45
|
+
# any time we are included in a class we want to add cascading extends
|
46
|
+
# * to the class
|
47
|
+
inclusion_array, extension_array = yield_for_includes_extends( Array::CascadeToClassOrModule.new, Array::CascadeToClassOrModule.new, include_extend_block )
|
48
|
+
ModuleCluster::IncludeSupport.add_cascading_includes_for_class_or_module( self, inclusion_array )
|
49
|
+
ModuleCluster::IncludeSupport.add_cascading_extends_for_class_or_module( self, extension_array )
|
50
|
+
extend ModuleCluster::IncludeSupport
|
51
|
+
return inclusion_array, extension_array
|
52
|
+
end
|
53
|
+
|
54
|
+
#####################################
|
55
|
+
# define_module_extended_cascades #
|
56
|
+
#####################################
|
57
|
+
|
58
|
+
def define_module_extended_cascades( & include_extend_block )
|
59
|
+
# any time we are included or extended in a module we want to add cascading extends:
|
60
|
+
# * to the module cascading extends
|
61
|
+
# any time we are extended in a class we want to add cascading extends
|
62
|
+
# * to the class
|
63
|
+
inclusion_array, extension_array = yield_for_includes_extends( Array::CascadeToClassOrModule.new, Array::CascadeToClassOrModule.new, include_extend_block )
|
64
|
+
ModuleCluster::ExtendSupport.add_cascading_includes_for_class_or_module( self, inclusion_array )
|
65
|
+
ModuleCluster::ExtendSupport.add_cascading_extends_for_class_or_module( self, extension_array )
|
66
|
+
extend ModuleCluster::ExtendSupport
|
67
|
+
return inclusion_array, extension_array
|
68
|
+
end
|
69
|
+
|
70
|
+
####################################
|
71
|
+
# define_module_cluster_cascades #
|
72
|
+
####################################
|
73
|
+
|
74
|
+
def define_module_cluster_cascades( & include_extend_block )
|
75
|
+
include_includes, include_extends = define_module_included_cascades( & include_extend_block )
|
76
|
+
extend_includes, extend_extends = define_module_extended_cascades( & include_extend_block )
|
77
|
+
ModuleCluster::IncludeSupport.set_as_cluster( self, include_includes, include_extends )
|
78
|
+
ModuleCluster::ExtendSupport.set_as_cluster( self, extend_includes, extend_extends )
|
79
|
+
return self
|
80
|
+
end
|
81
|
+
|
82
|
+
##############################################
|
83
|
+
# define_module_included_cascades_to_class #
|
84
|
+
##############################################
|
85
|
+
|
86
|
+
def define_module_included_cascades_to_class( & include_extend_block )
|
87
|
+
# any time we are included or extended in a module we want to add cascading extends:
|
88
|
+
# * to the module cascading includes
|
89
|
+
# any time we are included in a class we want to add cascading extends
|
90
|
+
# * to the class
|
91
|
+
inclusion_array, extension_array = yield_for_includes_extends( Array::CascadeToClass.new, Array::CascadeToClass.new, include_extend_block )
|
92
|
+
ModuleCluster::IncludeSupport.add_cascading_includes_for_class( self, inclusion_array )
|
93
|
+
ModuleCluster::IncludeSupport.add_cascading_extends_for_class( self, extension_array )
|
94
|
+
extend ModuleCluster::IncludeSupport
|
95
|
+
return inclusion_array, extension_array
|
96
|
+
end
|
97
|
+
|
98
|
+
##############################################
|
99
|
+
# define_module_extended_cascades_to_class #
|
100
|
+
##############################################
|
101
|
+
|
102
|
+
def define_module_extended_cascades_to_class( & include_extend_block )
|
103
|
+
# any time we are included or extended in a module we want to add cascading extends:
|
104
|
+
# * to the module cascading extends
|
105
|
+
# any time we are extended in a class we want to add cascading extends
|
106
|
+
# * to the class
|
107
|
+
inclusion_array, extension_array = yield_for_includes_extends( Array::CascadeToClass.new, Array::CascadeToClass.new, include_extend_block )
|
108
|
+
ModuleCluster::ExtendSupport.add_cascading_includes_for_class( self, inclusion_array )
|
109
|
+
ModuleCluster::ExtendSupport.add_cascading_extends_for_class( self, extension_array )
|
110
|
+
extend ModuleCluster::ExtendSupport
|
111
|
+
return inclusion_array, extension_array
|
112
|
+
end
|
113
|
+
|
114
|
+
#############################################
|
115
|
+
# define_module_cluster_cascades_to_class #
|
116
|
+
#############################################
|
117
|
+
|
118
|
+
def define_module_cluster_cascades_to_class( & include_extend_block )
|
119
|
+
include_includes, include_extends = define_module_included_cascades_to_class( & include_extend_block )
|
120
|
+
extend_includes, extend_extends = define_module_extended_cascades_to_class( & include_extend_block )
|
121
|
+
ModuleCluster::IncludeSupport.set_as_cluster( self, include_includes, include_extends )
|
122
|
+
ModuleCluster::ExtendSupport.set_as_cluster( self, extend_includes, extend_extends )
|
123
|
+
return self
|
124
|
+
end
|
125
|
+
|
38
126
|
end
|