# Path: pyelt/helpers/global_helper_functions.py
# def camelcase_to_underscores(string):
#     """# example = 'CamelCase_Example'
#     # example2 = 'CamelCase_Example_AdditionalUnderscore'"""
#     string = string[0].lower() + string[1:len(string)]
# 
#     for i in string:
#         if i.isupper():
#             string = string.replace(i, '_' + i)
#     string = string.lower().replace('__', '_')
# 
#     return string


import inspect
from collections import OrderedDict
from pyelt.datalayers.database import *
from pyelt.helpers.global_helper_functions import camelcase_to_underscores
            from pyelt.datalayers.dv import Hub
        from pyelt.datalayers.dv import Sat
        from pyelt.datalayers.dv import LinkReference
        from pyelt.datalayers.dv import Sat
        for col_name, col in Adres.__ordereddict__.items():
            ...

    Hiernaast heeft de metaclass de volgende meta-velden:

    * __dbname__: dit wordt geinitieerd met de naam van de tabel zoals die in de database zal verschijnen.
                Let wel: sats binnen een entity krijgen de naam van de entity zie hiervoor HubEntityMetaClass
    * __dbschema__: hierin de naam van het het database schema
    * __cols__: list van Columns. De columns worden bij nieuwe class aanroep vooraf geinitieerd met veldnamen. Dat zijn de namen van de properties
    """

    @classmethod
    def __prepare__(mcs, name, bases):
        return OrderedDict()

    def __new__(mcs, name, bases, classdict):
        # we maken een nieuwe lege class-type aan. Deze is nodig voor de volledige mro.
        # (de parameter bases geef namelijk alleen de rechtstreekse bases van een class
        new_dummy_dvtable_cls = type.__new__(mcs, name, bases, {})

        # loop reversed door alle bases en breidt telkens dict uit met die van de bases, beginnend met de meest diepe base in hierarchie
        dict = OrderedDict()
        for base in reversed(new_dummy_dvtable_cls.__mro__):
            if '__ordereddict__' in base.__dict__:
                dict.update(base.__ordereddict__)
        dict.update(classdict)

        # nu we de dict hebben gaan we eigenlijke type aanmaken
        new_dvtable_cls = type.__new__(mcs, name, bases, dict)
        new_dvtable_cls.__ordereddict__ = dict

# Path: pyelt/helpers/global_helper_functions.py
# def camelcase_to_underscores(string):
#     """# example = 'CamelCase_Example'
#     # example2 = 'CamelCase_Example_AdditionalUnderscore'"""
#     string = string[0].lower() + string[1:len(string)]
# 
#     for i in string:
#         if i.isupper():
#             string = string.replace(i, '_' + i)
#     string = string.lower().replace('__', '_')
# 
#     return string


# Path: pyelt/datalayers/dv_metaclasses.py
import inspect
from collections import OrderedDict
from pyelt.datalayers.database import *
from pyelt.helpers.global_helper_functions import camelcase_to_underscores
            from pyelt.datalayers.dv import Hub
        from pyelt.datalayers.dv import Sat
        from pyelt.datalayers.dv import LinkReference
        from pyelt.datalayers.dv import Sat

        for col_name, col in Adres.__ordereddict__.items():
            ...

    Hiernaast heeft de metaclass de volgende meta-velden:

    * __dbname__: dit wordt geinitieerd met de naam van de tabel zoals die in de database zal verschijnen.
                Let wel: sats binnen een entity krijgen de naam van de entity zie hiervoor HubEntityMetaClass
    * __dbschema__: hierin de naam van het het database schema
    * __cols__: list van Columns. De columns worden bij nieuwe class aanroep vooraf geinitieerd met veldnamen. Dat zijn de namen van de properties
    """

    @classmethod
    def __prepare__(mcs, name, bases):
        return OrderedDict()

    def __new__(mcs, name, bases, classdict):
        # we maken een nieuwe lege class-type aan. Deze is nodig voor de volledige mro.
        # (de parameter bases geef namelijk alleen de rechtstreekse bases van een class
        new_dummy_dvtable_cls = type.__new__(mcs, name, bases, {})

        # loop reversed door alle bases en breidt telkens dict uit met die van de bases, beginnend met de meest diepe base in hierarchie
        dict = OrderedDict()
        for base in reversed(new_dummy_dvtable_cls.__mro__):
            if '__ordereddict__' in base.__dict__:
                dict.update(base.__ordereddict__)
        dict.update(classdict)

        # nu we de dict hebben gaan we eigenlijke type aanmaken
        new_dvtable_cls = type.__new__(mcs, name, bases, dict)
        new_dvtable_cls.__ordereddict__ = dict

        new_dvtable_cls.__dbname__ = camelcase_to_underscores(name) #wordt bij sats later weer overschreven in EntityMetaclass