"""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)