Injections
==========

Injections are *Objects* entities that are used for specification of dependency
injection types.

Different functions, classes and objects can take dependency injections in
various forms. Some of them take dependencies like keyword arguments during
call time, other require setting of attributes or calling of specialized
methods for doing dependency injections.

So, when you are doing dependency injection you need to specify its type and
that is the place where *Injections* need to be used.

Some key points of *Objects* injections:

    - Every *Objects* injection always takes injectable value as an
      ``injectable`` param. Every Python object could be an injectable.
    - Every *Objects* injection always has ``value`` property that returns
      injection's injectable. ``value`` property is calculated every time it is
      accessed. Every Python object, except of *Objects* providers, that was
      provided as and ``injectable`` will be returned by ``value`` property
      *"as is"*. *Objects* providers will be called every time during ``value``
      accessing and result of such calls will be returned.
    - Every *Objects* *Injection* can have additional params that are needed
      for doing particular type of injection.

There are several types of *Injections*:

    - ``KwArg`` - is used for making keyword argument injections for any kind
      of callables (functions, methods, objects instantiation and so on). Takes
      keyword argument name as string and injectable.
    - ``Attribute`` - is used for making injections by setting of injection's
      value to a particular attribute. Takes attribute name as string and
      injectable.
    - ``Method`` - is used for making injections by calling of method with
      injectable value. Takes method name as string and injectable.