from bgenOutput import *

class GeneratorGroup:

    def __init__(self, prefix):
        self.prefix = prefix
        self.generators = []

    def add(self, g, dupcheck=0):
        if dupcheck:
            if g in self.generators:
                print 'DUP', g.name
                return
        g.setprefix(self.prefix)
        self.generators.append(g)

    def generate(self):
        for g in self.generators:
            g.generate()
        Output()
        Output("static PyMethodDef %s_methods[] = {", self.prefix)
        IndentLevel()
        for g in self.generators:
            g.reference()
        Output("{NULL, NULL, 0}")
        DedentLevel()
        Output("};")


def _test():
    void = None
    from bgenGenerator import FunctionGenerator
    group = GeneratorGroup("spam")
    eggs = FunctionGenerator(void, "eggs")
    group.add(eggs)
    print "/* START */"
    group.generate()

if __name__ == "__main__":
    _test()
