Test Setup Failed
Push — master ( 6bc7a5...1b66d8 )
by Marcelo
01:22
created

DependencyContainer.add_factory()   A

Complexity

Conditions 1

Size

Total Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 3
rs 10
cc 1
1
module Nurse
2
  # The dependency container class
3
  class DependencyContainer
4
    class UndefinedDependency < RuntimeError; end
5
    class DependencyAlreadyDefined < RuntimeError; end
6
7
    def initialize
8
      @factories = {}
9
      @shared_factories = {}
10
      @instances = {}
11
    end
12
13
    def share(dependency, &block)
14
      ensure_undefined(dependency)
15
      shared_factories[to_key(dependency)] = block
16
      self
17
    end
18
19
    def set(dependency, &block)
20
      ensure_undefined(dependency)
21
      factories[to_key(dependency)] = block
22
      self
23
    end
24
25
    def defined?(dependency)
26
      key = to_key(dependency)
27
      shared_factories.key?(key) || factories.key?(key)
28
    end
29
30
    def get(dependency, &_block)
31
      key = to_key(dependency)
32
33
      if self.defined?(key)
34
        return from_shared_factories(key) || from_factories(key)
35
      end
36
37
      return yield if block_given?
38
39
      fail UndefinedDependency, "'#{dependency}' was not defined"
40
    end
41
42
    def add_factory(factory)
43
      factory.attach_to(self)
44
    end
45
46
    protected
47
48
    attr_reader :factories
49
    attr_reader :instances
50
    attr_reader :shared_factories
51
52
    def from_shared_factories(key)
53
      return unless shared_factories.key?(key)
54
      instances[key] ||= shared_factories[key].call(self)
55
    end
56
57
    def from_factories(key)
58
      factories[key].call(self) if factories.key?(key)
59
    end
60
61
    def ensure_undefined(dependency)
62
      return unless self.defined?(dependency)
63
      fail DependencyAlreadyDefined,
64
           "Dependency '#{dependency}' was already defined"
65
    end
66
67
    def to_key(object)
68
      object.to_s
69
    end
70
  end
71
end
72