Class: Arrolio::Style::Registry
- Inherits:
-
Object
- Object
- Arrolio::Style::Registry
- Defined in:
- lib/arrolio/style/registry.rb
Instance Attribute Summary collapse
-
#overrides ⇒ Object
readonly
Returns the value of attribute overrides.
Instance Method Summary collapse
- #==(other) ⇒ Object (also: #eql?)
- #[](name) ⇒ Object
- #hash ⇒ Object
-
#initialize(overrides = {}) ⇒ Registry
constructor
A new instance of Registry.
- #key?(name) ⇒ Boolean
- #names ⇒ Object
- #register(name, **opts) ⇒ Object
- #resolve(name, fallback: Definition.new) ⇒ Object
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
#overrides ⇒ Object (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) |
#hash ⇒ Object
53 54 55 |
# File 'lib/arrolio/style/registry.rb', line 53 def hash [self.class, overrides].hash end |
#key?(name) ⇒ Boolean
44 |
# File 'lib/arrolio/style/registry.rb', line 44 def key?(name) = @overrides.key?(name.to_sym) |
#names ⇒ Object
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 |