#!/usr/bin/python

from twisted.python import reflect

def getClasses():
    from atop.powerup import Powerup
    classes = []
    kstack = Powerup.__subclasses__()
    while kstack:
        k = kstack.pop()
        classes.append(k)
        kstack.extend(k.__subclasses__())
    return classes

def getDependencies(klass):
    classes = []
    kstack = []
    reflect.accumulateClassList(klass, "dependencies", kstack)
    while kstack:
        k = kstack.pop()
        classes.append(k)
        reflect.accumulateClassList(k, "dependencies", kstack)
    return dict.fromkeys(classes).keys()

def findLeaves(classes):
    powerups = {}
    for p in classes:
        powerups[p] = dict.fromkeys(getDependencies(p))
    leaves = []
    for p in powerups:
        for other in powerups.itervalues():
            if p in other:
                break
        else:
            leaves.append(p)
    return leaves

def main():
    classes = getClasses()
    leaves = findLeaves(classes)
    for p in classes:
        if p in leaves:
            print '(L)',
        else:
            print '   ',
        print p.__name__, ':', ', '.join([x.__name__ for x in getDependencies(p)])

if __name__ == '__main__':
    main()
