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
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