module-cluster 1.4.8 → 2.0.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 +127 -337
- data/lib/module-cluster.rb +1 -153
- data/lib/module/cluster.rb +341 -0
- data/lib/module/cluster/class_support.rb +22 -0
- data/lib/module/cluster/cluster.rb +10 -0
- data/lib/module/cluster/cluster/cluster_interface.rb +550 -0
- data/lib/module/cluster/exception/module_not_in_stack.rb +26 -0
- data/lib/module/cluster/instance_controller.rb +14 -0
- data/lib/module/cluster/instance_controller/hook_controller.rb +33 -0
- data/lib/module/cluster/instance_controller/hook_controller/chain_proxy.rb +511 -0
- data/lib/module/cluster/instance_controller/hook_controller/hook_controller_interface.rb +830 -0
- data/lib/module/cluster/instance_controller/instance_controller_interface.rb +269 -0
- data/lib/module/cluster/instance_controller/multiple_hook_controller_proxy.rb +359 -0
- data/lib/module/cluster/instance_controller/multiple_hook_controller_proxy/chain_proxy.rb +442 -0
- data/lib/module/cluster/module_support.rb +67 -0
- data/lib/module/namespaces.rb +13 -0
- data/lib/module/requires.rb +32 -0
- data/spec/module/cluster/cluster_spec.rb +473 -0
- data/spec/module/cluster/instance_controller/hook_controller_spec.rb +922 -0
- data/spec/module/cluster/instance_controller/multiple_hook_controller_proxy_spec.rb +1240 -0
- data/spec/module/cluster_spec.rb +1794 -0
- metadata +27 -98
- data/README.rdoc +0 -395
- data/lib/module-cluster/ModuleCluster.rb +0 -9
- data/lib/module-cluster/ModuleCluster/Define.rb +0 -12
- data/lib/module-cluster/ModuleCluster/Define/Block.rb +0 -9
- data/lib/module-cluster/ModuleCluster/Define/Block/CascadingClass.rb +0 -83
- data/lib/module-cluster/ModuleCluster/Define/Block/CascadingClassOrModule.rb +0 -70
- data/lib/module-cluster/ModuleCluster/Define/Block/CascadingModule.rb +0 -79
- data/lib/module-cluster/ModuleCluster/Define/Block/CascadingModuleOrSubclass.rb +0 -21
- data/lib/module-cluster/ModuleCluster/Define/Block/Class.rb +0 -77
- data/lib/module-cluster/ModuleCluster/Define/Block/ClassOrInstance.rb +0 -78
- data/lib/module-cluster/ModuleCluster/Define/Block/ClassOrModule.rb +0 -78
- data/lib/module-cluster/ModuleCluster/Define/Block/ClassOrModuleOrInstance.rb +0 -78
- data/lib/module-cluster/ModuleCluster/Define/Block/ClassOrModuleOrSubclass.rb +0 -36
- data/lib/module-cluster/ModuleCluster/Define/Block/ClassOrSubclass.rb +0 -29
- data/lib/module-cluster/ModuleCluster/Define/Block/Instance.rb +0 -45
- data/lib/module-cluster/ModuleCluster/Define/Block/Module.rb +0 -77
- data/lib/module-cluster/ModuleCluster/Define/Block/ModuleOrInstance.rb +0 -78
- data/lib/module-cluster/ModuleCluster/Define/Block/ModuleOrSubclass.rb +0 -29
- data/lib/module-cluster/ModuleCluster/Define/Block/Subclass.rb +0 -56
- data/lib/module-cluster/ModuleCluster/Define/ClassCluster.rb +0 -193
- data/lib/module-cluster/ModuleCluster/Define/ClassOrInstanceCluster.rb +0 -128
- data/lib/module-cluster/ModuleCluster/Define/Cluster.rb +0 -181
- data/lib/module-cluster/ModuleCluster/Define/ClusterCascades.rb +0 -185
- data/lib/module-cluster/ModuleCluster/Define/ClusterCascadesToClass.rb +0 -181
- data/lib/module-cluster/ModuleCluster/Define/ClusterCascadesToModule.rb +0 -181
- data/lib/module-cluster/ModuleCluster/Define/Deprecated.rb +0 -40
- data/lib/module-cluster/ModuleCluster/Define/InstanceCluster.rb +0 -45
- data/lib/module-cluster/ModuleCluster/Define/ModuleCluster.rb +0 -193
- data/lib/module-cluster/ModuleCluster/Define/ModuleOrClassCluster.rb +0 -209
- data/lib/module-cluster/ModuleCluster/Define/ModuleOrInstanceCluster.rb +0 -128
- data/lib/module-cluster/ModuleCluster/Define/Status.rb +0 -106
- data/lib/module-cluster/ModuleCluster/Suspend.rb +0 -7
- data/lib/module-cluster/ModuleCluster/Suspend/Hooks.rb +0 -315
- data/lib/module-cluster/ModuleCluster/Suspend/WithoutHooks.rb +0 -153
- data/lib/module-cluster/_private_/ModuleCluster/CascadeFeatures.rb +0 -77
- data/lib/module-cluster/_private_/ModuleCluster/CascadeFeatures/ClusterStack.rb +0 -44
- data/lib/module-cluster/_private_/ModuleCluster/CascadeFeatures/PerformCascades.rb +0 -292
- data/lib/module-cluster/_private_/ModuleCluster/CascadeFeatures/Subclass.rb +0 -24
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack.rb +0 -12
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/Block.rb +0 -9
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/Block/Class.rb +0 -36
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/Block/Inherited.rb +0 -20
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/Block/Instance.rb +0 -20
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/Block/Module.rb +0 -36
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/Block/Set.rb +0 -6
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/Extends.rb +0 -140
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/Includes.rb +0 -110
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/PrependsExtends.rb +0 -140
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/PrependsIncludes.rb +0 -110
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/Set.rb +0 -35
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/Set/MultiSetProxy.rb +0 -359
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/Status.rb +0 -55
- data/lib/module-cluster/_private_/ModuleCluster/ClusterStack/Suspend.rb +0 -199
- data/lib/module-cluster/_private_/ModuleCluster/ExtendForCascade.rb +0 -34
- data/spec/ModuleCluster/Define/Block/CascadingClassOrModule_spec.rb +0 -285
- data/spec/ModuleCluster/Define/Block/CascadingClass_spec.rb +0 -254
- data/spec/ModuleCluster/Define/Block/CascadingModuleOrSubclass_spec.rb +0 -56
- data/spec/ModuleCluster/Define/Block/CascadingModule_spec.rb +0 -278
- data/spec/ModuleCluster/Define/Block/ClassOrInstance_spec.rb +0 -230
- data/spec/ModuleCluster/Define/Block/ClassOrModuleOrInstance_spec.rb +0 -238
- data/spec/ModuleCluster/Define/Block/ClassOrModuleOrSubclass_spec.rb +0 -54
- data/spec/ModuleCluster/Define/Block/ClassOrModule_spec.rb +0 -231
- data/spec/ModuleCluster/Define/Block/ClassOrSubclass_spec.rb +0 -54
- data/spec/ModuleCluster/Define/Block/Class_spec.rb +0 -224
- data/spec/ModuleCluster/Define/Block/Instance_spec.rb +0 -78
- data/spec/ModuleCluster/Define/Block/ModuleOrInstance_spec.rb +0 -54
- data/spec/ModuleCluster/Define/Block/ModuleOrSubclass_spec.rb +0 -51
- data/spec/ModuleCluster/Define/Block/Module_spec.rb +0 -230
- data/spec/ModuleCluster/Define/Block/Subclass_spec.rb +0 -73
- data/spec/ModuleCluster/Define/Block_spec.rb +0 -18
- data/spec/ModuleCluster/Define/ClassCluster_spec.rb +0 -728
- data/spec/ModuleCluster/Define/ClassOrInstanceCluster_spec.rb +0 -576
- data/spec/ModuleCluster/Define/ClusterCascadesToClass_spec.rb +0 -659
- data/spec/ModuleCluster/Define/ClusterCascadesToModule_spec.rb +0 -678
- data/spec/ModuleCluster/Define/ClusterCascades_spec.rb +0 -644
- data/spec/ModuleCluster/Define/Cluster_spec.rb +0 -708
- data/spec/ModuleCluster/Define/InstanceCluster_spec.rb +0 -102
- data/spec/ModuleCluster/Define/ModuleCluster_spec.rb +0 -728
- data/spec/ModuleCluster/Define/ModuleOrClassCluster_spec.rb +0 -728
- data/spec/ModuleCluster/Define/ModuleOrInstanceCluster_spec.rb +0 -576
- data/spec/ModuleCluster/Suspend/Hooks_spec.rb +0 -573
- data/spec/ModuleCluster/Suspend/WithoutHooks_spec.rb +0 -559
- data/spec/ModuleCluster_spec.rb +0 -15
- data/spec/_private_/ModuleCluster/CascadeFeatures/PerformCascades_spec.rb +0 -386
- data/spec/_private_/ModuleCluster/ClusterStack/Set/MultiSetProxy_spec.rb +0 -419
- data/spec/_private_/ModuleCluster/ClusterStack/Suspend_spec.rb +0 -242
data/lib/module-cluster.rb
CHANGED
@@ -1,154 +1,2 @@
|
|
1
1
|
|
2
|
-
module
|
3
|
-
class ClusterStack
|
4
|
-
module Block
|
5
|
-
module Class
|
6
|
-
end
|
7
|
-
module Instance
|
8
|
-
end
|
9
|
-
module Module
|
10
|
-
end
|
11
|
-
module Inherited
|
12
|
-
end
|
13
|
-
end
|
14
|
-
module Status
|
15
|
-
end
|
16
|
-
module Suspend
|
17
|
-
end
|
18
|
-
end
|
19
|
-
module CascadeFeatures
|
20
|
-
module Subclass
|
21
|
-
end
|
22
|
-
module ClusterStack
|
23
|
-
end
|
24
|
-
module PerformCascades
|
25
|
-
end
|
26
|
-
end
|
27
|
-
module ExtendForCascade
|
28
|
-
module Subclass
|
29
|
-
end
|
30
|
-
end
|
31
|
-
module Define
|
32
|
-
module Block
|
33
|
-
module Class
|
34
|
-
end
|
35
|
-
module ClassOrModule
|
36
|
-
end
|
37
|
-
module ClassOrInstance
|
38
|
-
end
|
39
|
-
module ClassOrSubclass
|
40
|
-
end
|
41
|
-
module ClassOrModuleOrSubclass
|
42
|
-
end
|
43
|
-
module Instance
|
44
|
-
end
|
45
|
-
module Module
|
46
|
-
end
|
47
|
-
module ModuleOrInstance
|
48
|
-
end
|
49
|
-
module ModuleOrSubclass
|
50
|
-
end
|
51
|
-
module CascadingClass
|
52
|
-
end
|
53
|
-
module CascadingClassOrModule
|
54
|
-
end
|
55
|
-
module CascadingModule
|
56
|
-
end
|
57
|
-
module CascadingModuleOrSubclass
|
58
|
-
end
|
59
|
-
end
|
60
|
-
module ClusterStack
|
61
|
-
end
|
62
|
-
module Cluster
|
63
|
-
end
|
64
|
-
module ClassCluster
|
65
|
-
end
|
66
|
-
module ClassOrInstanceCluster
|
67
|
-
end
|
68
|
-
module ClusterCascades
|
69
|
-
end
|
70
|
-
module ClusterCascadesToClass
|
71
|
-
end
|
72
|
-
module ClusterCascadesToModule
|
73
|
-
end
|
74
|
-
module Deprecated
|
75
|
-
end
|
76
|
-
module InstanceCluster
|
77
|
-
end
|
78
|
-
module ::ModuleCluster
|
79
|
-
end
|
80
|
-
module ModuleOrClassCluster
|
81
|
-
end
|
82
|
-
module ModuleOrInstanceCluster
|
83
|
-
end
|
84
|
-
end
|
85
|
-
module Suspend
|
86
|
-
module Hooks
|
87
|
-
end
|
88
|
-
module WithoutHooks
|
89
|
-
end
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
|
94
|
-
require_relative 'module-cluster/_private_/ModuleCluster/CascadeFeatures/ClusterStack.rb'
|
95
|
-
require_relative 'module-cluster/_private_/ModuleCluster/CascadeFeatures/PerformCascades.rb'
|
96
|
-
require_relative 'module-cluster/_private_/ModuleCluster/CascadeFeatures/Subclass.rb'
|
97
|
-
require_relative 'module-cluster/_private_/ModuleCluster/CascadeFeatures.rb'
|
98
|
-
|
99
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ExtendForCascade.rb'
|
100
|
-
|
101
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/Set.rb'
|
102
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/Set/MultiSetProxy.rb'
|
103
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/Suspend.rb'
|
104
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/Status.rb'
|
105
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/Includes.rb'
|
106
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/Extends.rb'
|
107
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/PrependsIncludes.rb'
|
108
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/PrependsExtends.rb'
|
109
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/Block/Set.rb'
|
110
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/Block/Inherited.rb'
|
111
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/Block/Class.rb'
|
112
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/Block/Instance.rb'
|
113
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/Block/Module.rb'
|
114
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack/Block.rb'
|
115
|
-
require_relative 'module-cluster/_private_/ModuleCluster/ClusterStack.rb'
|
116
|
-
|
117
|
-
require_relative 'module-cluster/ModuleCluster/Suspend/Hooks.rb'
|
118
|
-
require_relative 'module-cluster/ModuleCluster/Suspend/WithoutHooks.rb'
|
119
|
-
require_relative 'module-cluster/ModuleCluster/Suspend.rb'
|
120
|
-
|
121
|
-
require_relative 'module-cluster/ModuleCluster/Define/Cluster.rb'
|
122
|
-
require_relative 'module-cluster/ModuleCluster/Define/ModuleCluster.rb'
|
123
|
-
require_relative 'module-cluster/ModuleCluster/Define/ClassCluster.rb'
|
124
|
-
require_relative 'module-cluster/ModuleCluster/Define/ModuleOrClassCluster.rb'
|
125
|
-
require_relative 'module-cluster/ModuleCluster/Define/ModuleOrInstanceCluster.rb'
|
126
|
-
require_relative 'module-cluster/ModuleCluster/Define/ClassOrInstanceCluster.rb'
|
127
|
-
require_relative 'module-cluster/ModuleCluster/Define/InstanceCluster.rb'
|
128
|
-
require_relative 'module-cluster/ModuleCluster/Define/ClusterCascades.rb'
|
129
|
-
require_relative 'module-cluster/ModuleCluster/Define/ClusterCascadesToClass.rb'
|
130
|
-
require_relative 'module-cluster/ModuleCluster/Define/ClusterCascadesToModule.rb'
|
131
|
-
|
132
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/Class.rb'
|
133
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/Instance.rb'
|
134
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/Module.rb'
|
135
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/ClassOrInstance.rb'
|
136
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/ClassOrModule.rb'
|
137
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/ModuleOrInstance.rb'
|
138
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/ClassOrModuleOrInstance.rb'
|
139
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/ClassOrModuleOrSubclass.rb'
|
140
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/Subclass.rb'
|
141
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/ModuleOrSubclass.rb'
|
142
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/ClassOrSubclass.rb'
|
143
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/CascadingClass.rb'
|
144
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/CascadingModule.rb'
|
145
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/CascadingClassOrModule.rb'
|
146
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block/CascadingModuleOrSubclass.rb'
|
147
|
-
require_relative 'module-cluster/ModuleCluster/Define/Block.rb'
|
148
|
-
|
149
|
-
require_relative 'module-cluster/ModuleCluster/Define/Deprecated.rb'
|
150
|
-
|
151
|
-
require_relative 'module-cluster/ModuleCluster/Define.rb'
|
152
|
-
|
153
|
-
require_relative 'module-cluster/ModuleCluster.rb'
|
154
|
-
|
2
|
+
require_relative 'module/cluster.rb'
|
@@ -0,0 +1,341 @@
|
|
1
|
+
|
2
|
+
# namespaces that have to be declared ahead of time for proper load order
|
3
|
+
require_relative './namespaces'
|
4
|
+
|
5
|
+
# source file requires
|
6
|
+
require_relative './requires.rb'
|
7
|
+
|
8
|
+
###
|
9
|
+
# Public interface to enable modules/classes with module-cluster capabilities.
|
10
|
+
#
|
11
|
+
module ::Module::Cluster
|
12
|
+
|
13
|
+
@clusters = { }
|
14
|
+
@instances = { }
|
15
|
+
|
16
|
+
###################
|
17
|
+
# self.extended #
|
18
|
+
###################
|
19
|
+
|
20
|
+
###
|
21
|
+
# Ensures that instance controller exists for extended instance
|
22
|
+
# and enables class or module support as appropriate.
|
23
|
+
#
|
24
|
+
def self.extended( instance )
|
25
|
+
|
26
|
+
case instance
|
27
|
+
when ::Class
|
28
|
+
instance.extend( ::Module::Cluster::ClassSupport )
|
29
|
+
when ::Module
|
30
|
+
instance.extend( ::Module::Cluster::ModuleSupport )
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
|
35
|
+
#############
|
36
|
+
# cluster #
|
37
|
+
#############
|
38
|
+
|
39
|
+
###
|
40
|
+
# Get cluster for name. Will create cluster if it does not already exist.
|
41
|
+
#
|
42
|
+
# @param name Name of cluster.
|
43
|
+
#
|
44
|
+
def cluster( name )
|
45
|
+
|
46
|
+
return ::Module::Cluster.cluster( self, name )
|
47
|
+
|
48
|
+
end
|
49
|
+
|
50
|
+
##################################################################################################
|
51
|
+
# private ######################################################################################
|
52
|
+
##################################################################################################
|
53
|
+
|
54
|
+
###
|
55
|
+
# These methods are not actually in private space but are internal methods for inter-object
|
56
|
+
# communications. They aren't intended for public interfacing.
|
57
|
+
#
|
58
|
+
|
59
|
+
##################
|
60
|
+
# self.cluster #
|
61
|
+
##################
|
62
|
+
|
63
|
+
###
|
64
|
+
# @private
|
65
|
+
#
|
66
|
+
# Return cluster for instance or create if necessary
|
67
|
+
#
|
68
|
+
# @param instance
|
69
|
+
# Instance for which cluster is being created.
|
70
|
+
#
|
71
|
+
# @param name
|
72
|
+
# Name of cluster for instance.
|
73
|
+
#
|
74
|
+
# @return [ModuleCluster::Cluster::Cluster] Cluster instance.
|
75
|
+
#
|
76
|
+
def self.cluster( instance, name )
|
77
|
+
|
78
|
+
unless instance_hash = @clusters[ instance ]
|
79
|
+
@clusters[ instance ] = instance_hash = { }
|
80
|
+
end
|
81
|
+
|
82
|
+
unless cluster_instance = instance_hash[ name ]
|
83
|
+
instance_hash[ name ] = cluster_instance = ::Module::Cluster::Cluster.new( instance, name )
|
84
|
+
end
|
85
|
+
|
86
|
+
return cluster_instance
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
##############################
|
91
|
+
# self.instance_controller #
|
92
|
+
##############################
|
93
|
+
|
94
|
+
###
|
95
|
+
# @private
|
96
|
+
#
|
97
|
+
# Return instance controller for instance or create if necessary
|
98
|
+
#
|
99
|
+
# @param instance
|
100
|
+
# Instance for which instance controller is being created.
|
101
|
+
#
|
102
|
+
# @return [ModuleCluster::Cluster::InstanceController] Instance Controller instance.
|
103
|
+
#
|
104
|
+
def self.instance_controller( instance )
|
105
|
+
|
106
|
+
unless instance_controller = @instances[ instance ]
|
107
|
+
@instances[ instance ] = instance_controller = self::InstanceController.new( instance )
|
108
|
+
end
|
109
|
+
|
110
|
+
return instance_controller
|
111
|
+
|
112
|
+
end
|
113
|
+
|
114
|
+
######################################
|
115
|
+
# self.hook_controller_for_context #
|
116
|
+
######################################
|
117
|
+
|
118
|
+
###
|
119
|
+
# @private
|
120
|
+
#
|
121
|
+
# Return instance controller for instance or create if necessary
|
122
|
+
#
|
123
|
+
# @param instance
|
124
|
+
# Instance for which Hook Controller is being returned.
|
125
|
+
#
|
126
|
+
# @param event_context
|
127
|
+
# Context for which event hooks are being processed.
|
128
|
+
#
|
129
|
+
# @return [ModuleCluster::Cluster::InstanceController::HookController] Hook Controller instance.
|
130
|
+
#
|
131
|
+
def self.hook_controller_for_context( instance, event_context )
|
132
|
+
|
133
|
+
hook_stack = nil
|
134
|
+
|
135
|
+
instance_controller = instance_controller( instance )
|
136
|
+
|
137
|
+
case event_context
|
138
|
+
|
139
|
+
when :before_include
|
140
|
+
|
141
|
+
hook_stack = instance_controller.before_include_controller
|
142
|
+
|
143
|
+
when :after_include
|
144
|
+
|
145
|
+
hook_stack = instance_controller.after_include_controller
|
146
|
+
|
147
|
+
when :before_extend
|
148
|
+
|
149
|
+
hook_stack = instance_controller.before_extend_controller
|
150
|
+
|
151
|
+
when :after_extend
|
152
|
+
|
153
|
+
hook_stack = instance_controller.after_extend_controller
|
154
|
+
|
155
|
+
when :subclass
|
156
|
+
|
157
|
+
hook_stack = instance_controller.subclass_controller
|
158
|
+
|
159
|
+
end
|
160
|
+
|
161
|
+
return hook_stack
|
162
|
+
|
163
|
+
end
|
164
|
+
|
165
|
+
##############################
|
166
|
+
# self.hook_cluster_events #
|
167
|
+
##############################
|
168
|
+
|
169
|
+
###
|
170
|
+
# @private
|
171
|
+
#
|
172
|
+
# Return instance controller for instance or create if necessary
|
173
|
+
#
|
174
|
+
# @param instance
|
175
|
+
# Module cluster enabled instance for which hooks are being activated.
|
176
|
+
#
|
177
|
+
# @param hooked_instance
|
178
|
+
# Iheriting instance for which events are being processed.
|
179
|
+
#
|
180
|
+
# @param event_context
|
181
|
+
# Context for which event hooks are being processed.
|
182
|
+
#
|
183
|
+
# @return [ModuleCluster::Cluster::InstanceController::HookController] Hook Controller instance.
|
184
|
+
#
|
185
|
+
def self.hook_cluster_events( instance, hooked_instance, event_context )
|
186
|
+
|
187
|
+
requires_module_cluster_enable = false
|
188
|
+
|
189
|
+
# Subclass hooks always cascade to the first subclass.
|
190
|
+
# If it should casade for each subclass that has to be declared explicitly and will be handled below.
|
191
|
+
unless event_context == :subclass
|
192
|
+
instance_controller = instance_controller( instance )
|
193
|
+
if instance_controller.instance_variable_defined?( :@subclass_controller )
|
194
|
+
hooked_instance_controller = instance_controller( hooked_instance )
|
195
|
+
hooked_instance_controller.subclass_controller.stack.concat( instance_controller.subclass_controller.stack )
|
196
|
+
requires_module_cluster_enable = true
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
hook_controller_for_context( instance, event_context ).stack.each do |this_frame|
|
201
|
+
|
202
|
+
cascade_controller = event_context
|
203
|
+
|
204
|
+
# test to see if this frame's cluster is disabled
|
205
|
+
unless cluster( instance, this_frame.cluster ).disabled?
|
206
|
+
|
207
|
+
should_cascade = false
|
208
|
+
should_perform_action = nil
|
209
|
+
|
210
|
+
# if we cascade we do that first - test to see if we should cascade into instance
|
211
|
+
if cascade_context = this_frame.cascades
|
212
|
+
|
213
|
+
if cascade_context.include?( :any )
|
214
|
+
|
215
|
+
should_cascade = true
|
216
|
+
should_perform_action = true
|
217
|
+
|
218
|
+
case hooked_instance
|
219
|
+
when ::Class
|
220
|
+
cascade_controller = :subclass
|
221
|
+
end
|
222
|
+
|
223
|
+
else
|
224
|
+
|
225
|
+
case hooked_instance
|
226
|
+
when ::Class
|
227
|
+
if event_context == :subclass
|
228
|
+
if cascade_context.include?( :subclass )
|
229
|
+
should_cascade = true
|
230
|
+
should_perform_action = true
|
231
|
+
end
|
232
|
+
else
|
233
|
+
has_subclass = cascade_context.include?( :subclass )
|
234
|
+
has_class = cascade_context.include?( :class )
|
235
|
+
if has_class and has_subclass
|
236
|
+
should_cascade = true
|
237
|
+
should_perform_action = true
|
238
|
+
cascade_controller = :subclass
|
239
|
+
elsif has_class
|
240
|
+
should_cascade = true
|
241
|
+
should_perform_action = true
|
242
|
+
elsif has_subclass
|
243
|
+
should_cascade = true
|
244
|
+
should_perform_action = false
|
245
|
+
cascade_controller = :subclass
|
246
|
+
end
|
247
|
+
end
|
248
|
+
when ::Module
|
249
|
+
if cascade_context.include?( :module )
|
250
|
+
should_cascade = true
|
251
|
+
should_perform_action = true
|
252
|
+
elsif cascade_context.include?( :class ) or cascade_context.include?( :subclass )
|
253
|
+
should_cascade = true
|
254
|
+
should_perform_action = false
|
255
|
+
end
|
256
|
+
end
|
257
|
+
|
258
|
+
end
|
259
|
+
|
260
|
+
if should_cascade
|
261
|
+
requires_module_cluster_enable = true
|
262
|
+
hook_controller_for_context( hooked_instance, cascade_controller ).stack.push( this_frame )
|
263
|
+
end
|
264
|
+
|
265
|
+
end
|
266
|
+
|
267
|
+
if cascade_context
|
268
|
+
|
269
|
+
# already handled
|
270
|
+
|
271
|
+
elsif match_context = this_frame.context
|
272
|
+
|
273
|
+
# if we have a context we test against instance to see if we match, then we perform action
|
274
|
+
case hooked_instance
|
275
|
+
when ::Class
|
276
|
+
if event_context == :subclass
|
277
|
+
if match_context.include?( :subclass )
|
278
|
+
should_perform_action = true
|
279
|
+
end
|
280
|
+
else
|
281
|
+
if match_context.include?( :class )
|
282
|
+
should_perform_action = true
|
283
|
+
end
|
284
|
+
end
|
285
|
+
when ::Module
|
286
|
+
if match_context.include?( :module )
|
287
|
+
should_perform_action = true
|
288
|
+
end
|
289
|
+
else
|
290
|
+
if match_context.include?( :instance )
|
291
|
+
should_perform_action = true
|
292
|
+
end
|
293
|
+
end
|
294
|
+
|
295
|
+
else
|
296
|
+
|
297
|
+
# if we are supposed to cascade (and have no context) then we perform action
|
298
|
+
# if we don't have a context then we perform action
|
299
|
+
should_perform_action = true
|
300
|
+
|
301
|
+
end
|
302
|
+
|
303
|
+
if should_perform_action
|
304
|
+
|
305
|
+
# if we have a module to include/extend
|
306
|
+
if this_module = this_frame.module
|
307
|
+
case this_action = this_frame.action
|
308
|
+
when :include
|
309
|
+
hooked_instance.module_eval do
|
310
|
+
include this_module
|
311
|
+
end
|
312
|
+
when :extend
|
313
|
+
hooked_instance.extend( this_module )
|
314
|
+
end
|
315
|
+
end
|
316
|
+
|
317
|
+
# if we have a block it runs last
|
318
|
+
if this_block = this_frame.block
|
319
|
+
this_block.call( hooked_instance )
|
320
|
+
end
|
321
|
+
|
322
|
+
end
|
323
|
+
|
324
|
+
end
|
325
|
+
|
326
|
+
end
|
327
|
+
|
328
|
+
if requires_module_cluster_enable
|
329
|
+
|
330
|
+
case hooked_instance
|
331
|
+
when ::Class
|
332
|
+
hooked_instance.extend( ::Module::Cluster::ClassSupport )
|
333
|
+
when ::Module
|
334
|
+
hooked_instance.extend( ::Module::Cluster::ModuleSupport )
|
335
|
+
end
|
336
|
+
|
337
|
+
end
|
338
|
+
|
339
|
+
end
|
340
|
+
|
341
|
+
end
|