Class: Arrolio::Style::Registry

Inherits:
Object
  • Object
show all
Defined in:
lib/arrolio/style/registry.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(overrides = {}) ⇒ Registry

Returns a new instance of Registry.



10
11
12
13
14
15
# File 'lib/arrolio/style/registry.rb', line 10

def initialize(overrides = {})
  @overrides = {}
  @resolution_cache = {}
  overrides.each { |name, attrs| register(name, **attrs) }
  freeze
end

Instance Attribute Details

#overridesObject (readonly)

Returns the value of attribute overrides.



8
9
10
# File 'lib/arrolio/style/registry.rb', line 8

def overrides
  @overrides
end

Instance Method Details

#==(other) ⇒ Object Also known as: eql?



47
48
49
# File 'lib/arrolio/style/registry.rb', line 47

def ==(other)
  other.is_a?(self.class) && overrides == other.overrides
end

#[](name) ⇒ Object



45
# File 'lib/arrolio/style/registry.rb', line 45

def [](name) = @overrides.[](name.to_sym)

#hashObject



53
54
55
# File 'lib/arrolio/style/registry.rb', line 53

def hash
  [self.class, overrides].hash
end

#key?(name) ⇒ Boolean

Returns:

  • (Boolean)


44
# File 'lib/arrolio/style/registry.rb', line 44

def key?(name) = @overrides.key?(name.to_sym)

#namesObject



43
# File 'lib/arrolio/style/registry.rb', line 43

def names = @overrides.keys

#register(name, **opts) ⇒ Object



17
18
19
20
21
# File 'lib/arrolio/style/registry.rb', line 17

def register(name, **opts)
  @overrides[name.to_sym] = opts.transform_keys(&:to_sym)
  @resolution_cache.clear
  name.to_sym
end

#resolve(name, fallback: Definition.new) ⇒ Object



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
# File 'lib/arrolio/style/registry.rb', line 23

def resolve(name, fallback: Definition.new)
  key = name.to_sym
  return fallback unless @overrides.key?(key)
  return @resolution_cache[key] if @resolution_cache.key?(key)

  chain = []
  cursor = key
  seen = Set.new
  while cursor && @overrides.key?(cursor) && seen.add?(cursor)
    chain << @overrides[cursor]
    parent = @overrides[cursor][:parent]
    cursor = parent&.to_sym
  end
  merged = chain.reverse_each.reduce({}) { |acc, h| acc.merge(h) }
  merged.delete(:parent)
  result = Definition.new(**merged)
  @resolution_cache[key] = result
  result
end