Module Cluster
http://rubygems.org/gems/module-cluster
Description
Adds methods for defining module clusters using #included, #extended, #append_features, and #extend_object.
Summary
Provides methods for clustering modules so that when the main module is included other modules are also included or extended, either before or after the main module. There are currently three variants: cluster, cascade, cascade to class. Cluster causes the next module to be affected. Cascade causes all subsequent modules to be affected. Cascade to class causes the first including/extending class to be affected, but not any modules prior to it (although the effects will cascade through those unaffected modules).
Install
- sudo gem install module-cluster
Usage
Simply:
module SomeModule
extend ::ModuleCluster
end
Definition methods accept modules as arguments.
For example:
module SomeModule
extend ::ModuleCluster
include_also_includes( SomeOtherModule )
end
Additionally, all methods accept a block that returns one or more modules; the modules will be added after any modules specified in the parameters:
module SomeModule
extend ::ModuleCluster
include_also_includes( SomeOtherModule ) do
AnotherModule
end
end
Blocks can be used to return dynamically-determined modules at runtime.
module SomeModule
extend ::ModuleCluster
include_or_extend_cascades_prepend_extends do
method_that_returns_one_or_more_modules
end
end
Block methods can be used for nesting declarations, for instance to apply cascades only after first module/class:
prepend_module_include do |class_or_module|
class_or_module.include_or_extend_cascades_prepend_extends do
method_that_returns_one_or_more_modules
end
end
Calls to the various functions are cumulative and stack in the order called. This permits multiple calls, whether subsequently or otherwise.
Methods
Cluster methods:
- include_also_includes
- include_also_extends
- include_also_includes_and_extends
- extend_also_includes
- extend_also_extends
- extend_also_includes_and_extends
- include_prepends_includes
- include_prepends_extends
- include_prepends_includes_and_extends
- extend_prepends_includes
- extend_prepends_extends
- extend_prepends_includes_and_extends
- include_or_extend_also_includes
- include_or_extend_also_extends
- include_or_extend_also_includes_and_extends
- include_or_extend_prepends_includes
- include_or_extend_prepends_extends
- include_or_extend_prepends_includes_and_extends
Module cluster methods:
- module_include_also_includes
- module_include_also_extends
- module_include_also_includes_and_extends
- module_extend_also_includes
- module_extend_also_extends
- module_extend_also_includes_and_extends
- module_include_prepends_includes
- module_include_prepends_extends
- module_include_prepends_includes_and_extends
- module_extend_prepends_includes
- module_extend_prepends_extends
- module_extend_prepends_includes_and_extends
- module_include_or_extend_also_includes
- module_include_or_extend_also_extends
- module_include_or_extend_also_includes_and_extends
- module_include_or_extend_prepends_includes
- module_include_or_extend_prepends_extends
- module_include_or_extend_prepends_includes_and_extends
Class cluster methods:
- class_include_also_includes
- class_include_also_extends
- class_include_also_includes_and_extends
- class_extend_also_includes
- class_extend_also_extends
- class_extend_also_includes_and_extends
- class_include_prepends_includes
- class_include_prepends_extends
- class_include_prepends_includes_and_extends
- class_extend_prepends_includes
- class_extend_prepends_extends
- class_extend_prepends_includes_and_extends
- class_include_or_extend_also_includes
- class_include_or_extend_also_extends
- class_include_or_extend_also_includes_and_extends
- class_include_or_extend_prepends_includes
- class_include_or_extend_prepends_extends
- class_include_or_extend_prepends_includes_and_extends
Instance cluster methods:
- instance_extend_also_extends
- instance_extend_prepends_extends
Module or instance cluster methods:
- module_include_or_extend_or_instance_extend_also_includes_or_extends
- module_include_or_extend_or_instance_extend_also_extends
- module_include_or_instance_extend_also_includes_or_extends
- module_include_or_instance_extend_also_extends
- module_or_instance_extend_also_extends
- module_include_or_extend_or_instance_extend_prepends_includes_or_extends
- module_include_or_instance_extend_prepends_includes_or_extends
- module_include_or_extend_or_instance_extend_prepends_extends
- module_include_or_instance_extend_prepends_extends
- module_or_instance_extend_prepends_extends
Class or module cluster methods:
- module_or_class_include_also_includes
- module_or_class_include_also_extends
- module_or_class_include_also_includes_and_extends
- module_or_class_extend_also_includes
- module_or_class_extend_also_extends
- module_or_class_extend_also_includes_and_extends
- module_or_class_include_prepends_includes
- module_or_class_include_prepends_extends
- module_or_class_include_prepends_includes_and_extends
- module_or_class_extend_prepends_includes
- module_or_class_extend_prepends_extends
- module_or_class_extend_prepends_includes_and_extends
- module_or_class_include_or_extend_also_includes
- module_or_class_include_or_extend_also_extends
- module_or_class_include_or_extend_also_includes_and_extends
- module_or_class_include_or_extend_prepends_includes
- module_or_class_include_or_extend_prepends_extends
- module_or_class_include_or_extend_prepends_includes_and_extends
Class or module or instance cluster methods:
- module_include_or_extend_or_instance_extend_also_includes_or_extends
- module_include_or_extend_or_instance_extend_also_extends
- module_include_or_instance_extend_also_includes_or_extends
- module_include_or_instance_extend_also_extends
- module_or_instance_extend_also_extends
- module_include_or_extend_or_instance_extend_prepends_includes_or_extends
- module_include_or_instance_extend_prepends_includes_or_extends
- module_include_or_extend_or_instance_extend_prepends_extends
- module_include_or_instance_extend_prepends_extends
- module_or_instance_extend_prepends_extends
Class or instance cluster methods:
- class_include_or_extend_or_instance_extend_also_includes_or_extends
- class_include_or_extend_or_instance_extend_also_extends
- class_include_or_instance_extend_also_includes_or_extends
- class_include_or_instance_extend_also_extends
- class_or_instance_extend_also_extends
- class_include_or_extend_or_instance_extend_prepends_includes_or_extends
- class_include_or_instance_extend_prepends_includes_or_extends
- class_include_or_extend_or_instance_extend_prepends_extends
- class_include_or_instance_extend_prepends_extends
- class_or_instance_extend_prepends_extends
Cascade methods (cascades to modules and classes):
- include_cascades_includes
- include_cascades_extends
- include_cascades_includes_and_extends
- extend_cascades_includes
- extend_cascades_extends
- extend_cascades_includes_and_extends
- include_cascades_prepend_includes
- include_cascades_prepend_extends
- include_cascades_prepend_includes_and_extends
- extend_cascades_prepend_includes
- extend_cascades_prepend_extends
- extend_cascades_prepend_includes_and_extends
- include_or_extend_cascades_includes
- include_or_extend_cascades_extends
- include_or_extend_cascades_includes_and_extends
- include_or_extend_cascades_prepend_includes
- include_or_extend_cascades_prepend_extends
- include_or_extend_cascades_prepend_includes_and_extends
Cascade to class methods (does not cascade to modules):
- include_cascades_includes_to_class
- include_cascades_extends_to_class
- include_cascades_includes_and_extends_to_class
- extend_cascades_includes_to_class
- extend_cascades_extends_to_class
- extend_cascades_includes_and_extends_to_class
- include_cascades_to_class_prepend_includes
- include_cascades_to_class_prepend_extends
- include_cascades_to_class_prepend_includes_and_extends
- extend_cascades_to_class_prepend_includes
- extend_cascades_to_class_prepend_extends
- extend_cascades_to_class_prepend_includes_and_extends
- include_or_extend_cascades_includes_to_class
- include_or_extend_cascades_extends_to_class
- include_or_extend_cascades_includes_and_extends_to_class
- include_or_extend_cascades_to_class_prepend_includes
- include_or_extend_cascades_to_class_prepend_extends
- include_or_extend_cascades_to_class_prepend_includes_and_extends
Cascade to module methods (does not cascade to classes):
- include_cascades_includes_to_module
- include_cascades_extends_to_module
- include_cascades_includes_and_extends_to_module
- extend_cascades_includes_to_module
- extend_cascades_extends_to_module
- extend_cascades_includes_and_extends_to_module
- include_cascades_to_module_prepend_includes
- include_cascades_to_module_prepend_extends
- include_cascades_to_module_prepend_includes_and_extends
- extend_cascades_to_module_prepend_includes
- extend_cascades_to_module_prepend_extends
- extend_cascades_to_module_prepend_includes_and_extends
- include_or_extend_cascades_includes_to_module
- include_or_extend_cascades_extends_to_module
- include_or_extend_cascades_includes_and_extends_to_module
- include_or_extend_cascades_to_module_prepend_includes
- include_or_extend_cascades_to_module_prepend_extends
- include_or_extend_cascades_to_module_prepend_includes_and_extends
Module block methods:
- module_include
- module_extend
- module_include_or_extend
- prepend_module_include
- prepend_module_extend
prepend_module_include_or_extend
cascading_module_include
cascading_module_extend
cascading_module_include_or_extend
cascading_prepend_module_include
cascading_prepend_module_extend
cascading_prepend_module_include_or_extend
Class block methods:
- class_include
- class_extend
- class_include_or_extend
- prepend_class_include
- prepend_class_extend
prepend_class_include_or_extend
cascading_class_include
cascading_class_extend
cascading_class_include_or_extend
cascading_prepend_class_include
cascading_prepend_class_extend
cascading_prepend_class_include_or_extend
Instance block methods:
- instance_extend
- prepend_instance_extend
Class or module block methods:
- class_or_module_include
- class_or_module_extend
- class_or_module_include_or_extend
- prepend_class_or_module_include
- prepend_class_or_module_extend
prepend_class_or_module_include_or_extend
cascading_class_or_module_include
cascading_class_or_module_extend
cascading_class_or_module_include_or_extend
cascading_prepend_class_or_module_include
cascading_prepend_class_or_module_extend
cascading_prepend_class_or_module_include_or_extend
Module or instance block methods:
- module_or_instance_extend
- module_include_or_instance_extend
- module_include_or_extend_or_instance_extend
- prepend_module_or_instance_extend
- prepend_module_include_or_instance_extend
- prepend_module_include_or_extend_or_instance_extend
Class or instance block methods:
- class_or_instance_extend
- class_include_or_instance_extend
- class_include_or_extend_or_instance_extend
- prepend_class_or_instance_extend
- prepend_class_include_or_instance_extend
- prepend_class_include_or_extend_or_instance_extend
Class or module or instance block methods:
- class_or_module_or_instance_extend
- class_or_module_include_or_instance_extend
- class_or_module_include_or_extend_or_instance_extend
- prepend_class_or_module_or_instance_extend
- prepend_class_or_module_include_or_instance_extend
- prepend_class_or_module_include_or_extend_or_instance_extend
Suspend methods:
- suspend_any_hooks
- suspend_any_include_hooks
- suspend_any_extend_hooks
- suspend_include_hooks
- suspend_extend_hooks
- suspend_prepend_include_hooks
suspend_prepend_extend_hooks
hooks_suspended?
all_hooks_suspended?
all_include_hooks_suspended?
all_extend_hooks_suspended?
include_hooks_suspended?
extend_hooks_suspended?
prepend_include_hooks_suspended?
prepend_extend_hooks_suspended?
resume_any_hooks
resume_any_include_hooks
resume_any_extend_hooks
resume_include_hooks
resume_extend_hooks
resume_prepend_include_hooks
resume_prepend_extend_hooks
Suspend for block methods:
- without_any_hooks
- without_any_include_hooks
- without_any_extend_hooks
- without_include_hooks
- without_extend_hooks
- without_prepend_include_hooks
- without_prepend_extend_hooks
License
(The MIT License)
Copyright (c) 2011 Asher
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.