This was a bad idea. Don't do this.
inj
import "github.com/tmc/inj"
Package inj provides a simple mechanism of dependency injection
It combines a type to value map and the capability of invoking a function with parameters supplied based on their types.
Example:
i := inj.New()
i.Register("foobar")
i.Register(42)
vals, _ := i.Call(func(a int, b string) string {
return fmt.Sprintf("%T:%v %T:%v", a, a, b, b)
})
fmt.Print(vals)
Variables
var (
ErrNotFunc = errors.New("inj: Provided value is not a function")
ErrNotInterface = errors.New("inj: Provided value is not an interface type")
ErrDoesntImplement = errors.New("inj: Provided value does not satisfy provided interface")
)
type Injector
type Injector map[reflect.Type]reflect.Value
Injector is the type to value mapping that is utilized when looking up parameters in Call()
func New
func New() Injector
New prepares a new Injector
func (Injector) Call
func (inj Injector) Call(fun interface{}) ([]reflect.Value, error)
Call invokes fun with parameters populated by registered types
func (Injector) Register
func (inj Injector) Register(value interface{}) (replaced bool)
Register provides a new implementation for a provided type
Returns true if this registration is replacing a previous registration
func (Injector) RegisterAs
func (inj Injector) RegisterAs(value interface{}, registeredType interface{}) (bool, error)
RegisterAs provides a new implementation for a provided type but attempts to register it as
the interface type registeredType. registeredType must be supplied as a pointer to the interface type.
Returns true if this registration is replacing a previous registration.
Returns an error if the second argument isn't an interface or the first argument doesn't satisify the second.
Example:
i := inj.New()
i.RegisterAs(os.Stdin, (*io.Reader)(nil))