"""Container injecting ``self`` example."""

from dependency_injector import containers, providers


class Service:
    def __init__(self, name: str):
        self.name = name


class ServiceDispatcher:
    def __init__(self, container: containers.Container):
        self.container = container

    def get_services(self):
        for provider in self.container.traverse(types=[providers.Factory]):
            yield provider()


class Container(containers.DeclarativeContainer):

    __self__ = providers.Self()

    service1 = providers.Factory(Service, name='Service 1')
    service2 = providers.Factory(Service, name='Service 2')
    service3 = providers.Factory(Service, name='Service 3')

    dispatcher = providers.Singleton(ServiceDispatcher, __self__)


if __name__ == '__main__':
    container = Container()

    dispatcher = container.dispatcher()
    for service in dispatcher.get_services():
        print(service.name)
