func (c Container) Make(abstract interface{}, parameters ...interface{}) (interface{}, error) {
	if utils.IsFunc(abstract) {
		return c.Invoke(abstract), nil
	}
	if shared, ok := c.shared[utils.GetKey(abstract)]; ok {
		return shared, nil
	}
	binding, err := c.getBinding(abstract)
	if err != nil {
		return nil, err
	}
	var concrete interface{}
	if binding.ConcreteIsFunc() && len(parameters) == 0 {
		concrete = c.Invoke(binding.Concrete)
	} else {
		concrete = binding.GetConcrete(parameters...)
	}
	if binding.Shared {
		c.shared[utils.GetKey(abstract)] = concrete
	}
	return concrete, nil
}
Make finds an entry of the container by its identifier and returns it.
package container
import (
	"reflect"
	"go.rafdel.co/akisa/container/internal/pkg/binding"
	"go.rafdel.co/akisa/container/internal/pkg/utils"
)
type Container struct {
	bindings map[string]binding.Binding
	shared   map[string]interface{}
	aliases  map[string]string
}
func New() *Container {
	return &Container{
		bindings: make(map[string]binding.Binding),
		shared:   make(map[string]interface{}),
		aliases:  make(map[string]string),
	}
}
func (c Container) Bind(abstract interface{}, concrete interface{}) {
	c.provide(abstract, concrete, false)
}
func (c Container) BindShared(abstract interface{}, concrete interface{}) {
	c.provide(abstract, concrete, true)
}
func (c Container) Singleton(abstract interface{}, concrete interface{}) {
	c.BindShared(abstract, concrete)
}
func (c Container) provide(abstract interface{}, concrete interface{}, shared bool) {
	var finalConcrete interface{}
	if utils.IsInterface(abstract) && !utils.IsImplements(concrete, abstract) {
		panic(ErrInterfaceMismatch)
	}
	if utils.IsStruct(abstract) {
		if concrete != nil {
			panic(ErrAbstractStructConcreteNotNil)
		}
		finalConcrete = abstract
	} else {
		finalConcrete = concrete
	}
	c.bindings[utils.GetKey(abstract)] = binding.New(finalConcrete, shared)
}
func (c Container) Alias(abstract interface{}, alias string) {
	if _, err := c.getBinding(abstract); err != nil {
		panic(ErrAliasAbstractMissing)
	}
	c.aliases[utils.GetKey(alias)] = utils.GetKey(abstract)
}