Class: Coradoc::Reference::Materializer::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/coradoc/reference/materializer/registry.rb

Overview

Registry of materializers keyed by [kind, presentation, format]. Lookup falls back on :any — so a materializer registered for [:link, :any, :html] handles every presentation in HTML. Most specific key wins (concrete > :any).

Format gems register their materializers process-wide via .register_global (OCP): every registry instance picks them up on first use, and dispatch code never changes.

Constant Summary collapse

BUILTINS =

Core ships only the node-preserving fallback. Format-specific materializers live in the format gems (coradoc-html, coradoc-adoc, ...) and register globally at load time.

[Materializer::Passthrough].freeze

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeRegistry

Returns a new instance of Registry.



41
42
43
44
# File 'lib/coradoc/reference/materializer/registry.rb', line 41

def initialize
  @by_key = {}
  @builtins_registered = false
end

Class Method Details

.global_registrationsObject



32
33
34
# File 'lib/coradoc/reference/materializer/registry.rb', line 32

def global_registrations
  GLOBAL_MUTEX.synchronize { @global_registrations.dup }
end

.register_global(klass) ⇒ Object



26
27
28
29
30
# File 'lib/coradoc/reference/materializer/registry.rb', line 26

def register_global(klass)
  GLOBAL_MUTEX.synchronize do
    @global_registrations << klass unless @global_registrations.include?(klass)
  end
end

.reset_globals!Object



36
37
38
# File 'lib/coradoc/reference/materializer/registry.rb', line 36

def reset_globals!
  GLOBAL_MUTEX.synchronize { @global_registrations.clear }
end

Instance Method Details

#lookup(kind:, presentation:, format:) ⇒ Object



51
52
53
54
55
56
57
58
# File 'lib/coradoc/reference/materializer/registry.rb', line 51

def lookup(kind:, presentation:, format:)
  ensure_builtins_registered!
  find_most_specific(kind, presentation, format) ||
    find_most_specific(kind, presentation, :any) ||
    find_most_specific(kind, :any, format) ||
    find_most_specific(kind, :any, :any) ||
    find_most_specific(:any, :any, :any)
end

#register(klass) ⇒ Object



46
47
48
49
# File 'lib/coradoc/reference/materializer/registry.rb', line 46

def register(klass)
  ensure_builtins_registered!
  @by_key[EntryKey.new(klass.kind, klass.presentation, klass.format)] = klass
end

#registeredObject



60
61
62
63
# File 'lib/coradoc/reference/materializer/registry.rb', line 60

def registered
  ensure_builtins_registered!
  @by_key.dup
end

#reset!Object



65
66
67
68
# File 'lib/coradoc/reference/materializer/registry.rb', line 65

def reset!
  @by_key.clear
  @builtins_registered = false
end