Module: Rave::Mixins::ObjectFactory
- Included in:
- Rave::Models::Annotation, Rave::Models::Element, Rave::Models::Event
- Defined in:
- lib/mixins/object_factory.rb
Overview
Abstract object that allows you to create instances of the classes inside it based on providing a type name.
Constant Summary collapse
- WILDCARD =
'*'
Instance Attribute Summary collapse
-
#type ⇒ Object
readonly
:nodoc:.
Class Method Summary collapse
Instance Attribute Details
#type ⇒ Object (readonly)
:nodoc:
81 82 83 |
# File 'lib/mixins/object_factory.rb', line 81 def type @type end |
Class Method Details
.included(base) ⇒ Object
8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/mixins/object_factory.rb', line 8 def self.included(base) base.class_eval do # Store the registered classes in a class instance variable. class << self attr_reader :class_by_type_mapping attr_reader :class_by_pattern_mapping end @class_by_type_mapping = {} @class_by_pattern_mapping = {} class_eval(" def self.classes_by_type\n ::\#{self.name}.class_by_type_mapping\n end\n def self.classes_by_pattern\n ::\#{self.name}.class_by_pattern_mapping\n end\n END\n\n # Object factory method.\n #\n # :type - Type of object to create [String]\n def self.create(type, *args, &block)\n if classes_by_type.has_key? type\n return classes_by_type[type].new(*args, &block)\n elsif\n # Check for pattern-based types. Check for longer matches before shorter ones.\n patterns = classes_by_pattern.keys.sort { |a, b| b.to_s.length <=> a.to_s.length }\n patterns.each do |pattern|\n if type =~ pattern\n return classes_by_pattern[pattern].new($1, *args, &block)\n end\n end\n raise ArgumentError.new(\"Unknown \#{self} type \#{type}\")\n end\n end\n\n # Is this type able to be created?\n def self.valid_type?(type)\n classes_by_type.has_key? type\n end\n\n # Register this class with its factory.\n def self.factory_register(type)\n classes_by_type[type] = self\n\n # * in a type indicates a wildcard.\n if type[WILDCARD]\n classes_by_pattern[/^\#{type.sub(WILDCARD, '(.*)')}$/] = self\n end\n \n class << self\n def type; @type.dup; end\n end\n\n @type = type\n\n end\n\n # Classes that can be generated by the factory [Array of Class]\n def self.classes\n classes_by_type.values\n end\n\n # Types that can be generated by the factory [Array of String]\n def self.types\n classes_by_type.keys\n end\n end\nend\n", __FILE__, __LINE__) |