class IOC::Container

Public Class Methods

new() click to toggle source
# File lib/ioc.rb, line 9
def initialize
  @services = {}
  @cache = {}
end

Public Instance Methods

register(key, klass=nil, &block) click to toggle source
# File lib/ioc.rb, line 14
def register(key, klass=nil, &block)
  raise(DuplicateServiceError, "Service '#{key}' has already been registered") if @services.key?(key)
  raise(RegistrationError, "expected class or block") unless klass || block_given?
  @services[key] = klass ? klass : block
end
release() click to toggle source
# File lib/ioc.rb, line 40
def release
  @cache = {}
end
resolve(key) click to toggle source
# File lib/ioc.rb, line 20
def resolve(key)
  raise(UnknownServiceError, "Service '#{key}' not registered") unless @services.key?(key)
  
  return @cache[key] if @cache.key?(key)
  
  @cache[key] = 
    if @services[key].is_a?(Proc)
      @services[key].call(self)
    else
      dependencies = get_dependencies(@services[key])
      resolved_dependencies = dependencies.map{|dependency| resolve(dependency)}
      @services[key].new(*resolved_dependencies)
    end
end
resolve_by_type(type) click to toggle source
# File lib/ioc.rb, line 35
def resolve_by_type(type)
  key, service = @services.find{|key, service| !service.is_a?(Proc) && service <= type}
  key ? resolve(key) : raise(UnknownServiceError, "Service of type '#{type}' not registered")
end
validate!() click to toggle source
# File lib/ioc.rb, line 44
def validate!
  missing = []
  class_services = @services.values.reject{|service| service.is_a?(Proc)}
  class_services.each do |service|
    dependencies = get_dependencies(service)
    dependencies.each do |dependency|
      unless @services.key?(dependency)
        missing << dependency
      end
    end
  end
  missing.uniq!

  unless missing.empty?
    raise(MissingDependenciesError, "missing dependencies: '#{missing.join(', ')}'")
  end
end

Private Instance Methods

get_dependencies(service) click to toggle source
# File lib/ioc.rb, line 64
def get_dependencies(service)
  service.instance_method(:initialize).parameters.map(&:last)
end