module Attr::Gather::Registrable

Makes a module registrable

Public Class Methods

extended(klass) click to toggle source
# File lib/attr/gather/concerns/registrable.rb, line 13
def self.extended(klass)
  klass.instance_variable_set(:@__storage__, {})
end

Public Instance Methods

ensure_name_not_already_registered!(name) click to toggle source

@api private

# File lib/attr/gather/concerns/registrable.rb, line 42
def ensure_name_not_already_registered!(name)
  return unless @__storage__.key?(name)

  raise AlreadyRegisteredError,
        "item with name #{name} already registered"
end
register(name, &blk) click to toggle source

Register item so it can be accessed by name

@param name [Symbol] name of the item @yield [options] block to initialize the item

# File lib/attr/gather/concerns/registrable.rb, line 21
def register(name, &blk)
  name = name.to_sym

  @__storage__[name] = blk
end
resolve(name, *args, **opts) click to toggle source

Resolve a named item

@param name [Symbol]

@return [#call]

# File lib/attr/gather/concerns/registrable.rb, line 32
def resolve(name, *args, **opts)
  block = @__storage__.fetch(name) do
    raise NotFoundError,
          "no item with name #{name} registered"
  end

  block.call(*args, **opts)
end