Decorators
==========

Current section of *Objects* documentation describes several useful decorators.

@inject decorator
-----------------

``@inject`` decorator can be used for making *inline* dependency injections.
It *patches* decorated callable in such way that dependency injection will be
done before every call of decorated callable.

``@inject`` decorator takes only argument that is supposed to be an
``objects.injections.Injection`` instance.

Any Python object will be injected *as is*, except *Objects* providers,
that will be called to provide injectable value.

Below is an example of how Flask's view could be patched using ``@inject``
decorator:

.. code-block:: python

    """`@inject` decorator example."""

    from objects.providers import NewInstance

    from objects.injections import KwArg
    from objects.injections import inject


    new_object = NewInstance(object)


    @inject(KwArg('object_a', new_object))
    @inject(KwArg('some_setting', 1334))
    def example_callback(object_a, some_setting):
        """This function has dependencies on object a and b.

        Dependencies are injected using `@inject` decorator.
        """
        assert isinstance(object_a, object)
        assert some_setting == 1334


    example_callback()
    example_callback()


@override decorator
-------------------