Class: Coradoc::Markdown::Serializer::Registry
- Inherits:
-
Object
- Object
- Coradoc::Markdown::Serializer::Registry
- Defined in:
- lib/coradoc/markdown/serializer/registry.rb
Overview
Type-keyed dispatch table for element serializers.
Each entry is a tuple of (serializer_instance, priority). Dispatch resolves the highest-priority entry whose declared ‘handles?` predicate accepts the element. This lets specialized serializers (e.g. one that targets a specific CoreModel subclass) override generic ones without modifying the registry lookup logic — Open/Closed.
Defined Under Namespace
Classes: Entry
Instance Method Summary collapse
-
#initialize ⇒ Registry
constructor
A new instance of Registry.
- #lookup(element) ⇒ Object
- #lookup!(element) ⇒ Object
- #register(serializer, priority: 0) ⇒ Object
Constructor Details
#initialize ⇒ Registry
Returns a new instance of Registry.
22 23 24 |
# File 'lib/coradoc/markdown/serializer/registry.rb', line 22 def initialize @entries = Hash.new { |h, k| h[k] = [] } end |
Instance Method Details
#lookup(element) ⇒ Object
35 36 37 |
# File 'lib/coradoc/markdown/serializer/registry.rb', line 35 def lookup(element) each_candidate(element).first&.serializer end |
#lookup!(element) ⇒ Object
39 40 41 42 43 |
# File 'lib/coradoc/markdown/serializer/registry.rb', line 39 def lookup!(element) lookup(element) || raise(ArgumentError, "Unknown element type for serialization: #{element.class}. " \ 'Expected a known Markdown model type.') end |
#register(serializer, priority: 0) ⇒ Object
26 27 28 29 30 31 32 33 |
# File 'lib/coradoc/markdown/serializer/registry.rb', line 26 def register(serializer, priority: 0) klass = serializer.handles_type raise ArgumentError, "Serializer #{serializer.class} declares no handles_type" unless klass @entries[klass] << Entry.new(serializer, priority) @entries[klass].sort! serializer end |