####################################################################################################
#
# PySpice - A Spice Package for Python
# Copyright (C) 2014 Fabrice Salvaire
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.
#
####################################################################################################
####################################################################################################
import logging
from . import BasicElement
from . import HighLevelElement
from .Netlist import Netlist, ElementParameterMetaClass
####################################################################################################
_module_logger = logging.getLogger(__name__)
####################################################################################################
def _get_elements(module):
    element_classes = []
    for item  in module.__dict__.values():
        if (type(item) is ElementParameterMetaClass
            and item.__prefix__ is not None
           ):
            element_classes.append(item)
    return element_classes
####################################################################################################
#
# Add a method to create elements to the Netlist class
#
spice_elements = _get_elements(BasicElement)
high_level_elements = _get_elements(HighLevelElement)
for element_class in spice_elements + high_level_elements:
    def _make_function(element_class):
        def function(self, *args, **kwargs):
            return element_class(self, *args, **kwargs)
        # Preserve docstrings for element shortcuts
        function.__doc__ = element_class.__doc__
        return function
    func = _make_function(element_class)
    def _set(name):
        # _module_logger.debug("Add device shortcut {} for class {}".format(name, element_class))
        setattr(Netlist, name, func)
    _set(element_class.__name__)
    if element_class in spice_elements:
        if hasattr(element_class, '__alias__'):
            _set(element_class.__alias__)
        if hasattr(element_class, '__long_alias__'):
            _set(element_class.__long_alias__)