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

DependencyContainer   A

Complexity

Total Complexity 15

Size/Duplication

Total Lines 68
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 15
c 2
b 0
f 0
dl 0
loc 68
rs 10

10 Methods

Rating   Name   Duplication   Size   Complexity  
A initialize() 0 5 1
A share() 0 5 1
A defined? 0 4 1
A get() 0 11 3
A set() 0 5 1
A ensure_undefined() 0 5 2
A add_factory() 0 3 1
A from_factories() 0 3 2
A to_key() 0 3 1
A from_shared_factories() 0 4 2
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