Module: Takagi::Registry::Base
- Included in:
- Network::Registry, Observable::Registry, Takagi::ReactorRegistry, Serialization::Registry, Server::Registry
- Defined in:
- lib/takagi/registry/base.rb
Overview
Thread-safe base module for implementing registries.
Provides a consistent API and thread-safety for all registry implementations. Designed to support the plugin system by allowing safe concurrent access.
Defined Under Namespace
Classes: AlreadyRegisteredError, NotFoundError, ValidationError
Class Method Summary collapse
Instance Method Summary collapse
-
#[](key) ⇒ Object?
Retrieve an entry from the registry (returns nil if not found).
-
#clear! ⇒ void
Clear all registrations.
-
#count ⇒ Integer
(also: #size)
Get count of registered entries.
-
#each {|key, value| ... } ⇒ Enumerator
Iterate over all entries.
-
#empty? ⇒ Boolean
Check if registry is empty.
-
#entries ⇒ Hash
Get all entries as a hash.
-
#get(key) ⇒ Object
Retrieve an entry from the registry.
-
#keys ⇒ Array
(also: #all)
Get all registered keys.
-
#metadata_for(key) ⇒ Hash?
Get metadata for a registered entry.
-
#register(key, value, overwrite: false, **metadata) ⇒ void
Register a new entry in the registry.
-
#registered?(key) ⇒ Boolean
Check if a key is registered.
-
#unregister(key) ⇒ Object?
Unregister an entry.
Class Method Details
.extended(base) ⇒ Object
46 47 48 49 |
# File 'lib/takagi/registry/base.rb', line 46 def self.extended(base) base.instance_variable_set(:@registry, {}) base.instance_variable_set(:@mutex, Mutex.new) end |
Instance Method Details
#[](key) ⇒ Object?
Retrieve an entry from the registry (returns nil if not found)
110 111 112 |
# File 'lib/takagi/registry/base.rb', line 110 def [](key) @mutex.synchronize { fetch_entry(key) } end |
#clear! ⇒ void
This method returns an undefined value.
Clear all registrations
Primarily useful for testing. Thread-safe.
179 180 181 182 183 184 |
# File 'lib/takagi/registry/base.rb', line 179 def clear! @mutex.synchronize do before_clear if respond_to?(:before_clear, true) registry.clear end end |
#count ⇒ Integer Also known as: size
Get count of registered entries
192 193 194 |
# File 'lib/takagi/registry/base.rb', line 192 def count @mutex.synchronize { registry.size } end |
#each {|key, value| ... } ⇒ Enumerator
Iterate over all entries
216 217 218 219 220 221 222 |
# File 'lib/takagi/registry/base.rb', line 216 def each(&block) return enum_for(:each) unless block_given? # Get snapshot to avoid holding lock during iteration snapshot = @mutex.synchronize { registry.dup } snapshot.each(&block) end |
#empty? ⇒ Boolean
Check if registry is empty
203 204 205 |
# File 'lib/takagi/registry/base.rb', line 203 def empty? @mutex.synchronize { registry.empty? } end |
#entries ⇒ Hash
Get all entries as a hash
142 143 144 |
# File 'lib/takagi/registry/base.rb', line 142 def entries @mutex.synchronize { registry.dup } end |
#get(key) ⇒ Object
Retrieve an entry from the registry
87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 |
# File 'lib/takagi/registry/base.rb', line 87 def get(key) value = self[key] unless value # Enhanced error with suggestions available = keys error = Errors::RegistryError.not_found( self.class.name, key, available ) raise NotFoundError, error. end value end |
#keys ⇒ Array Also known as: all
Get all registered keys
131 132 133 |
# File 'lib/takagi/registry/base.rb', line 131 def keys @mutex.synchronize { registry.keys.dup } end |
#metadata_for(key) ⇒ Hash?
Get metadata for a registered entry
153 154 155 |
# File 'lib/takagi/registry/base.rb', line 153 def (key) @mutex.synchronize { (key) } end |
#register(key, value, overwrite: false, **metadata) ⇒ void
This method returns an undefined value.
Register a new entry in the registry
63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/takagi/registry/base.rb', line 63 def register(key, value, overwrite: false, **) validate_entry!(key, value, **) if respond_to?(:validate_entry!, true) @mutex.synchronize do if registry.key?(key) && !overwrite # Enhanced error with suggestions error = Errors::RegistryError.already_registered(self.class.name, key) raise AlreadyRegisteredError, error. end store_entry(key, value, **) end after_register(key, value, **) if respond_to?(:after_register, true) end |
#registered?(key) ⇒ Boolean
Check if a key is registered
121 122 123 |
# File 'lib/takagi/registry/base.rb', line 121 def registered?(key) @mutex.synchronize { registry.key?(key) } end |
#unregister(key) ⇒ Object?
Unregister an entry
164 165 166 167 168 169 |
# File 'lib/takagi/registry/base.rb', line 164 def unregister(key) @mutex.synchronize do before_unregister(key) if respond_to?(:before_unregister, true) registry.delete(key) end end |