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

identifier_to_klass_mappings[R]
klass_to_identifier_mappings[R]

Public Class Methods

clear_registrations!() click to toggle source

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
fetch_event_klass(identifier) click to toggle source

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
identifiers_for_klass(event_klass) click to toggle source

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
register_identifier(klass:, identifier:) click to toggle source

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

create_event_klass(klass_name) click to toggle source
# 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
create_mapping_for_klass(event_klass) click to toggle source
# 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
derive_event_klass(identifier) click to toggle source
# 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
derive_identifier_from_klass(event_klass) click to toggle source
# File lib/emittance/event_lookup.rb, line 288
def derive_identifier_from_klass(event_klass)
  EventIdentifier.new(event_klass).generate
end
empty_collection() click to toggle source
# File lib/emittance/event_lookup.rb, line 309
def empty_collection
  Set.new
end
find_or_create_event_klass(klass_name) click to toggle source
# 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
identifier_reserved?(identifier, klass) click to toggle source
# 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
klass_already_exists_for_identifier?(identifier, klass) click to toggle source
# 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
klass_name_for(identifier) click to toggle source
# File lib/emittance/event_lookup.rb, line 292
def klass_name_for(identifier)
  EventKlassName.new(identifier).generate
end
lookup_event_klass(klass_name) click to toggle source
# 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
lookup_klass_to_identifier_mapping(event_klass) click to toggle source
# File lib/emittance/event_lookup.rb, line 265
def lookup_klass_to_identifier_mapping(event_klass)
  klass_to_identifier_mappings[event_klass]
end
valid_identifier?(identifier) click to toggle source
# File lib/emittance/event_lookup.rb, line 276
def valid_identifier?(identifier)
  identifier.is_a? Symbol
end