File: matzdi_block.rb

Project: MATZ-DI: Matz's Dependency Injection

# 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


[ Index ][ Presentation ]
Generated by [ source2html ]