Spank

A simple light weight inversion of control container written in ruby.

Build Status Code Climate

Installation

Add this line to your application's Gemfile:

gem 'spank'

And then execute:

$ bundle

Or install it yourself as:

$ gem install spank

Usage

Register a single component and resolve it.


  container = Spank::Container.new
  container.register(:item) do |container|
    "ITEM"
  end
  item = container.resolve(:item)

Register multiple items, and resolve them.


  container = Spank::Container.new
  container.register(:pants) { jeans }
  container.register(:pants) { dress_pants }
  pants = container.resolve_all(:pants)

Register a singleton.


  container = Spank::Container.new
  container.register(:singleton) { fake }.as_singleton
  single_instance = container.resolve(:singleton)
  same_instance = container.resolve(:singleton)

Automatic dependency resolution.


  class Child
    def initialize(mom,dad)
    end
  end

  container = Spank::Container.new
  container.register(:mom) { mom }
  container.register(:dad) { dad }
  child = sut.build(Child)

Register selective interceptors.


  class Interceptor
    def intercept(invocation)
      invocation.proceed
    end
  end

  class Command
    def run(input)
    end
  end

  container = Spank::Container.new
  container.register(:command) { Command.new }.intercept(:run).with(Interceptor.new)
  proxy = container.resolve(:command)
  proxy.run("hi")

Static gateway to connect to the container.


  container = Spank::Container.new
  Spank::IOC.bind_to(container)
  item = Spank::IOC.resolve(:item)

Enjoy!

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request