
class Reopenable:
    def __init__(self):
        self.types = {}

    def __call__(self, name, bases, dict):
        if self.types.has_key(name):
            e = self.types[name]
            bases = e.__bases__ + bases
            dict.update(e.__dict__)
        newType = type(name, bases, dict)
        self.types[name] = newType
        return newType

animalMeta = Reopenable()
defaultMeta = Reopenable()

class Monkey:
    __metaclass__ = animalMeta
    
    x = 10
    
    def foo(self):
        print 'foo'

Monkey().foo()
try:
    Monkey().bar()
except:
    print 'Monkey().bar() failed'

class Monkey:
    __metaclass__ = animalMeta
    
    y = 20
    
    def bar(self):
        print self.y

Monkey().foo()

try:
    Monkey().bar()
except:
    print 'Monkey().bar() failed'

class Monkey:
    __metaclass__ = defaultMeta

try:
    Monkey().bar()
except:
    print 'Monkey().bar() failed'

