Class: Coradoc::Serializer::Registry

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

Overview

Registry for document element serializers

Provides a registry-based pattern for looking up serializers for document element types. This allows users to register custom serializers for their own element types or override existing serializers.

Examples:

Registering a custom serializer

Coradoc::Serializer::Registry.register(MyCustomElement, MyCustomSerializer)

Looking up a serializer

serializer = Coradoc::Serializer::Registry.lookup(element)
output = serializer.serialize(element) if serializer

Class Method Summary collapse

Class Method Details

.clearHash

Clear all registered serializers

Returns:

  • (Hash)

    Empty registry



89
90
91
# File 'lib/coradoc/serializer/registry.rb', line 89

def clear
  @registry = {}
end

.lookup(model) ⇒ Class?

Look up a serializer for a model instance or class

Parameters:

  • model (Object, Class)

    The model instance or class

Returns:

  • (Class, nil)

    The serializer class, or nil if not found



53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/coradoc/serializer/registry.rb', line 53

def lookup(model)
  model_class = model.is_a?(Class) ? model : model.class
  key = class_key(model_class)

  # Direct lookup
  return registry[key] if registry.key?(key)

  # Try parent classes
  model_class.ancestors.each do |ancestor|
    next if ancestor == model_class || ancestor == Object

    ancestor_key = class_key(ancestor)
    return registry[ancestor_key] if registry.key?(ancestor_key)
  end

  nil
end

.register(model_class, serializer_class) ⇒ Class?

Register a serializer for a model class

Parameters:

  • model_class (Class)

    The model class to serialize

  • serializer_class (Class)

    The serializer class to use

Returns:

  • (Class, nil)

    The previous serializer class, if any



33
34
35
36
37
38
# File 'lib/coradoc/serializer/registry.rb', line 33

def register(model_class, serializer_class)
  key = class_key(model_class)
  previous = registry[key]
  registry[key] = serializer_class
  previous
end

.registered?(model) ⇒ Boolean

Check if a serializer is registered for a model

Parameters:

  • model (Object, Class)

    The model instance or class

Returns:

  • (Boolean)

    true if a serializer is registered



75
76
77
# File 'lib/coradoc/serializer/registry.rb', line 75

def registered?(model)
  !lookup(model).nil?
end

.registered_modelsArray<Class>

Get all registered model classes

Returns:

  • (Array<Class>)

    Array of registered model classes



82
83
84
# File 'lib/coradoc/serializer/registry.rb', line 82

def registered_models
  registry.keys
end

.registryHash

Get the global registry instance

Returns:

  • (Hash)

    the registry hash



24
25
26
# File 'lib/coradoc/serializer/registry.rb', line 24

def registry
  @registry ||= {}
end

.serialize(model, format: :adoc, **options) ⇒ String?

Serialize a model using its registered serializer

Parameters:

  • model (Object)

    The model to serialize

  • format (Symbol) (defaults to: :adoc)

    The output format (:adoc, :html, :md, etc.)

  • options (Hash)

    Additional serialization options

Returns:

  • (String, nil)

    The serialized output, or nil if no serializer found



99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'lib/coradoc/serializer/registry.rb', line 99

def serialize(model, format: :adoc, **options)
  serializer_class = lookup(model)
  return nil unless serializer_class

  serializer = serializer_class.respond_to?(:new) ? serializer_class.new : serializer_class

  if serializer.respond_to?(:serialize)
    serializer.serialize(model, format: format, **options)
  elsif serializer.respond_to?(:to_s)
    serializer.to_s
  else
    model.to_s
  end
end

.unregister(model_class) ⇒ Class?

Unregister a serializer for a model class

Parameters:

  • model_class (Class)

    The model class to unregister

Returns:

  • (Class, nil)

    The removed serializer class, if any



44
45
46
47
# File 'lib/coradoc/serializer/registry.rb', line 44

def unregister(model_class)
  key = class_key(model_class)
  registry.delete(key)
end