module Emittance::EventLookup::Registry
Caches event-to-identifier and identifier-to-event mappings. The strategy here is to lazily store/load those mappings. They are created on lookup. The other option would be to add a .inherited
method to {Emittance::Event} that would make subclasses register themselves, but would cause some unwanted entanglement.
Attributes
Public Class Methods
Clears all registrations.
@return [Boolean] true
# File lib/emittance/event_lookup.rb, line 247 def clear_registrations! identifier_to_klass_mappings.clear klass_to_identifier_mappings.clear end
Finds or generates the event class associated with the identifier.
@param identifier [Symbol] the identifier registered to the event class you wish to fetch @return [Class] the event class you wish to fetch
# File lib/emittance/event_lookup.rb, line 209 def fetch_event_klass(identifier) klass = nil klass ||= identifier_to_klass_mappings[identifier] klass ||= derive_event_klass(identifier) klass end
Retrieves all identifiers associated with the event class.
@param event_klass [Class] the class you want the identifiers for @return [Set<Symbol>] all identifiers that can be used to identify the given event class
# File lib/emittance/event_lookup.rb, line 222 def identifiers_for_klass(event_klass) lookup_klass_to_identifier_mapping(event_klass) || (create_mapping_for_klass(event_klass) && lookup_klass_to_identifier_mapping(event_klass)) end
Registers the given identifier for the given event class.
@param klass [Class] the event class you would like to register the identifier for @param identifier [Symbol] the identifier with which you want to identify the event class @return [Class] the event class for which you've registered the identifier
# File lib/emittance/event_lookup.rb, line 232 def register_identifier(klass:, identifier:) raise Emittance::InvalidIdentifierError unless valid_identifier? identifier raise Emittance::IdentifierCollisionError if identifier_reserved? identifier, klass identifier_to_klass_mappings[identifier] = klass klass_to_identifier_mappings[klass] ||= empty_collection klass_to_identifier_mappings[klass] << identifier klass end
Private Class Methods
# File lib/emittance/event_lookup.rb, line 304 def create_event_klass(klass_name) new_klass = Class.new(Emittance::Event) set_namespaced_constant_by_name klass_name, new_klass end
# File lib/emittance/event_lookup.rb, line 269 def create_mapping_for_klass(event_klass) new_identifier = derive_identifier_from_klass(event_klass) register_identifier(identifier: new_identifier, klass: event_klass) new_identifier end
# File lib/emittance/event_lookup.rb, line 280 def derive_event_klass(identifier) klass_name = klass_name_for identifier event_klass = find_or_create_event_klass klass_name register_identifier(identifier: identifier, klass: event_klass) event_klass end
# File lib/emittance/event_lookup.rb, line 288 def derive_identifier_from_klass(event_klass) EventIdentifier.new(event_klass).generate end
# File lib/emittance/event_lookup.rb, line 309 def empty_collection Set.new end
# File lib/emittance/event_lookup.rb, line 296 def find_or_create_event_klass(klass_name) lookup_event_klass(klass_name) || create_event_klass(klass_name) end
# File lib/emittance/event_lookup.rb, line 256 def identifier_reserved?(identifier, klass) klass_already_exists_for_identifier?(identifier, klass) || !!identifier_to_klass_mappings[identifier] end
# File lib/emittance/event_lookup.rb, line 260 def klass_already_exists_for_identifier?(identifier, klass) derived_klass_name = klass_name_for identifier Object.const_defined?(derived_klass_name) && klass.name != derived_klass_name end
# File lib/emittance/event_lookup.rb, line 292 def klass_name_for(identifier) EventKlassName.new(identifier).generate end
# File lib/emittance/event_lookup.rb, line 300 def lookup_event_klass(klass_name) Object.const_defined?(klass_name) ? Object.const_get(klass_name) : nil end
# File lib/emittance/event_lookup.rb, line 265 def lookup_klass_to_identifier_mapping(event_klass) klass_to_identifier_mappings[event_klass] end
# File lib/emittance/event_lookup.rb, line 276 def valid_identifier?(identifier) identifier.is_a? Symbol end