Class: Encase::Container

Inherits:
Object
  • Object
show all
Defined in:
lib/encase/container.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(parent = nil) ⇒ Container

Returns a new instance of Container.



7
8
9
10
# File 'lib/encase/container.rb', line 7

def initialize(parent = nil)
  @parent = parent
  @items = {}
end

Instance Attribute Details

#parentObject

Returns the value of attribute parent.



5
6
7
# File 'lib/encase/container.rb', line 5

def parent
  @parent
end

Instance Method Details

#childObject



95
96
97
# File 'lib/encase/container.rb', line 95

def child
  Container.new(self)
end

#clearObject



58
59
60
61
# File 'lib/encase/container.rb', line 58

def clear
  @items.clear
  self
end

#configure(&block) ⇒ Object



90
91
92
93
# File 'lib/encase/container.rb', line 90

def configure(&block)
  instance_exec(&block)
  self
end

#contains?(key) ⇒ Boolean

Returns:

  • (Boolean)


12
13
14
# File 'lib/encase/container.rb', line 12

def contains?(key)
  @items.key?(key)
end

#factory(key, value = nil, &block) ⇒ Object



68
69
70
71
# File 'lib/encase/container.rb', line 68

def factory(key, value = nil, &block)
  register('factory', key, value, block)
  self
end

#find_needs_to_inject(klass) ⇒ Object



35
36
37
38
39
40
41
42
43
44
# File 'lib/encase/container.rb', line 35

def find_needs_to_inject(klass)
  needs = []
  klass.ancestors.each do |ancestor|
    if ancestor.respond_to?(:needs_to_inject) && !ancestor.needs_to_inject.nil?
      needs.concat(ancestor.needs_to_inject)
    end
  end

  needs
end

#inject(object) ⇒ Object



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'lib/encase/container.rb', line 16

def inject(object)
  klass = object.class
  if klass.respond_to?(:needs_to_inject)
    needs_to_inject = find_needs_to_inject(klass)
    needs_to_inject.each do |need|
      object.instance_variable_set(
        "@#{need}", lookup(need)
      )
    end

    object.container = self if object.respond_to?(:container)
    object.on_inject() if object.respond_to?(:on_inject)

    true
  else
    false
  end
end

#lookup(key, origin = nil) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
# File 'lib/encase/container.rb', line 78

def lookup(key, origin = nil)
  if contains?(key)
    item = @items[key]
    item.instance(origin)
  elsif !parent.nil?
    origin = self if origin.nil?
    parent.lookup(key, origin)
  else
    raise KeyError.new("Key:#{key} not found in container.")
  end
end

#object(key, value = nil, &block) ⇒ Object



63
64
65
66
# File 'lib/encase/container.rb', line 63

def object(key, value = nil, &block)
  register('object', key, value, block)
  self
end

#register(type, key, value, block) ⇒ Object



46
47
48
49
50
51
# File 'lib/encase/container.rb', line 46

def register(type, key, value, block)
  item = ContainerItemFactory.build(type, self)
  item.store(key, value || block)
  @items[key] = item
  self
end

#singleton(key, value = nil, &block) ⇒ Object



73
74
75
76
# File 'lib/encase/container.rb', line 73

def singleton(key, value = nil, &block)
  register('singleton', key, value, block)
  self
end

#unregister(key) ⇒ Object



53
54
55
56
# File 'lib/encase/container.rb', line 53

def unregister(key)
  @items.delete(key)
  self
end