class Trailblazer::Context::ContainerChain

@private used to be called Resolver.

Public Class Methods

find(containers, name) click to toggle source
# File lib/trailblazer/container_chain.rb, line 26
def self.find(containers, name)
  containers.find { |container| container.key?(name) && (return container[name]) }
end
new(containers, to_hash: nil) click to toggle source

Keeps a list of containers. When looking up a key/value, containers are traversed in the order they were added until key is found.

Required Container interface: `#key?`, `#[]`.

@note ContainerChain is an immutable data structure, it does not support writing. @param containers Array of <Container> objects (splatted)

# File lib/trailblazer/container_chain.rb, line 11
def initialize(containers, to_hash: nil)
  @containers = containers
  @to_hash    = to_hash
end

Public Instance Methods

[](name) click to toggle source

@param name Symbol or String to lookup a value stored in one of the containers.

# File lib/trailblazer/container_chain.rb, line 17
def [](name)
  self.class.find(@containers, name)
end
key?(name) click to toggle source

@private

# File lib/trailblazer/container_chain.rb, line 22
def key?(name)
  @containers.find { |container| container.key?(name) }
end
keys() click to toggle source
# File lib/trailblazer/container_chain.rb, line 30
def keys
  @containers.collect(&:keys).flatten
end
to_hash() click to toggle source

@private

# File lib/trailblazer/container_chain.rb, line 35
def to_hash
  # FIXME: introduce pattern matching so we can have different "transformers" for each container type.
  return @to_hash.(@containers) if @to_hash
  @containers.each_with_object({}) { |container, hash| hash.merge!(container.to_hash) }
end