from .modules import *
from .primitives import *
from .templates import *
from .utils import settings


"""
TODO:

The DspModule class serves as a proxy to our original 'dsp' module. It provides direct access to settings 
stored in `dsp_settings` as if they were top-level attributes of the 'dsp' module, while also ensuring that
all other regular attributes (like functions, classes, or submodules) of the 'dsp' module remain accessible.

By replacing the module's symbols with an instance of DspModule, we allow users to access settings 
with the syntax `dsp.<setting_name>` instead of the longer `dsp.dsp_settings.<setting_name>`. This makes 
for more concise and intuitive code. However, due to its unconventional nature, developers should be 
careful when modifying this module to ensure they maintain the expected behavior and access patterns.
"""


"""

class DspModule:
    
    def __init__(self):
        # Import and store the original module object
        self._original_module = sys.modules[__name__]
    
    def __getattr__(self, name):
        # First, try getting the attribute from the original module
        if hasattr(self._original_module, name):
            return getattr(self._original_module, name)
        
        # Next, check dsp_settings
        if hasattr(dsp_settings, name):
            return getattr(dsp_settings, name)
        
        raise AttributeError(f"'{type(self).__name__}' object and the original module have no attribute '{name}'")

import sys
sys.modules[__name__] = DspModule()

"""