| Total Complexity | 14 |
| Total Lines | 64 |
| Duplicated Lines | 0 % |
| Changes | 2 | ||
| Bugs | 0 | Features | 0 |
| 1 | module Nurse |
||
| 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 |