SmartIoC is a smart and really simple IoC container for Ruby applications.
gem install smart_ioc
Set package name and source package folder with beans. SmartIoC will parse source files and detect bean definitions automatically for you.
SmartIoC.find_package_beans(:PACKAGE_NAME, File.dirname(__FILE__))If you have several packages in your application (like if you are using rdm package manager) you can run SmartIoC.find_package_beans several time pointing it to the source folder and setting a different package name.
- Different packages can use beans with same name.
 - For a specific package you can declare beans with same name if they have different context.
 
class UsersRepository
  include SmartIoC::Iocify
  bean :users_repository
end
class Test::UsersRepository
  include SmartIoC::Iocify
  bean :users_repository, context: :test
end- You can extend the 
:defaultcontext with any other in the following way: 
SmartIoC::Container.get_instance.set_extra_context_for_package(:YOUR_PACKAGE_NAME, :test)This allows to create test implementations for any package dependency.
- 
In order to get a bean use
SmartIoC::Container.get_bean(:BEAN_NAME, package: :PACKAGE_NAME, context: :default).packageandcontextare optional arguments. - 
If you use the same bean name for different dependencies in different packages you will need to specify the package directly. You can do that by using
fromparameter: 
class UsersCreator
  include SmartIoC::Iocify
  bean :users_creator
  inject :users_repository, from: :repositories
  def create
    user = User.new
    users_repository.put(user)
  end
end- To have a diffent local name for a specific bean use the 
refparameter. In the following example we are injecting the:users_repositorydependency but refer to it asrepolocally. 
class UsersCreator
  include SmartIoC::Iocify
  bean :users_creator
  inject :users_repository, ref: :repo, from: :repositories
  def create
    user = User.new
    repo.put(user)
  end
end- Use factory method to instantiate the bean via a special creational method
 
class RepositoryFactory
  include SmartIoC::Iocify
  bean :users_creator, factory_method: :get_bean
  inject :config
  inject :users_repository
  inject :admins_repository
  def get_bean
    if config.admin_access?
      admins_repository
    else
      users_repository
    end
  end
  def create
    user = User.new
    repo.put(user)
  end
end- Class level beans (object will not be instantiated and class will be used for that bean instead). Set 
instance: false: 
class UsersCreator
  include SmartIoC::Iocify
  bean :users_creator, instance: false
  inject :users_repository
end
