Test Setup Failed
Push — master ( 494f26...6bc7a5 )
by Marcelo
26s
created

DependencyContainer.set()   A

Complexity

Conditions 1

Size

Total Lines 5

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
c 0
b 0
f 0
dl 0
loc 5
rs 9.4285
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
    protected
43
44
    attr_reader :factories
45
    attr_reader :instances
46
    attr_reader :shared_factories
47
48
    def from_shared_factories(key)
49
      return unless shared_factories.key?(key)
50
      instances[key] ||= shared_factories[key].call(self)
51
    end
52
53
    def from_factories(key)
54
      factories[key].call(self) if factories.key?(key)
55
    end
56
57
    def ensure_undefined(dependency)
58
      return unless self.defined?(dependency)
59
      fail DependencyAlreadyDefined,
60
           "Dependency '#{dependency}' was already defined"
61
    end
62
63
    def to_key(object)
64
      object.to_s
65
    end
66
  end
67
end
68