1from objc import _objc
2import sys
3
4__all__ = ['protocolNamed', 'ProtocolError']
5
6class ProtocolError(_objc.error):
7    __module__ = 'objc'
8
9PROTOCOL_CACHE = {}
10def protocolNamed(name):
11    """
12    Returns a Protocol object for the named protocol. This is the
13    equivalent of @protocol(name) in Objective-C.
14    Raises objc.ProtocolError when the protocol does not exist.
15    """
16    if sys.version_info[0] == 2:
17        name = unicode(name)
18    try:
19        return PROTOCOL_CACHE[name]
20    except KeyError:
21        pass
22    for p in _objc.protocolsForProcess():
23        pname = p.__name__
24        PROTOCOL_CACHE.setdefault(pname, p)
25        if pname == name:
26            return p
27    for cls in _objc.getClassList():
28        for p in _objc.protocolsForClass(cls):
29            pname = p.__name__
30            PROTOCOL_CACHE.setdefault(pname, p)
31            if pname == name:
32                return p
33    raise ProtocolError("protocol %r does not exist" % (name,), name)
34