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:

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

License:

  • Public Domain

Constant Summary collapse

VERSION =
"0.0.2"

Class Method Summary collapse

Instance Method Summary collapse

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