"""A module proxy for delayed importing of modules.

From http://barnesc.blogspot.com/2006/06/automatic-python-imports-with-autoimp.html,
in the public domain.

"""

import sys


class LazyModule:
    """A lazy module proxy."""

    def __init__(self, modname):
        self.__dict__["__name__"] = modname
        self._set_mod(None)

    def _set_mod(self, mod):
        if mod is not None:
            self.__dict__ = mod.__dict__
        self.__dict__["_lazymod_mod"] = mod

    def _load_mod(self):
        __import__(self.__name__)
        self._set_mod(sys.modules[self.__name__])

    def __getattr__(self, name):
        if self.__dict__["_lazymod_mod"] is None:
            self._load_mod()

        mod = self.__dict__["_lazymod_mod"]

        if hasattr(mod, name):
            return getattr(mod, name)

        try:
            subname = f"{self.__name__}.{name}"
            __import__(subname)
            submod = getattr(mod, name)  # pylint: disable=unused-variable
        except ImportError as exc:
            raise AttributeError(f"'module' object has no attribute {name!r}") from exc
        self.__dict__[name] = LazyModule(subname)
        return self.__dict__[name]
