# Matz DI -- Block Injection
#
# Usage:
#
# def start_app
# c = DI::Container.new
# c.define(:blog) {|c| Blog.new(c.input, c.display)}
# c.define(:input) {Input.new}
# c.define(:dbms){DBMS.new}
# c.define(:markup){Markup.new}
# c.define(:plugin){|c|
# p = Plugin.new
# p.dbms = c.dbms
# }
# c.define(:display) {|c|
# Display.new(c.dbms, c.markup, c.plugin)
# }
# blog = c.instance(:blog)
# end
module DI
class Container
def initialize
@services = {}
@instances = {}
end
def define(name, &block)
@services[name] = block
class << self
self
end.instance_eval {
define_method(name) { self.instance(name) }
}
end
def instance(name)
return @instances[name] if @instances[name]
@instances[name] = @services[name].call(self)
end
end
end
|