class Dio::LoaderFactory

LoaderFactory creates Loader. This also allows you to customize dependency loading.

Public Class Methods

new() click to toggle source
# File lib/dio/loader_factory.rb, line 9
def initialize
  @wrappers = {}
end

Public Instance Methods

clear_stubs(clazz = nil)
Alias for: reset_loader
create(container, target) click to toggle source
# File lib/dio/loader_factory.rb, line 13
def create(container, target)
  loader = loader_for(target, container)
  Loader.new(loader)
end
reset_loader(clazz = nil) click to toggle source

Removes load wrappers registered via {#wrap_load} or {#stub_deps}. If you specify a class, only the wrappers for the class are removed.

@param clazz [Class]

# File lib/dio/loader_factory.rb, line 52
def reset_loader(clazz = nil)
  return @wrappers.delete(clazz) if clazz
  @wrappers = {}
  nil
end
Also aliased as: clear_stubs
stub_deps(clazz, deps) click to toggle source

Registers a mock dependencies for a given class. When a registered dependency is loaded, the mock is returned instead of the actual one. This uses {#wrap_load} internally.

@param clazz [Class] @param deps [Hash]

# File lib/dio/loader_factory.rb, line 40
def stub_deps(clazz, deps)
  wrap_load(clazz) do |ctx|
    dep = deps[ctx.key]
    next ctx.load unless dep
    dep.respond_to?(:is_a?) && dep.is_a?(Proc) ? dep.call(*ctx.args) : dep
  end
end
wrap_load(clazz, &wrapper) click to toggle source

Registers a process which wraps loading. Wrappers are run only when a given class is a target of injection.

@param clazz [Class] @param wrapper [Block] @yield Dio::LoadContext @example

Dio.wrap_load(UsersController) do |ctx|
  puts "loaded: #{ctx.key}"
  ctx.load
end
# File lib/dio/loader_factory.rb, line 29
def wrap_load(clazz, &wrapper)
  @wrappers[clazz] = wrapper
end

Private Instance Methods

loader_for(target, container) click to toggle source
# File lib/dio/loader_factory.rb, line 61
def loader_for(target, container)
  actual_loader = container.method(:load)
  wrapper = @wrappers[target.class]
  return actual_loader unless wrapper

  lambda { |key, *args|
    context = LoadContext.new(key, target, args, actual_loader)
    wrapper.call(context)
  }
end