4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
# File 'lib/gamebox/core/stage_factory.rb', line 4
def build(stage_name, opts={})
this_object_context.in_subcontext do |stage_context|
begin
stage_context[:stage].tap do |stage|
stage_definition = Stage.definitions[stage_name]
raise "#{stage_name} not found in Stage.definitions" if stage_definition.nil?
reqs = stage_definition.required_injections
if reqs
reqs.each do |req|
object = stage_context[req]
stage.define_singleton_method req do
components[req]
end
components = stage.send :components
components[req] = object
end
end
renderer_type = stage_definition.renderer || :renderer
renderer = stage_context[renderer_type]
stage_context[:renderer] = renderer unless renderer_type == :renderer
stage.define_singleton_method :renderer do
components[:renderer]
end
components = stage.send :components
components[:renderer] = renderer
helpers = stage_definition.helpers_block
if helpers
helpers_module = Module.new &helpers
stage.extend helpers_module
end
stage.configure(backstage, opts)
stage.define_singleton_method(:curtain_up, &stage_definition.curtain_up_block) if stage_definition.curtain_up_block
stage.define_singleton_method(:curtain_down, &stage_definition.curtain_down_block) if stage_definition.curtain_down_block
end
rescue Exception => e
raise """
#{stage_name} not found:
#{e.inspect}
#{e.backtrace[0..6].join("\n")}
"""
end
end
end
|