Module: Factory

Defined in:
lib/factory.rb,
lib/factory/version.rb

Overview

The Factory mixin provides a robust Factory implementation. Overrides are automatically registered upon sub-classing. Manual override and disables are available if auto-registration does not result in the desired factory overrides. Manual overrides are available at the class and global granularities. Method arguments can be passed in as strings or symbols so that overrides can be set even before classes have been defined.

Defined Under Namespace

Modules: ClassMethods Classes: OverrideList

Constant Summary collapse

VERSION =
'1.0.0'

Class Method Summary collapse

Class Method Details

.[](base_class) ⇒ Object

Accessor which returns the factory override of base_class.



194
195
196
197
198
199
# File 'lib/factory.rb', line 194

def self.[] base_class
	if @override_lists[base_class.to_s].nil?
		raise "class called #{base_class} is not registered with the factory."
	end
	eval @override_lists[base_class.to_s].get_override 
end

.create_override_list(klass, parent = nil) ⇒ Object

Registers a class in the factory by creating it an OverrideList.



139
140
141
142
143
144
# File 'lib/factory.rb', line 139

def self.create_override_list klass, parent=nil #:nodoc:
	parent = parent.to_s unless parent.nil?
	@override_lists[klass.to_s] ||= OverrideList.new(klass.to_s)
	@override_lists[klass.to_s].parent ||= parent
	return @override_lists[klass.to_s]
end

.disable_override(overridden_class, overriding_class) ⇒ Object

Used to manually disable class specific override class.



179
180
181
# File 'lib/factory.rb', line 179

def self.disable_override overridden_class, overriding_class
	Factory.override_list(overridden_class.to_s).remove_override overriding_class.to_s
end

.enable_override(overridden_class, overriding_class) ⇒ Object

Used to manually enable class specific override class.



174
175
176
# File 'lib/factory.rb', line 174

def self.enable_override overridden_class, overriding_class
	Factory.override_list(overridden_class).add_override overriding_class.to_s
end

.global_disable_override(overriding_class) ⇒ Object

Used to manually disable a class from overriding any ancestors.



184
185
186
# File 'lib/factory.rb', line 184

def self.global_disable_override overriding_class
	@global_override_disables << overriding_class.to_s
end

.global_override_disablesObject

Accessor which returns the @global_override_disables array.



161
162
163
# File 'lib/factory.rb', line 161

def self.global_override_disables #:nodoc:
	@global_override_disables.dup
end

.included(klass) ⇒ Object

Include callback which adds class methods to the including class.



96
97
98
99
# File 'lib/factory.rb', line 96

def self.included klass #:nodoc:
	Factory.create_override_list klass
	klass.extend Factory::ClassMethods
end

.inherited_override(parent, sub_class) ⇒ Object

Adds inherited overrides up the chain of ancestors.



147
148
149
150
151
152
153
# File 'lib/factory.rb', line 147

def self.inherited_override parent, sub_class #:nodoc:
	override_list = @override_lists[parent.to_s]
	override_list.add_inherited_override sub_class.to_s
	if override_list.parent
		Factory.inherited_override override_list.parent, sub_class.to_s
	end
end

.override_list(klass) ⇒ Object

Returns an OverrideList for klass or creates it if it does not already exist.



156
157
158
# File 'lib/factory.rb', line 156

def self.override_list klass #:nodoc:
	@override_lists[klass.to_s] ||= Factory.create_override_list(klass.to_s)
end

Prints a summary of the Factory override configuration. Returns the summary as a string. The summary will not be printed if silent is true.



203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/factory.rb', line 203

def self.print_overrides silent=false
	s = <<-TXT
********************************
Factory Overrides
********************************

Global Factory Override Disables: #{@global_override_disables.empty? ?
			'None' : @global_override_disables.join(', ')}

		TXT

	@override_lists.each_value {|ovr_list| s += ovr_list.to_s }
	puts s unless silent

	return s

end

.remove_global_disable_override(overriding_class) ⇒ Object

Used to cancel a previous global_disable_override.



189
190
191
# File 'lib/factory.rb', line 189

def self.remove_global_disable_override overriding_class
	@global_override_disables.delete overriding_class.to_s
end

.reset_overridesObject

Used for testing purposes. Resets all manual override arrays.



166
167
168
169
170
171
# File 'lib/factory.rb', line 166

def self.reset_overrides #:nodoc:
	@global_override_disables.clear
	@override_lists.each_value do |ovr_list|
		ovr_list.reset_overrides
	end
end