Class: Sourced::Message::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/sourced/message.rb

Overview

Lookup table mapping type strings to message subclasses.

Instance Method Summary collapse

Constructor Details

#initialize(message_class) ⇒ Registry

Returns a new instance of Registry.

Parameters:

  • message_class (Class)

    the root message class for this registry



55
56
57
58
# File 'lib/sourced/message.rb', line 55

def initialize(message_class)
  @message_class = message_class
  @lookup = {}
end

Instance Method Details

#[](key) ⇒ Class?

Look up a message class by type string. Searches this registry first, then recurses into subclass registries.

Parameters:

  • key (String)

    message type string

Returns:

  • (Class, nil)


79
80
81
82
83
84
85
86
87
88
# File 'lib/sourced/message.rb', line 79

def [](key)
  klass = lookup[key]
  return klass if klass

  subclasses.each do |c|
    klass = c.registry[key]
    return klass if klass
  end
  nil
end

#[]=(key, klass) ⇒ Object

Register a message class under a type string.

Parameters:

  • key (String)

    message type string

  • klass (Class)

    message subclass



70
71
72
# File 'lib/sourced/message.rb', line 70

def []=(key, klass)
  @lookup[key] = klass
end

#all {|Class| ... } ⇒ Enumerator<Class>

All registered message classes across this registry and subclass registries.

Yields:

  • (Class)

    each registered message class

Returns:

  • (Enumerator<Class>)

    if no block given



94
95
96
97
98
99
# File 'lib/sourced/message.rb', line 94

def all(&block)
  return enum_for(:all) unless block

  lookup.each_value(&block)
  subclasses.each { |c| c.registry.all(&block) }
end

#keysArray<String>

Returns registered type strings.

Returns:

  • (Array<String>)

    registered type strings



61
# File 'lib/sourced/message.rb', line 61

def keys = @lookup.keys

#subclassesArray<Class>

Returns direct subclasses of the root message class.

Returns:

  • (Array<Class>)

    direct subclasses of the root message class



64
# File 'lib/sourced/message.rb', line 64

def subclasses = message_class.subclasses