module Dry::Container::ClassInterface

Class-level DSL for nested container definition

Public Instance Methods

apply_namespace!() click to toggle source
# File lib/dry/container/nested.rb, line 121
def apply_namespace!
  key_methods.map do |method|
    redefine_method method
  end
end

Private Instance Methods

key_methods() click to toggle source

Methods accepting key as one of their parameters @return [<UnboundMethod>]

# File lib/dry/container/nested.rb, line 131
def key_methods
  Mixin.instance_methods(false).inject([]) do |result, method|
    key_parameter(method) ? result + [method] : result
  end
end
key_parameter(method_or_name) click to toggle source

@param [UnboundMethod] method_or_name

# File lib/dry/container/nested.rb, line 138
def key_parameter(method_or_name)
  method_or_name = method_definition(method_or_name)
  method_or_name.parameters.detect { |_kind, name| :key == name }
end
method_definition(method_or_name, from: Mixin) click to toggle source

@param [UnboundMethod, Symbol] method_or_name @param [Module] from @return [UnboundMethod]

# File lib/dry/container/nested.rb, line 146
def method_definition(method_or_name, from: Mixin)
  if method_or_name.is_a?(Symbol)
    method_or_name = from.instance_method method_or_name
  end
  unless method_or_name.is_a? UnboundMethod
    raise ArgumentError,
          "#{method_or_name} is not an unbound method or symbol "\
          "found in #{from}",
          caller.join("\n")
  end
  method_or_name
end
redefine_method(method) click to toggle source

@param [UnboundMethod] method

# File lib/dry/container/nested.rb, line 160
def redefine_method(method)
  method = method_definition(method)
  key_parameter = key_parameter(method)
  index = method.parameters.index(key_parameter)
  define_method method.name do |*args, **kwargs|
    args = args.dup
    args[index] = prefixed(args[index])
    container.send(method.name, *args, **kwargs)
  end
end