Module: Extended_Include
- Defined in:
- lib/extended_include.rb
Overview
Extended_Include - Deals with some of the finer details of the extend-on-included idiom for adding both class and instance methods on module import.
Based on these posts:
-
stackoverflow.com/questions/15905270/can-you-extend-self-included
-
www.kappacs.com/2014/ruby-sub-classes-inheritance-include-extend/
and hundreds of other posts about the ::included extend ClassMethods hack.
The Extended_Include module is a back-end support module. See the Module module extensions for the user interface.
Version 0.0.2, 2014-04-18
Constant Summary collapse
- VERSION =
"0.0.2"
Class Method Summary collapse
-
.add_includes(base, *modules) ⇒ Object
Include additional modules.
-
.class_methods_for(base) ⇒ Object
Return a module’s class method list.
-
.include_class_methods(base, *modules, &block) ⇒ Object
Include a module’s class methods when included.
-
.includes_for(base) ⇒ Object
Return a module’s extended_include list.
Instance Method Summary collapse
-
#included(base) ⇒ Object
The #included method extended to other modules’ ::included method.
Class Method Details
.add_includes(base, *modules) ⇒ Object
Include additional modules.
29 30 31 32 33 34 35 36 37 38 |
# File 'lib/extended_include.rb', line 29 def self.add_includes (base, *modules) (@include_list[base] ||= []).concat modules base.class_exec do # Note that we reverse here to counter ::include's # last-to-first behavior in order to achieve first-to-last # behavior. include *modules.reverse extend Extended_Include end end |
.class_methods_for(base) ⇒ Object
Return a module’s class method list.
41 42 43 44 |
# File 'lib/extended_include.rb', line 41 def self.class_methods_for (base) (@class_methods[base] ||= []).uniq! @class_methods[base].reverse end |
.include_class_methods(base, *modules, &block) ⇒ Object
Include a module’s class methods when included.
47 48 49 50 51 |
# File 'lib/extended_include.rb', line 47 def self.include_class_methods (base, *modules, &block) (@class_methods[base] ||= []).concat modules @class_methods[base].push Module.new(&block) if block base.class_exec { extend Extended_Include } end |
.includes_for(base) ⇒ Object
Return a module’s extended_include list.
54 55 56 57 |
# File 'lib/extended_include.rb', line 54 def self.includes_for (base) (@include_list[base] ||= []).uniq! @include_list[base] end |
Instance Method Details
#included(base) ⇒ Object
The #included method extended to other modules’ ::included method.
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/extended_include.rb', line 60 def included (base) Extended_Include.includes_for(self).each do |mod| mod.included base if mod.respond_to?(:included) && (!base.respond_to?(:superclass) || !base.superclass.include?(mod)) end # Note that we reverse here to counter ::extend's # last-to-first behavior in order to achieve first-to-last # behavior. sources = Extended_Include.class_methods_for self base.class_exec { extend *sources.reverse } unless sources.empty? super base rescue nil end |