Class: Dio::LoaderFactory

Inherits:
Object
  • Object
show all
Defined in:
lib/dio/loader_factory.rb

Overview

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

Defined Under Namespace

Classes: Loader

Instance Method Summary collapse

Constructor Details

#initializeLoaderFactory

Returns a new instance of LoaderFactory.



9
10
11
# File 'lib/dio/loader_factory.rb', line 9

def initialize
  @wrappers = {}
end

Instance Method Details

#create(container, target) ⇒ Object



13
14
15
16
# 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) ⇒ Object Also known as: clear_stubs

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

Parameters:

  • clazz (Class) (defaults to: nil)


52
53
54
55
56
# File 'lib/dio/loader_factory.rb', line 52

def reset_loader(clazz = nil)
  return @wrappers.delete(clazz) if clazz
  @wrappers = {}
  nil
end

#stub_deps(clazz, deps) ⇒ Object

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.

Parameters:

  • clazz (Class)
  • deps (Hash)


40
41
42
43
44
45
46
# 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) { ... } ⇒ Object

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

Examples:

Dio.wrap_load(UsersController) do |ctx|
  puts "loaded: #{ctx.key}"
  ctx.load
end

Parameters:

  • clazz (Class)
  • wrapper (Block)

Yields:

  • Dio::LoadContext



29
30
31
# File 'lib/dio/loader_factory.rb', line 29

def wrap_load(clazz, &wrapper)
  @wrappers[clazz] = wrapper
end