# -*- coding: Latin-1 -*-

import types

from twisted.python.components import implements
from twisted.python.components import Interface
from twisted.python.components import Adapter
from twisted.python.components import registerAdapter
from twisted.python.components import CannotAdapt

def makeChecker(func, interfaces):
    def check(self, *args):
        i = list(interfaces[:])
        a = list(args[:])
        result = []
        while a and i:
            iface, arg = i.pop(0), a.pop(0)
            if iface is None:
                continue
            try:
                result.append(iface(arg))
            except CannotAdapt:
                raise TypeError("Cannot adapt %r to %s" % (arg, iface.__name__))
        return func(self, *result)

class InterfaceCheckingType(type):
    def __new__(klass, name, bases, attrs):
        for (k, v) in attrs.items():
            if isinstance(v, types.FunctionType):
                attrs[k] = makeChecker(v, v.interfaces)
        return type.__new__(klass, name, bases, attrs)

class ITest(Interface):
    pass

class TestAdapter(Adapter):
    __implements__ = (ITest,)

class Foo:
    __implements__ = (ITest,)

class Bar:
    pass

registerAdapter(TestAdapter, Bar, ITest)

class TestClass(object):
    __metaclass__ = InterfaceCheckingType
    
    def __init__(self, test):
        pass
    __init__.interfaces = [ITest]

def main():
    TestClass
