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

DependencyContainer   A

Complexity

Total Complexity 14

Size/Duplication

Total Lines 64
Duplicated Lines 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
wmc 14
c 2
b 0
f 0
dl 0
loc 64
rs 10

9 Methods

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