mgedmin: Will this conflict with #201 much?  I'd rather postpone my review until after you rebase.

(I'm also a bit dubious on the feature itself.  Why would anyone want to override `Interface.__adapt__`?  PEP 246 was rejected in any case.)
jamadden: > Will this conflict with #201 much? I'd rather postpone my review until after you rebase.

No, because this is based on #201. Only the last commit here is relevant. I'll shortly hit the merge button over there and a lot of the commits here should just vanish.

> I'm also a bit dubious on the feature itself. Why would anyone want to override `Interface.__adapt__`?

🤷‍♂ The documentation basically claimed that you could do that, but it only worked correctly using the Python implementation. I don't have an immediate use-case myself, but I have found `__conform__` to be useful in the past and I can imagine that the…inversion?…of that in `__adapt__` could also be useful.
diff --git a/CHANGES.rst b/CHANGES.rst
index bf8ce26..70f85e9 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -27,6 +27,23 @@
 
   See `issue 200 <https://github.com/zopefoundation/zope.interface/issues/200>`_.
 
+- Require that the second argument (*bases*) to ``InterfaceClass`` is
+  a tuple. This only matters when directly using ``InterfaceClass`` to
+  create new interfaces dynamically. Previously, an individual
+  interface was allowed, but did not work correctly. Now it is
+  consistent with ``type`` and requires a tuple.
+
+- Let interfaces define custom ``__adapt__`` methods. This implements
+  the other side of the :pep:`246` adaptation protocol: objects being
+  adapted could already implement ``__conform__`` if they know about
+  the interface, and now interfaces can implement ``__adapt__`` if
+  they know about particular objects. There is no performance penalty
+  for interfaces that do not supply custom ``__adapt__`` methods.
+
+  This includes the ability to add new methods, or override existing
+  interface methods using the new ``@interfacemethod`` decorator.
+
+  See `issue 3 <https://github.com/zopefoundation/zope.interface/issues/3>`_.
 
 5.0.2 (2020-03-30)
 ==================
diff --git a/docs/README.rst b/docs/README.rst
index 831f19a..b195331 100644
--- a/docs/README.rst
+++ b/docs/README.rst
@@ -299,6 +299,9 @@ Note that class decorators using the ``@implementer(IFoo)`` syntax are only
 supported in Python 2.6 and later.
 
 .. autofunction:: implementer
+   :noindex:
+
+   .. XXX: Duplicate description.
 
 Declaring provided interfaces
 -----------------------------
@@ -416,6 +419,9 @@ We can find out what interfaces are directly provided by an object:
   []
 
 .. autofunction:: provider
+   :noindex:
+
+   .. XXX: Duplicate description.
 
 Inherited declarations
 ----------------------
@@ -472,6 +478,7 @@ be used for this purpose:
   [<InterfaceClass builtins.IFoo>]
 
 .. autofunction:: classImplements
+   :noindex:
 
 We can use ``classImplementsOnly`` to exclude inherited interfaces:
 
@@ -485,7 +492,9 @@ We can use ``classImplementsOnly`` to exclude inherited interfaces:
   [<InterfaceClass builtins.ISpecial>]
 
 .. autofunction:: classImplementsOnly
+   :noindex:
 
+   .. XXX: Duplicate description.
 
 Declaration Objects
 -------------------
@@ -709,6 +718,8 @@ that lists the specification and all of it's ancestors:
 Tagged Values
 =============
 
+.. autofunction:: taggedValue
+
 Interfaces and attribute descriptions support an extension mechanism,
 borrowed from UML, called "tagged values" that lets us store extra
 data:
@@ -771,9 +782,12 @@ versions of functions.
    >>> IExtendsIWithTaggedValues.getDirectTaggedValue('squish')
    'SQUASH'
 
+
 Invariants
 ==========
 
+.. autofunction:: invariant
+
 Interfaces can express conditions that must hold for objects that
 provide them. These conditions are expressed using one or more
 invariants.  Invariants are callable objects that will be called with
@@ -849,7 +863,8 @@ Adaptation
 
 Interfaces can be called to perform adaptation.
 
-The semantics are based on those of the PEP 246 ``adapt`` function.
+The semantics are based on those of the  :pep:`246` ``adapt``
+function.
 
 If an object cannot be adapted, then a ``TypeError`` is raised:
 
@@ -883,7 +898,14 @@ If an object already implements the interface, then it will be returned:
   >>> I(obj) is obj
   True
 
-If an object implements ``__conform__``, then it will be used:
+:pep:`246` outlines a requirement:
+
+    When the object knows about the [interface], and either considers
+    itself compliant, or knows how to wrap itself suitably.
+
+This is handled with ``__conform__``. If an object implements
+``__conform__``, then it will be used to give the object the chance to
+decide if it knows about the interface.
 
 .. doctest::
 
@@ -895,7 +917,25 @@ If an object implements ``__conform__``, then it will be used:
   >>> I(C())
   0
 
-Adapter hooks (see ``__adapt__``) will also be used, if present:
+If ``__conform__`` returns ``None`` (because the object is unaware of
+the interface), then the rest of the adaptation process will continue.
+Here, we demonstrate that if the object already provides the
+interface, it is returned.
+
+.. doctest::
+
+  >>> @zope.interface.implementer(I)
+  ... class C(object):
+  ...     def __conform__(self, proto):
+  ...          return None
+
+  >>> c = C()
+  >>> I(c) is c
+  True
+
+
+Adapter hooks (see ``__adapt__``) will also be used, if present (after
+a ``__conform__`` method, if any, has been tried):
 
 .. doctest::
 
@@ -922,21 +962,28 @@ Adapter hooks (see ``__adapt__``) will also be used, if present:
   >>> class I(zope.interface.Interface):
   ...     pass
 
-Interfaces implement the PEP 246 ``__adapt__`` method.
+Interfaces implement the :pep:`246` ``__adapt__`` method to satisfy
+the requirement:
+
+    When the [interface] knows about the object, and either the object
+    already complies or the [interface] knows how to suitably wrap the
+    object.
 
-This method is normally not called directly. It is called by the PEP
-246 adapt framework and by the interface ``__call__`` operator.
+This method is normally not called directly. It is called by the
+:pep:`246` adapt framework and by the interface ``__call__`` operator
+once ``__conform__`` (if any) has failed.
 
 The ``adapt`` method is responsible for adapting an object to the
-reciever.
+receiver.
 
-The default version returns ``None``:
+The default version returns ``None`` (because by default no interface
+"knows how to suitably wrap the object"):
 
 .. doctest::
 
   >>> I.__adapt__(0)
 
-unless the object given provides the interface:
+unless the object given provides the interface ("the object already complies"):
 
 .. doctest::
 
@@ -975,6 +1022,30 @@ Hooks can be uninstalled by removing them from the list:
   >>> I.__adapt__(0)
 
 
+It is possible to replace or customize the ``__adapt___``
+functionality for particular interfaces.
+
+.. doctest::
+
+   >>> class ICustomAdapt(zope.interface.Interface):
+   ...     @zope.interface.interfacemethod
+   ...     def __adapt__(self, obj):
+   ...          if isinstance(obj, str):
+   ...              return obj
+   ...          return super(type(ICustomAdapt), self).__adapt__(obj)
+
+   >>> @zope.interface.implementer(ICustomAdapt)
+   ... class CustomAdapt(object):
+   ...     pass
+   >>> ICustomAdapt('a string')
+   'a string'
+   >>> ICustomAdapt(CustomAdapt())
+   <CustomAdapt object at ...>
+
+.. seealso:: :func:`zope.interface.interfacemethod`, which explains
+   how to override functions in interface definitions and why, prior
+   to Python 3.6, the zero-argument version of `super` cannot be used.
+
 .. [#create] The main reason we subclass ``Interface`` is to cause the
              Python class statement to create an interface, rather
              than a class.
diff --git a/docs/api/declarations.rst b/docs/api/declarations.rst
index 26847b0..fa265e7 100644
--- a/docs/api/declarations.rst
+++ b/docs/api/declarations.rst
@@ -18,6 +18,26 @@ carefully at each object it documents, including providing examples.
 
 .. currentmodule:: zope.interface
 
+Declaring Interfaces
+====================
+
+To declare an interface itself, extend the ``Interface`` base class.
+
+.. autointerface:: Interface
+   :noindex:
+
+.. autofunction:: taggedValue
+   :noindex:
+
+   .. documented more thoroughly in README.rst
+
+.. autofunction:: invariant
+   :noindex:
+
+   .. documented in README.rst
+
+.. autofunction:: interfacemethod
+
 Declaring The Interfaces of Objects
 ===================================
 
diff --git a/docs/conf.py b/docs/conf.py
index 464f652..59dac0d 100644
--- a/docs/conf.py
+++ b/docs/conf.py
@@ -264,6 +264,12 @@ texinfo_documents = [
 # Example configuration for intersphinx: refer to the Python standard library.
 intersphinx_mapping = {'https://docs.python.org/': None}
 
-autodoc_default_flags = ['members', 'show-inheritance']
-autoclass_content = 'both'
+# Sphinx 1.8+ prefers this to `autodoc_default_flags`. It's documented that
+# either True or None mean the same thing as just setting the flag, but
+# only None works in 1.8 (True works in 2.0)
+autodoc_default_options = {
+    'members': None,
+    'show-inheritance': None,
+}
 autodoc_member_order = 'bysource'
+autoclass_content = 'both'
diff --git a/src/zope/interface/__init__.py b/src/zope/interface/__init__.py
index e282fbd..3372103 100644
--- a/src/zope/interface/__init__.py
+++ b/src/zope/interface/__init__.py
@@ -49,7 +49,7 @@ The package has several public modules:
 See the module doc strings for more information.
 """
 __docformat__ = 'restructuredtext'
-
+# pylint:disable=wrong-import-position,unused-import
 from zope.interface.interface import Interface
 from zope.interface.interface import _wire
 
@@ -75,8 +75,11 @@ from zope.interface.declarations import named
 from zope.interface.declarations import noLongerProvides
 from zope.interface.declarations import providedBy
 from zope.interface.declarations import provider
+
 from zope.interface.exceptions import Invalid
+
 from zope.interface.interface import Attribute
+from zope.interface.interface import interfacemethod
 from zope.interface.interface import invariant
 from zope.interface.interface import taggedValue
 
diff --git a/src/zope/interface/_zope_interface_coptimizations.c b/src/zope/interface/_zope_interface_coptimizations.c
index 69f5bbc..346e7f2 100644
--- a/src/zope/interface/_zope_interface_coptimizations.c
+++ b/src/zope/interface/_zope_interface_coptimizations.c
@@ -49,6 +49,8 @@ static PyObject *str_registry, *strro, *str_generation, *strchanged;
 static PyObject *str__self__;
 static PyObject *str__module__;
 static PyObject *str__name__;
+static PyObject *str__adapt__;
+static PyObject *str_CALL_CUSTOM_ADAPT;
 
 static PyTypeObject *Implements;
 
@@ -796,7 +798,7 @@ static struct PyMethodDef ib_methods[] = {
 
 */
 static PyObject *
-ib_call(PyObject *self, PyObject *args, PyObject *kwargs)
+IB_call(PyObject *self, PyObject *args, PyObject *kwargs)
 {
   PyObject *conform, *obj, *alternate, *adapter;
   static char *kwlist[] = {"obj", "alternate", NULL};
@@ -835,7 +837,23 @@ ib_call(PyObject *self, PyObject *args, PyObject *kwargs)
       Py_DECREF(conform);
   }
 
-  adapter = __adapt__(self, obj); // XXX: should be self.__adapt__.
+  /* We differ from the Python code here. For speed, instead of always calling
+     self.__adapt__(), we check to see if the type has defined it. Checking in
+     the dict for __adapt__ isn't sufficient because there's no cheap way to
+     tell if it's the __adapt__ that InterfaceBase itself defines (our type
+     will *never* be InterfaceBase, we're always subclassed by
+     InterfaceClass). Instead, we cooperate with InterfaceClass in Python to
+     set a flag in a new subclass when this is necessary. */
+  if (PyDict_GetItem(self->ob_type->tp_dict, str_CALL_CUSTOM_ADAPT))
+  {
+      /* Doesn't matter what the value is. Simply being present is enough. */
+      adapter = PyObject_CallMethodObjArgs(self, str__adapt__, obj, NULL);
+  }
+  else
+  {
+      adapter = __adapt__(self, obj);
+  }
+
   if (adapter == NULL || adapter != Py_None)
   {
       return adapter;
@@ -1045,7 +1063,7 @@ static PyTypeObject InterfaceBaseType = {
         /* tp_as_sequence    */ 0,
         /* tp_as_mapping     */ 0,
         /* tp_hash           */ (hashfunc)IB_hash,
-        /* tp_call           */ (ternaryfunc)ib_call,
+        /* tp_call           */ (ternaryfunc)IB_call,
         /* tp_str            */ (reprfunc)0,
         /* tp_getattro       */ (getattrofunc)0,
         /* tp_setattro       */ (setattrofunc)0,
@@ -2023,6 +2041,8 @@ init(void)
   DEFINE_STRING(__self__);
   DEFINE_STRING(__name__);
   DEFINE_STRING(__module__);
+  DEFINE_STRING(__adapt__);
+  DEFINE_STRING(_CALL_CUSTOM_ADAPT);
 #undef DEFINE_STRING
   adapter_hooks = PyList_New(0);
   if (adapter_hooks == NULL)
diff --git a/src/zope/interface/common/__init__.py b/src/zope/interface/common/__init__.py
index a8bedf0..01f0bd3 100644
--- a/src/zope/interface/common/__init__.py
+++ b/src/zope/interface/common/__init__.py
@@ -259,5 +259,5 @@ class ABCInterfaceClass(InterfaceClass):
         return set(itertools.chain(registered, self.__extra_classes))
 
 
-ABCInterface = ABCInterfaceClass.__new__(ABCInterfaceClass, None, None, None)
+ABCInterface = ABCInterfaceClass.__new__(ABCInterfaceClass, 'ABCInterface', (), {})
 InterfaceClass.__init__(ABCInterface, 'ABCInterface', (Interface,), {})
diff --git a/src/zope/interface/interface.py b/src/zope/interface/interface.py
index d035ade..f819441 100644
--- a/src/zope/interface/interface.py
+++ b/src/zope/interface/interface.py
@@ -20,6 +20,7 @@ from types import FunctionType
 import weakref
 
 from zope.interface._compat import _use_c_impl
+from zope.interface._compat import PYTHON2 as PY2
 from zope.interface.exceptions import Invalid
 from zope.interface.ro import ro as calculate_ro
 from zope.interface import ro
@@ -36,7 +37,10 @@ __all__ = [
 
 CO_VARARGS = 4
 CO_VARKEYWORDS = 8
+# Put in the attrs dict of an interface by ``taggedValue`` and ``invariants``
 TAGGED_DATA = '__interface_tagged_values__'
+# Put in the attrs dict of an interface by ``interfacemethod``
+INTERFACE_METHODS = '__interface_methods__'
 
 _decorator_non_return = object()
 _marker = object()
@@ -651,6 +655,24 @@ _InterfaceClassBase = _InterfaceMetaClass(
 )
 
 
+def interfacemethod(func):
+    """
+    Convert a method specification to an actual method of the interface.
+
+    This is a decorator that functions like `staticmethod` et al.
+
+    The primary use of this decorator is to allow interface definitions to
+    define the ``__adapt__`` method, but other interface methods can be
+    overridden this way too.
+
+    .. seealso:: `zope.interface.interfaces.IInterfaceDeclaration.interfacemethod`
+    """
+    f_locals = sys._getframe(1).f_locals
+    methods = f_locals.setdefault(INTERFACE_METHODS, {})
+    methods[func.__name__] = func
+    return _decorator_non_return
+
+
 class InterfaceClass(_InterfaceClassBase):
     """
     Prototype (scarecrow) Interfaces Implementation.
@@ -664,6 +686,57 @@ class InterfaceClass(_InterfaceClassBase):
     #
     #implements(IInterface)
 
+    def __new__(cls, name=None, bases=(), attrs=None, __doc__=None, # pylint:disable=redefined-builtin
+                __module__=None):
+        assert isinstance(bases, tuple)
+        attrs = attrs or {}
+        needs_custom_class = attrs.pop(INTERFACE_METHODS, None)
+        if needs_custom_class:
+            needs_custom_class.update(
+                {'__classcell__': attrs.pop('__classcell__')}
+                if '__classcell__' in attrs
+                else {}
+            )
+            if '__adapt__' in needs_custom_class:
+                # We need to tell the C code to call this.
+                needs_custom_class['_CALL_CUSTOM_ADAPT'] = 1
+
+            if issubclass(cls, _InterfaceClassWithCustomMethods):
+                cls_bases = (cls,)
+            elif cls is InterfaceClass:
+                cls_bases = (_InterfaceClassWithCustomMethods,)
+            else:
+                cls_bases = (cls, _InterfaceClassWithCustomMethods)
+
+            cls = type(cls)( # pylint:disable=self-cls-assignment
+                name + "<WithCustomMethods>",
+                cls_bases,
+                needs_custom_class
+            )
+        elif PY2 and bases and len(bases) > 1:
+            bases_with_custom_methods = tuple(
+                type(b)
+                for b in bases
+                if issubclass(type(b), _InterfaceClassWithCustomMethods)
+            )
+
+            # If we have a subclass of InterfaceClass in *bases*,
+            # Python 3 is smart enough to pass that as *cls*, but Python
+            # 2 just passes whatever the first base in *bases* is. This means that if
+            # we have multiple inheritance, and one of our bases has already defined
+            # a custom method like ``__adapt__``, we do the right thing automatically
+            # and extend it on Python 3, but not necessarily on Python 2. To fix this, we need
+            # to run the MRO algorithm and get the most derived base manually.
+            # Note that this only works for consistent resolution orders
+            if bases_with_custom_methods:
+                cls = type( # pylint:disable=self-cls-assignment
+                    name + "<WithCustomMethods>",
+                    bases_with_custom_methods,
+                    {}
+                ).__mro__[1] # Not the class we created, the most derived.
+
+        return _InterfaceClassBase.__new__(cls)
+
     def __init__(self, name, bases=(), attrs=None, __doc__=None,  # pylint:disable=redefined-builtin
                  __module__=None):
         # We don't call our metaclass parent directly
@@ -738,7 +811,7 @@ class InterfaceClass(_InterfaceClassBase):
                 # __qualname__: PEP 3155 (Python 3.3+)
                 '__qualname__',
                 # __annotations__: PEP 3107 (Python 3.0+)
-                '__annotations__'
+                '__annotations__',
             )
             and aval is not _decorator_non_return
         }
@@ -889,6 +962,11 @@ assert Interface.__sro__ == (Interface,)
 Specification._ROOT = Interface
 ro._ROOT = Interface
 
+class _InterfaceClassWithCustomMethods(InterfaceClass):
+    """
+    Marker class for interfaces with custom methods that override InterfaceClass methods.
+    """
+
 
 class Attribute(Element):
     """Attribute descriptions
diff --git a/src/zope/interface/interfaces.py b/src/zope/interface/interfaces.py
index cb455e0..9334374 100644
--- a/src/zope/interface/interfaces.py
+++ b/src/zope/interface/interfaces.py
@@ -451,46 +451,134 @@ class IDeclaration(ISpecification):
         """
 
 class IInterfaceDeclaration(Interface):
-    """Declare and check the interfaces of objects
+    """
+    Declare and check the interfaces of objects.
 
     The functions defined in this interface are used to declare the
-    interfaces that objects provide and to query the interfaces that have
-    been declared.
+    interfaces that objects provide and to query the interfaces that
+    have been declared.
 
     Interfaces can be declared for objects in two ways:
 
-    - Interfaces are declared for instances of the object's class
+        - Interfaces are declared for instances of the object's class
 
-    - Interfaces are declared for the object directly.
+        - Interfaces are declared for the object directly.
 
     The interfaces declared for an object are, therefore, the union of
     interfaces declared for the object directly and the interfaces
     declared for instances of the object's class.
 
     Note that we say that a class implements the interfaces provided
-    by it's instances.  An instance can also provide interfaces
-    directly.  The interfaces provided by an object are the union of
+    by it's instances. An instance can also provide interfaces
+    directly. The interfaces provided by an object are the union of
     the interfaces provided directly and the interfaces implemented by
     the class.
+
+    This interface is implemented by :mod:`zope.interface`.
     """
 
+    ###
+    # Defining interfaces
+    ###
+
+    Interface = Attribute("The base class used to create new interfaces")
+
+    def taggedValue(key, value):
+        """
+        Attach a tagged value to an interface while defining the interface.
+
+        This is a way of executing :meth:`IElement.setTaggedValue` from
+        the definition of the interface. For example::
+
+             class IFoo(Interface):
+                 taggedValue('key', 'value')
+
+        .. seealso:: `zope.interface.taggedValue`
+        """
+
+    def invariant(checker_function):
+        """
+        Attach an invariant checker function to an interface while defining it.
+
+        Invariants can later be validated against particular implementations by
+        calling :meth:`IInterface.validateInvariants`.
+
+        For example::
+
+             def check_range(ob):
+                 if ob.max < ob.min:
+                     raise ValueError("max value is less than min value")
+
+             class IRange(Interface):
+                 min = Attribute("The min value")
+                 max = Attribute("The max value")
+
+                 invariant(check_range)
+
+        .. seealso:: `zope.interface.invariant`
+        """
+
+    def interfacemethod(method):
+        """
+        A decorator that transforms a method specification into an
+        implementation method.
+
+        This is used to override methods of ``Interface`` or provide new methods.
+        Definitions using this decorator will not appear in :meth:`IInterface.names()`.
+        It is possible to have an implementation method and a method specification
+        of the same name.
+
+        For example::
+
+             class IRange(Interface):
+                 @interfacemethod
+                 def __adapt__(self, obj):
+                     if isinstance(obj, range):
+                         # Return the builtin ``range`` as-is
+                         return obj
+                     return super(type(IRange), self).__adapt__(obj)
+
+        You can use ``super`` to call the parent class functionality. Note that
+        the zero-argument version (``super().__adapt__``) works on Python 3.6 and above, but
+        prior to that the two-argument version must be used, and the class must be explicitly
+        passed as the first argument.
+
+        .. versionadded:: 5.1.0
+        .. seealso:: `zope.interface.interfacemethod`
+        """
+
+    ###
+    # Querying interfaces
+    ###
+
     def providedBy(ob):
-        """Return the interfaces provided by an object
+        """
+        Return the interfaces provided by an object.
 
         This is the union of the interfaces directly provided by an
         object and interfaces implemented by it's class.
 
         The value returned is an `IDeclaration`.
+
+        .. seealso:: `zope.interface.providedBy`
         """
 
     def implementedBy(class_):
-        """Return the interfaces implemented for a class' instances
+        """
+        Return the interfaces implemented for a class's instances.
 
         The value returned is an `IDeclaration`.
+
+        .. seealso:: `zope.interface.implementedBy`
         """
 
+    ###
+    # Declaring interfaces
+    ###
+
     def classImplements(class_, *interfaces):
-        """Declare additional interfaces implemented for instances of a class
+        """
+        Declare additional interfaces implemented for instances of a class.
 
         The arguments after the class are one or more interfaces or
         interface specifications (`IDeclaration` objects).
@@ -508,7 +596,14 @@ class IInterfaceDeclaration(Interface):
 
 
         Instances of ``C`` provide ``I1``, ``I2``, and whatever interfaces
-        instances of ``A`` and ``B`` provide.
+        instances of ``A`` and ``B`` provide. This is equivalent to::
+
+            @implementer(I1, I2)
+            class C(A, B):
+                pass
+
+        .. seealso:: `zope.interface.classImplements`
+        .. seealso:: `zope.interface.implementer`
         """
 
     def classImplementsFirst(cls, interface):
@@ -517,14 +612,19 @@ class IInterfaceDeclaration(Interface):
         """
 
     def implementer(*interfaces):
-        """Create a decorator for declaring interfaces implemented by a factory.
+        """
+        Create a decorator for declaring interfaces implemented by a
+        factory.
 
         A callable is returned that makes an implements declaration on
         objects passed to it.
+
+        .. seealso:: :meth:`classImplements`
         """
 
     def classImplementsOnly(class_, *interfaces):
-        """Declare the only interfaces implemented by instances of a class
+        """
+        Declare the only interfaces implemented by instances of a class.
 
         The arguments after the class are one or more interfaces or
         interface specifications (`IDeclaration` objects).
@@ -542,30 +642,41 @@ class IInterfaceDeclaration(Interface):
 
         Instances of ``C`` provide only ``I1``, ``I2``, and regardless of
         whatever interfaces instances of ``A`` and ``B`` implement.
+
+        .. seealso:: `zope.interface.classImplementsOnly`
         """
 
     def implementer_only(*interfaces):
-        """Create a decorator for declaring the only interfaces implemented
+        """
+        Create a decorator for declaring the only interfaces implemented.
 
         A callable is returned that makes an implements declaration on
         objects passed to it.
+
+        .. seealso:: `zope.interface.implementer_only`
         """
 
     def directlyProvidedBy(object):
-        """Return the interfaces directly provided by the given object
+        """
+        Return the interfaces directly provided by the given object.
 
         The value returned is an `IDeclaration`.
+
+        .. seealso:: `zope.interface.directlyProvidedBy`
         """
 
     def directlyProvides(object, *interfaces):
-        """Declare interfaces declared directly for an object
+        """
+        Declare interfaces declared directly for an object.
 
         The arguments after the object are one or more interfaces or
         interface specifications (`IDeclaration` objects).
 
-        The interfaces given (including the interfaces in the
-        specifications) replace interfaces previously
-        declared for the object.
+        .. caution::
+           The interfaces given (including the interfaces in the
+           specifications) *replace* interfaces previously
+           declared for the object. See :meth:`alsoProvides` to add
+           additional interfaces.
 
         Consider the following example::
 
@@ -594,21 +705,31 @@ class IInterfaceDeclaration(Interface):
           directlyProvides(ob, directlyProvidedBy(ob), I2)
 
         adds I2 to the interfaces directly provided by ob.
+
+        .. seealso:: `zope.interface.directlyProvides`
         """
 
     def alsoProvides(object, *interfaces):
-        """Declare additional interfaces directly for an object::
+        """
+        Declare additional interfaces directly for an object.
+
+        For example::
 
           alsoProvides(ob, I1)
 
         is equivalent to::
 
           directlyProvides(ob, directlyProvidedBy(ob), I1)
+
+        .. seealso:: `zope.interface.alsoProvides`
         """
 
     def noLongerProvides(object, interface):
-        """Remove an interface from the list of an object's directly
-        provided interfaces::
+        """
+        Remove an interface from the list of an object's directly provided
+        interfaces.
+
+        For example::
 
           noLongerProvides(ob, I1)
 
@@ -619,10 +740,17 @@ class IInterfaceDeclaration(Interface):
         with the exception that if ``I1`` is an interface that is
         provided by ``ob`` through the class's implementation,
         `ValueError` is raised.
+
+        .. seealso:: `zope.interface.noLongerProvides`
         """
 
     def implements(*interfaces):
-        """Declare interfaces implemented by instances of a class
+        """
+        Declare interfaces implemented by instances of a class.
+
+        .. deprecated:: 5.0
+           This only works for Python 2. The `implementer` decorator
+           is preferred for all versions.
 
         This function is called in a class definition (Python 2.x only).
 
@@ -655,14 +783,15 @@ class IInterfaceDeclaration(Interface):
 
         Instances of ``C`` implement ``I1``, ``I2``, and whatever interfaces
         instances of ``A`` and ``B`` implement.
-
-        .. deprecated:: 5.0
-           This only works for Python 2. The `implementer` decorator
-           is preferred for all versions.
         """
 
     def implementsOnly(*interfaces):
-        """Declare the only interfaces implemented by instances of a class
+        """
+        Declare the only interfaces implemented by instances of a class.
+
+        .. deprecated:: 5.0
+           This only works for Python 2. The `implementer_only` decorator
+           is preferred for all versions.
 
         This function is called in a class definition (Python 2.x only).
 
@@ -691,14 +820,15 @@ class IInterfaceDeclaration(Interface):
 
         Instances of ``C`` implement ``I1``, ``I2``, regardless of what
         instances of ``A`` and ``B`` implement.
-
-        .. deprecated:: 5.0
-           This only works for Python 2. The `implementer_only` decorator
-           is preferred for all versions.
         """
 
     def classProvides(*interfaces):
-        """Declare interfaces provided directly by a class
+        """
+        Declare interfaces provided directly by a class.
+
+        .. deprecated:: 5.0
+           This only works for Python 2. The `provider` decorator
+           is preferred for all versions.
 
         This function is called in a class definition.
 
@@ -725,17 +855,18 @@ class IInterfaceDeclaration(Interface):
           directlyProvides(theclass, I1)
 
         after the class has been created.
-
-        .. deprecated:: 5.0
-           This only works for Python 2. The `provider` decorator
-           is preferred for all versions.
         """
 
     def provider(*interfaces):
-        """A class decorator version of `classProvides`"""
+        """
+        A class decorator version of `classProvides`.
+
+        .. seealso:: `zope.interface.provider`
+        """
 
     def moduleProvides(*interfaces):
-        """Declare interfaces provided by a module
+        """
+        Declare interfaces provided by a module.
 
         This function is used in a module definition.
 
@@ -757,16 +888,21 @@ class IInterfaceDeclaration(Interface):
         is equivalent to::
 
           directlyProvides(sys.modules[__name__], I1)
+
+        .. seealso:: `zope.interface.moduleProvides`
         """
 
     def Declaration(*interfaces):
-        """Create an interface specification
+        """
+        Create an interface specification.
 
         The arguments are one or more interfaces or interface
         specifications (`IDeclaration` objects).
 
-        A new interface specification (`IDeclaration`) with
-        the given interfaces is returned.
+        A new interface specification (`IDeclaration`) with the given
+        interfaces is returned.
+
+        .. seealso:: `zope.interface.Declaration`
         """
 
 class IAdapterRegistry(Interface):

Optimized version of InterfaceBase doesn't use interface's __adapt__
In https://bugs.launchpad.net/zope.interface/+bug/98488, Ben Artin reported:

> According to zope.interface documentation, the `__call__` of an interface should use `__adapt__` in the interface to attempt to adapt the object. This is not so with the optimized C version of `InterfaceBase`:

```
from zope.interface import Interface
class Test(Interface):
    pass
def adapt(*args, **kwargs):
    return 17
from new import instancemethod
Test.__adapt__ = instancemethod(adapt, Test)
print Test.__adapt__(1) # prints 17
Test(1) # Generates an exception
```

> This is not how `InterfaceBasePy.__call__` behaves -- it uses `interface.__adapt__`, which can be customized for each interface. This discrepancy between `InterfaceBasePy` and the C-optimized `InterfaceBase` should be eliminated; I believe that the behavior of `InterfaceBase` should change to match that of `InterfaceBasePy`.

@ctheune followed up:

> `__adapt__` is not documented in IInterface. However, the tests say that we do this and respect PEP 246 behaviour.

diff --git a/src/zope/interface/tests/test_adapter.py b/src/zope/interface/tests/test_adapter.py
index 869df66..8ff96f0 100644
--- a/src/zope/interface/tests/test_adapter.py
+++ b/src/zope/interface/tests/test_adapter.py
@@ -796,12 +796,12 @@ class AdapterLookupBaseTests(unittest.TestCase):
         from zope.interface import Interface
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry(IFoo, IBar)
         alb = self._makeOne(registry)
         self.assertEqual(sorted(alb._extendors.keys()),
                          sorted([IBar, IFoo, Interface]))
-        self.assertEqual(alb._extendors[IFoo], [IFoo])
+        self.assertEqual(alb._extendors[IFoo], [IFoo, IBar])
         self.assertEqual(alb._extendors[IBar], [IBar])
         self.assertEqual(sorted(alb._extendors[Interface]),
                          sorted([IFoo, IBar]))
@@ -847,14 +847,14 @@ class AdapterLookupBaseTests(unittest.TestCase):
         from zope.interface import Interface
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry()
         alb = self._makeOne(registry)
         registry._provided = [IFoo, IBar]
         alb.init_extendors()
         self.assertEqual(sorted(alb._extendors.keys()),
                          sorted([IBar, IFoo, Interface]))
-        self.assertEqual(alb._extendors[IFoo], [IFoo])
+        self.assertEqual(alb._extendors[IFoo], [IFoo, IBar])
         self.assertEqual(alb._extendors[IBar], [IBar])
         self.assertEqual(sorted(alb._extendors[Interface]),
                          sorted([IFoo, IBar]))
@@ -863,14 +863,14 @@ class AdapterLookupBaseTests(unittest.TestCase):
         from zope.interface import Interface
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry()
         alb = self._makeOne(registry)
         alb.add_extendor(IFoo)
         alb.add_extendor(IBar)
         self.assertEqual(sorted(alb._extendors.keys()),
                          sorted([IBar, IFoo, Interface]))
-        self.assertEqual(alb._extendors[IFoo], [IFoo])
+        self.assertEqual(alb._extendors[IFoo], [IFoo, IBar])
         self.assertEqual(alb._extendors[IBar], [IBar])
         self.assertEqual(sorted(alb._extendors[Interface]),
                          sorted([IFoo, IBar]))
@@ -879,13 +879,13 @@ class AdapterLookupBaseTests(unittest.TestCase):
         from zope.interface import Interface
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry(IFoo, IBar)
         alb = self._makeOne(registry)
         alb.remove_extendor(IFoo)
         self.assertEqual(sorted(alb._extendors.keys()),
                          sorted([IFoo, IBar, Interface]))
-        self.assertEqual(alb._extendors[IFoo], [])
+        self.assertEqual(alb._extendors[IFoo], [IBar])
         self.assertEqual(alb._extendors[IBar], [IBar])
         self.assertEqual(sorted(alb._extendors[Interface]),
                          sorted([IBar]))
@@ -895,7 +895,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_lookup_empty_ro(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry()
         alb = self._makeOne(registry)
         result = alb._uncached_lookup((IFoo,), IBar)
@@ -906,7 +906,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_lookup_order_miss(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
         registry.ro.append(subr)
@@ -917,7 +917,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_lookup_extendors_miss(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry()
         subr = self._makeSubregistry()
         subr._adapters = [{}, {}] #utilities, single adapters
@@ -930,7 +930,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_lookup_components_miss_wrong_iface(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         IQux = InterfaceClass('IQux')
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
@@ -949,7 +949,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_lookup_components_miss_wrong_name(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
 
@@ -968,7 +968,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_lookup_simple_hit(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
         _expected = object()
@@ -985,7 +985,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_lookup_repeated_hit(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
         _expected = object()
@@ -1005,7 +1005,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
         from zope.interface.declarations import implementer
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         @implementer(IFoo)
         class Foo(object):
             pass
@@ -1051,7 +1051,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
         from zope.interface.declarations import implementer
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         @implementer(IFoo)
         class Foo(object):
             pass
@@ -1080,7 +1080,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
         from zope.interface.declarations import implementer
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         @implementer(IFoo)
         class Foo(object):
             pass
@@ -1131,7 +1131,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_lookupAll_empty_ro(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry()
         alb = self._makeOne(registry)
         result = alb._uncached_lookupAll((IFoo,), IBar)
@@ -1142,7 +1142,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_lookupAll_order_miss(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
         registry.ro.append(subr)
@@ -1154,7 +1154,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_lookupAll_extendors_miss(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry()
         subr = self._makeSubregistry()
         subr._adapters = [{}, {}] #utilities, single adapters
@@ -1167,7 +1167,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_lookupAll_components_miss(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         IQux = InterfaceClass('IQux')
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
@@ -1185,7 +1185,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_lookupAll_simple_hit(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
         _expected = object()
@@ -1203,7 +1203,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test_names(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
         _expected = object()
@@ -1222,7 +1222,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_subscriptions_empty_ro(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry()
         alb = self._makeOne(registry)
         result = alb._uncached_subscriptions((IFoo,), IBar)
@@ -1233,7 +1233,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_subscriptions_order_miss(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
         registry.ro.append(subr)
@@ -1245,7 +1245,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_subscriptions_extendors_miss(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry()
         subr = self._makeSubregistry()
         subr._subscribers = [{}, {}] #utilities, single adapters
@@ -1258,7 +1258,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_subscriptions_components_miss_wrong_iface(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         IQux = InterfaceClass('IQux')
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
@@ -1276,7 +1276,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_subscriptions_components_miss_wrong_name(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
         wrongname = object()
@@ -1293,7 +1293,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
     def test__uncached_subscriptions_simple_hit(self):
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         registry = self._makeRegistry(IFoo, IBar)
         subr = self._makeSubregistry()
         class Foo(object):
@@ -1314,7 +1314,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
         from zope.interface.declarations import implementer
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         @implementer(IFoo)
         class Foo(object):
             pass
@@ -1343,7 +1343,7 @@ class AdapterLookupBaseTests(unittest.TestCase):
         from zope.interface.declarations import implementer
         from zope.interface.interface import InterfaceClass
         IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar', IFoo)
+        IBar = InterfaceClass('IBar', (IFoo,))
         @implementer(IFoo)
         class Foo(object):
             pass
diff --git a/src/zope/interface/tests/test_declarations.py b/src/zope/interface/tests/test_declarations.py
index 5d7272a..83815d7 100644
--- a/src/zope/interface/tests/test_declarations.py
+++ b/src/zope/interface/tests/test_declarations.py
@@ -864,25 +864,30 @@ class Test_classImplements(unittest.TestCase):
     def test_w_existing_Implements_w_bases(self):
         from zope.interface.declarations import Implements
         from zope.interface.interface import InterfaceClass
-        IFoo = InterfaceClass('IFoo')
-        IBar = InterfaceClass('IBar')
-        IBaz = InterfaceClass('IBaz', IFoo)
-        b_impl = Implements(IBaz)
-        impl = Implements(IFoo)
-        impl.declared = (IFoo,)
-        class Base1(object):
-            __implemented__ = b_impl
-        class Base2(object):
-            __implemented__ = b_impl
-        class Foo(Base1, Base2):
-            __implemented__ = impl
-        impl.inherit = Foo
-        self._callFUT(Foo, IBar)
+        IRoot = InterfaceClass('IRoot')
+        ISecondRoot = InterfaceClass('ISecondRoot')
+        IExtendsRoot = InterfaceClass('IExtendsRoot', (IRoot,))
+
+        impl_root = Implements.named('Root', IRoot)
+        impl_root.declared = (IRoot,)
+
+        class Root1(object):
+            __implemented__ = impl_root
+        class Root2(object):
+            __implemented__ = impl_root
+
+        impl_extends_root = Implements.named('ExtendsRoot1', IExtendsRoot)
+        impl_extends_root.declared = (IExtendsRoot,)
+        class ExtendsRoot(Root1, Root2):
+            __implemented__ = impl_extends_root
+        impl_extends_root.inherit = ExtendsRoot
+
+        self._callFUT(ExtendsRoot, ISecondRoot)
         # Same spec, now different values
-        self.assertTrue(Foo.__implemented__ is impl)
-        self.assertEqual(impl.inherit, Foo)
-        self.assertEqual(impl.declared, (IFoo, IBar,))
-        self.assertEqual(impl.__bases__, (IFoo, IBar, b_impl))
+        self.assertIs(ExtendsRoot.__implemented__, impl_extends_root)
+        self.assertEqual(impl_extends_root.inherit, ExtendsRoot)
+        self.assertEqual(impl_extends_root.declared, (IExtendsRoot, ISecondRoot,))
+        self.assertEqual(impl_extends_root.__bases__, (IExtendsRoot, ISecondRoot, impl_root))
 
 
 class Test__implements_advice(unittest.TestCase):
diff --git a/src/zope/interface/tests/test_interface.py b/src/zope/interface/tests/test_interface.py
index 2100340..036e858 100644
--- a/src/zope/interface/tests/test_interface.py
+++ b/src/zope/interface/tests/test_interface.py
@@ -1318,9 +1318,9 @@ class InterfaceTests(unittest.TestCase):
 
         new = Interface.__class__
         FunInterface = new('FunInterface')
-        BarInterface = new('BarInterface', [FunInterface])
+        BarInterface = new('BarInterface', (FunInterface,))
         BobInterface = new('BobInterface')
-        BazInterface = new('BazInterface', [BobInterface, BarInterface])
+        BazInterface = new('BazInterface', (BobInterface, BarInterface,))
 
         self.assertTrue(BazInterface.extends(BobInterface))
         self.assertTrue(BazInterface.extends(BarInterface))
@@ -2161,6 +2161,165 @@ class InterfaceTests(unittest.TestCase):
         finally:
             adapter_hooks[:] = old_adapter_hooks
 
+    def test___call___w_overridden_adapt(self):
+        from zope.interface import Interface
+        from zope.interface import interfacemethod
+        from zope.interface import implementer
+
+        class I(Interface):
+
+            @interfacemethod
+            def __adapt__(self, obj):
+                return 42
+
+        @implementer(I)
+        class O(object):
+            pass
+
+        self.assertEqual(42, I(object()))
+        # __adapt__ can ignore the fact that the object provides
+        # the interface if it chooses.
+        self.assertEqual(42, I(O()))
+
+    def test___call___w_overridden_adapt_and_conform(self):
+        # Conform is first, taking precedence over __adapt__,
+        # *if* it returns non-None
+        from zope.interface import Interface
+        from zope.interface import interfacemethod
+        from zope.interface import implementer
+
+        class IAdapt(Interface):
+            @interfacemethod
+            def __adapt__(self, obj):
+                return 42
+
+        class ISimple(Interface):
+            """Nothing special."""
+
+        @implementer(IAdapt)
+        class Conform24(object):
+            def __conform__(self, iface):
+                return 24
+
+        @implementer(IAdapt)
+        class ConformNone(object):
+            def __conform__(self, iface):
+                return None
+
+        self.assertEqual(42, IAdapt(object()))
+
+        self.assertEqual(24, ISimple(Conform24()))
+        self.assertEqual(24, IAdapt(Conform24()))
+
+        with self.assertRaises(TypeError):
+            ISimple(ConformNone())
+
+        self.assertEqual(42, IAdapt(ConformNone()))
+
+
+    def test___call___w_overridden_adapt_call_super(self):
+        import sys
+        from zope.interface import Interface
+        from zope.interface import interfacemethod
+        from zope.interface import implementer
+
+        class I(Interface):
+
+            @interfacemethod
+            def __adapt__(self, obj):
+                if not self.providedBy(obj):
+                    return 42
+                if sys.version_info[:2] > (3, 5):
+                    # Python 3.5 raises 'RuntimeError: super() __class__ is not a type'
+                    return super().__adapt__(obj)
+
+                return super(type(I), self).__adapt__(obj)
+
+        @implementer(I)
+        class O(object):
+            pass
+
+        self.assertEqual(42, I(object()))
+        o = O()
+        self.assertIs(o, I(o))
+
+    def test___adapt___as_method_and_implementation(self):
+        from zope.interface import Interface
+        from zope.interface import interfacemethod
+
+        class I(Interface):
+            @interfacemethod
+            def __adapt__(self, obj):
+                return 42
+
+            def __adapt__(to_adapt):
+                "This is a protocol"
+
+        self.assertEqual(42, I(object()))
+        self.assertEqual(I['__adapt__'].getSignatureString(), '(to_adapt)')
+
+    def test___adapt__inheritance_and_type(self):
+        from zope.interface import Interface
+        from zope.interface import interfacemethod
+
+        class IRoot(Interface):
+            """Root"""
+
+        class IWithAdapt(IRoot):
+            @interfacemethod
+            def __adapt__(self, obj):
+                return 42
+
+        class IOther(IRoot):
+            """Second branch"""
+
+        class IUnrelated(Interface):
+            """Unrelated"""
+
+        class IDerivedAdapt(IUnrelated, IWithAdapt, IOther):
+            """Inherits an adapt"""
+            # Order of "inheritance" matters here.
+
+        class IDerived2Adapt(IDerivedAdapt):
+            """Overrides an inherited custom adapt."""
+            @interfacemethod
+            def __adapt__(self, obj):
+                return 24
+
+        self.assertEqual(42, IDerivedAdapt(object()))
+        for iface in IRoot, IWithAdapt, IOther, IUnrelated, IDerivedAdapt:
+            self.assertEqual(__name__, iface.__module__)
+
+        for iface in IRoot, IOther, IUnrelated:
+            self.assertEqual(type(IRoot), type(Interface))
+
+        # But things that implemented __adapt__ got a new type
+        self.assertNotEqual(type(Interface), type(IWithAdapt))
+        self.assertEqual(type(IWithAdapt), type(IDerivedAdapt))
+        self.assertIsInstance(IWithAdapt, type(Interface))
+
+        self.assertEqual(24, IDerived2Adapt(object()))
+        self.assertNotEqual(type(IDerived2Adapt), type(IDerivedAdapt))
+        self.assertIsInstance(IDerived2Adapt, type(IDerivedAdapt))
+
+    def test_interfacemethod_is_general(self):
+        from zope.interface import Interface
+        from zope.interface import interfacemethod
+
+        class I(Interface):
+
+            @interfacemethod
+            def __call__(self, obj):
+                """Replace an existing method"""
+                return 42
+
+            @interfacemethod
+            def this_is_new(self):
+                return 42
+
+        self.assertEqual(I(self), 42)
+        self.assertEqual(I.this_is_new(), 42)
+
 
 class AttributeTests(ElementTests):
 

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest coverage Sphinx repoze.sphinx.autointerface
apt-get update apt-get install -y gcc
3.9
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.16
babel==2.17.0
certifi==2025.1.31
charset-normalizer==3.4.1
coverage==7.8.0
docutils==0.21.2
exceptiongroup==1.2.2
idna==3.10
imagesize==1.4.1
importlib_metadata==8.6.1
iniconfig==2.1.0
Jinja2==3.1.6
MarkupSafe==3.0.2
packaging==24.2
pluggy==1.5.0
Pygments==2.19.1
pytest==8.3.5
repoze.sphinx.autointerface==1.0.0
requests==2.32.3
snowballstemmer==2.2.0
Sphinx==7.4.7
sphinxcontrib-applehelp==2.0.0
sphinxcontrib-devhelp==2.0.0
sphinxcontrib-htmlhelp==2.1.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==2.0.0
sphinxcontrib-serializinghtml==2.0.0
tomli==2.2.1
urllib3==2.3.0
zipp==3.21.0
-e git+https://github.com/zopefoundation/zope.interface.git@6c2f71487eed46896647edc9dc770f1fd5da823b#egg=zope.interface

name: zope.interface
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=3.0.16=h5eee18b_0
  - pip=25.0=py39h06a4308_0
  - python=3.9.21=he870216_1
  - readline=8.2=h5eee18b_0
  - setuptools=75.8.0=py39h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.16
      - babel==2.17.0
      - certifi==2025.1.31
      - charset-normalizer==3.4.1
      - coverage==7.8.0
      - docutils==0.21.2
      - exceptiongroup==1.2.2
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==8.6.1
      - iniconfig==2.1.0
      - jinja2==3.1.6
      - markupsafe==3.0.2
      - packaging==24.2
      - pluggy==1.5.0
      - pygments==2.19.1
      - pytest==8.3.5
      - repoze-sphinx-autointerface==1.0.0
      - requests==2.32.3
      - snowballstemmer==2.2.0
      - sphinx==7.4.7
      - sphinxcontrib-applehelp==2.0.0
      - sphinxcontrib-devhelp==2.0.0
      - sphinxcontrib-htmlhelp==2.1.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==2.0.0
      - sphinxcontrib-serializinghtml==2.0.0
      - tomli==2.2.1
      - urllib3==2.3.0
      - zipp==3.21.0
prefix: /opt/conda/envs/zope.interface

src/zope/interface/tests/test_interface.py::InterfaceTests::test_interfacemethod_is_general
src/zope/interface/tests/test_interface.py::InterfaceTests::test___adapt___as_method_and_implementation src/zope/interface/tests/test_interface.py::InterfaceTests::test___adapt__inheritance_and_type src/zope/interface/tests/test_interface.py::InterfaceTests::test___call___w_overridden_adapt src/zope/interface/tests/test_interface.py::InterfaceTests::test___call___w_overridden_adapt_and_conform src/zope/interface/tests/test_interface.py::InterfaceTests::test___call___w_overridden_adapt_call_super
src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test__generation_after_calling_changed src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test__generation_after_changing___bases__ src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test__generation_on_first_creation src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_lookup_delegation src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_register src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_register_with_invalid_name src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_register_with_same_value src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_register_with_value_None_unregisters src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_registered_empty src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_registered_non_empty_hit src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_registered_non_empty_miss src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unregister_empty src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unregister_hit_clears_empty_subcomponents src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unregister_non_empty_miss_on_name src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unregister_non_empty_miss_on_required src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unregister_with_value_not_None_miss src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_after_multiple src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_empty src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_hit src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_instance_method src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_non_empty_miss_on_required src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_non_empty_miss_on_value src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_w_None_after_multiple src/zope/interface/tests/test_adapter.py::BaseAdapterRegistryTests::test_unsubscribe_with_value_not_None_miss src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_adapter_hook_hit_factory_returns_None src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_adapter_hook_hit_factory_returns_adapter src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_adapter_hook_miss_no_default src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_adapter_hook_miss_w_default src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_adapter_hook_super_unwraps src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_adapter_hook_w_invalid_name src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_cached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_miss_no_default src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_miss_w_default src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_miss_w_default_negative_cache src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_not_cached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_not_cached_after_changed src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup1_w_invalid_name src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookupAll_cached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookupAll_uncached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_cached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_cached_multi_required src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_miss_no_default src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_miss_w_default src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_not_cached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_not_cached_after_changed src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_not_cached_multi_required src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_lookup_w_invalid_name src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_queryAdapter src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_subscriptions_cached src/zope/interface/tests/test_adapter.py::LookupBaseFallbackTests::test_subscriptions_uncached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_adapter_hook_hit_factory_returns_None src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_adapter_hook_hit_factory_returns_adapter src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_adapter_hook_miss_no_default src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_adapter_hook_miss_w_default src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_adapter_hook_super_unwraps src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_adapter_hook_w_invalid_name src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_cached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_miss_no_default src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_miss_w_default src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_miss_w_default_negative_cache src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_not_cached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_not_cached_after_changed src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup1_w_invalid_name src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookupAll_cached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookupAll_uncached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_cached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_cached_multi_required src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_miss_no_default src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_miss_w_default src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_not_cached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_not_cached_after_changed src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_not_cached_multi_required src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_lookup_w_invalid_name src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_optimizations src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_queryAdapter src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_subscriptions_cached src/zope/interface/tests/test_adapter.py::LookupBaseTests::test_subscriptions_uncached src/zope/interface/tests/test_adapter.py::VerifyingBaseFallbackTests::test_adapter_hook src/zope/interface/tests/test_adapter.py::VerifyingBaseFallbackTests::test_lookup src/zope/interface/tests/test_adapter.py::VerifyingBaseFallbackTests::test_lookup1 src/zope/interface/tests/test_adapter.py::VerifyingBaseFallbackTests::test_lookupAll src/zope/interface/tests/test_adapter.py::VerifyingBaseFallbackTests::test_queryAdapter src/zope/interface/tests/test_adapter.py::VerifyingBaseFallbackTests::test_subscriptions src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_adapter_hook src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_lookup src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_lookup1 src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_lookupAll src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_optimizations src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_queryAdapter src/zope/interface/tests/test_adapter.py::VerifyingBaseTests::test_subscriptions src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookupAll_components_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookupAll_empty_ro src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookupAll_extendors_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookupAll_order_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookupAll_simple_hit src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_components_miss_wrong_iface src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_components_miss_wrong_name src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_empty_ro src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_extendors_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_order_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_repeated_hit src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_lookup_simple_hit src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_subscriptions_components_miss_wrong_iface src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_subscriptions_components_miss_wrong_name src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_subscriptions_empty_ro src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_subscriptions_extendors_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_subscriptions_order_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test__uncached_subscriptions_simple_hit src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_add_extendor src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_changed_empty_required src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_changed_w_required src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_ctor_empty_registry src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_ctor_w_registry_provided src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_init_extendors_after_registry_update src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_names src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_queryMultiAdapter_errors_on_attribute_access src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_queryMultiAdapter_super_unwraps src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_queryMultiAdaptor_factory_hit src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_queryMultiAdaptor_factory_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_queryMultiAdaptor_lookup_miss src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_remove_extendor src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_subscribers_w_provided src/zope/interface/tests/test_adapter.py::AdapterLookupBaseTests::test_subscribers_wo_provided src/zope/interface/tests/test_adapter.py::AdapterRegistryTests::test__setBases_removing_existing_subregistry src/zope/interface/tests/test_adapter.py::AdapterRegistryTests::test__setBases_w_existing_entry_continuing src/zope/interface/tests/test_adapter.py::AdapterRegistryTests::test__setBases_wo_stray_entry src/zope/interface/tests/test_adapter.py::AdapterRegistryTests::test_changed_w_subregistries src/zope/interface/tests/test_adapter.py::AdapterRegistryTests::test_ctor_no_bases src/zope/interface/tests/test_adapter.py::AdapterRegistryTests::test_ctor_w_bases src/zope/interface/tests/test_adapter.py::Test_utils::test__convert_None_to_Interface_w_None src/zope/interface/tests/test_adapter.py::Test_utils::test__convert_None_to_Interface_w_other src/zope/interface/tests/test_adapter.py::Test_utils::test__normalize_name_other src/zope/interface/tests/test_adapter.py::Test_utils::test__normalize_name_str src/zope/interface/tests/test_adapter.py::Test_utils::test__normalize_name_unicode src/zope/interface/tests/test_declarations.py::NamedTests::test_class src/zope/interface/tests/test_declarations.py::NamedTests::test_function src/zope/interface/tests/test_declarations.py::NamedTests::test_instance src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test___contains___empty src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test___iro___ src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test___iter___empty src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test___sro___ src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test_extends_empty src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test_flattened_empty src/zope/interface/tests/test_declarations.py::EmptyDeclarationTests::test_interfaces_empty src/zope/interface/tests/test_declarations.py::DeclarationTests::test___add___related_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___add___unrelated_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___contains___empty src/zope/interface/tests/test_declarations.py::DeclarationTests::test___contains__w_base_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___contains__w_self src/zope/interface/tests/test_declarations.py::DeclarationTests::test___contains__w_unrelated_iface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iro___ src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___empty src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___inheritance src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___multiple_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___single_base src/zope/interface/tests/test_declarations.py::DeclarationTests::test___iter___w_nested_sequence_overlap src/zope/interface/tests/test_declarations.py::DeclarationTests::test___sro___ src/zope/interface/tests/test_declarations.py::DeclarationTests::test___sub___related_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test___sub___related_interface_by_inheritance src/zope/interface/tests/test_declarations.py::DeclarationTests::test___sub___unrelated_interface src/zope/interface/tests/test_declarations.py::DeclarationTests::test_changed_w_existing__v_attrs src/zope/interface/tests/test_declarations.py::DeclarationTests::test_changed_wo_existing__v_attrs src/zope/interface/tests/test_declarations.py::DeclarationTests::test_ctor_no_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test_ctor_w_implements_in_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test_ctor_w_interface_in_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test_extends_empty src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_empty src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_inheritance src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_multiple_bases src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_single_base src/zope/interface/tests/test_declarations.py::DeclarationTests::test_flattened_w_nested_sequence_overlap src/zope/interface/tests/test_declarations.py::DeclarationTests::test_interfaces_empty src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test___contains___empty src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test___iro___ src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test___iter___empty src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test___sro___ src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test__bases__ src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_change__bases__ src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_changed src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_dependents src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_extends_always_false src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_extends_empty src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_flattened_empty src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_get_always_default src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_interfaces_empty src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_pickle src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_singleton src/zope/interface/tests/test_declarations.py::TestImplements::test___reduce__ src/zope/interface/tests/test_declarations.py::TestImplements::test___repr__ src/zope/interface/tests/test_declarations.py::TestImplements::test__ge__NotImplemented src/zope/interface/tests/test_declarations.py::TestImplements::test__gt__NotImplemented src/zope/interface/tests/test_declarations.py::TestImplements::test__le__NotImplemented src/zope/interface/tests/test_declarations.py::TestImplements::test__lt__NotImplemented src/zope/interface/tests/test_declarations.py::TestImplements::test_changed_deletes_super_cache src/zope/interface/tests/test_declarations.py::TestImplements::test_changed_does_not_add_super_cache src/zope/interface/tests/test_declarations.py::TestImplements::test_ctor_no_bases src/zope/interface/tests/test_declarations.py::TestImplements::test_proxy_equality src/zope/interface/tests/test_declarations.py::TestImplements::test_sort src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_builtins_added_to_cache src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_builtins_w_existing_cache src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_w_existing_not_Implements src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_wo_existing_Implements_cant_assign___implemented__ src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_wo_existing_Implements_w_registrations src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_wo_existing_Implements_wo_registrations src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_no_assertions src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_oldstyle_class_no_assertions src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_multi_level_multi_inheritance src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_base_doesnt_implement_interface src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_base_implements_interface src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_base_implements_interface_diamond src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_base_is_object src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_super_when_parent_implements_interface_diamond src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_None_no_bases_not_factory src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_None_no_bases_w_class src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_None_no_bases_w_factory src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_w_existing_attr_as_Implements src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_builtins_added_to_cache src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_builtins_w_existing_cache src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_w_existing_not_Implements src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_wo_existing_Implements_cant_assign___implemented__ src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_wo_existing_Implements_w_registrations src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_dictless_wo_existing_Implements_wo_registrations src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_no_assertions src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_oldstyle_class_no_assertions src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_optimizations src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_multi_level_multi_inheritance src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_base_doesnt_implement_interface src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_base_implements_interface src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_base_implements_interface_diamond src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_base_is_object src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_super_when_parent_implements_interface_diamond src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_None_no_bases_not_factory src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_None_no_bases_w_class src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_None_no_bases_w_factory src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_implementedBy::test_w_existing_attr_as_Implements src/zope/interface/tests/test_declarations.py::Test_classImplementsOnly::test_no_existing src/zope/interface/tests/test_declarations.py::Test_classImplementsOnly::test_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_classImplements::test_no_existing src/zope/interface/tests/test_declarations.py::Test_classImplements::test_w_existing_Implements src/zope/interface/tests/test_declarations.py::Test_classImplements::test_w_existing_Implements_w_bases src/zope/interface/tests/test_declarations.py::Test__implements_advice::test_no_existing_implements src/zope/interface/tests/test_declarations.py::Test_implementer::test_newstyle_class src/zope/interface/tests/test_declarations.py::Test_implementer::test_nonclass_can_assign_attr src/zope/interface/tests/test_declarations.py::Test_implementer::test_nonclass_cannot_assign_attr src/zope/interface/tests/test_declarations.py::Test_implementer::test_oldstyle_class src/zope/interface/tests/test_declarations.py::Test_implementer_only::test_function src/zope/interface/tests/test_declarations.py::Test_implementer_only::test_method src/zope/interface/tests/test_declarations.py::Test_implementer_only::test_newstyle_class src/zope/interface/tests/test_declarations.py::Test_implementer_only::test_oldstyle_class src/zope/interface/tests/test_declarations.py::Test_implementsOnly::test_called_once_from_class_w_bases src/zope/interface/tests/test_declarations.py::Test_implementsOnly::test_simple src/zope/interface/tests/test_declarations.py::Test_implements::test_called_from_function src/zope/interface/tests/test_declarations.py::Test_implements::test_called_once_from_class src/zope/interface/tests/test_declarations.py::Test_implements::test_called_twice_from_class src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test___get___class src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test___get___instance src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test___reduce__ src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test__repr__ src/zope/interface/tests/test_declarations.py::ProvidesClassTests::test_simple_class_one_interface src/zope/interface/tests/test_declarations.py::Test_Provides::test_no_cached_spec src/zope/interface/tests/test_declarations.py::Test_Provides::test_w_cached_spec src/zope/interface/tests/test_declarations.py::Test_directlyProvides::test_w_class src/zope/interface/tests/test_declarations.py::Test_directlyProvides::test_w_classless_object src/zope/interface/tests/test_declarations.py::Test_directlyProvides::test_w_normal_object src/zope/interface/tests/test_declarations.py::Test_alsoProvides::test_w_existing_provides src/zope/interface/tests/test_declarations.py::Test_alsoProvides::test_wo_existing_provides src/zope/interface/tests/test_declarations.py::Test_noLongerProvides::test_w_existing_provides_hit src/zope/interface/tests/test_declarations.py::Test_noLongerProvides::test_w_existing_provides_miss src/zope/interface/tests/test_declarations.py::Test_noLongerProvides::test_w_iface_implemented_by_class src/zope/interface/tests/test_declarations.py::Test_noLongerProvides::test_wo_existing_provides src/zope/interface/tests/test_declarations.py::ClassProvidesBaseFallbackTests::test_w_different_class src/zope/interface/tests/test_declarations.py::ClassProvidesBaseFallbackTests::test_w_same_class_via_class src/zope/interface/tests/test_declarations.py::ClassProvidesBaseFallbackTests::test_w_same_class_via_instance src/zope/interface/tests/test_declarations.py::ClassProvidesBaseTests::test_optimizations src/zope/interface/tests/test_declarations.py::ClassProvidesBaseTests::test_w_different_class src/zope/interface/tests/test_declarations.py::ClassProvidesBaseTests::test_w_same_class_via_class src/zope/interface/tests/test_declarations.py::ClassProvidesBaseTests::test_w_same_class_via_instance src/zope/interface/tests/test_declarations.py::ClassProvidesTests::test___reduce__ src/zope/interface/tests/test_declarations.py::ClassProvidesTests::test__repr__ src/zope/interface/tests/test_declarations.py::ClassProvidesTests::test_w_simple_metaclass src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_w_declarations_in_class_but_not_instance src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_w_declarations_in_instance_and_class src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_w_declarations_in_instance_but_not_class src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_wo_declarations_in_class_or_instance src/zope/interface/tests/test_declarations.py::Test_classProvides::test_called_from_function src/zope/interface/tests/test_declarations.py::Test_classProvides::test_called_once_from_class src/zope/interface/tests/test_declarations.py::Test_classProvides::test_called_twice_from_class src/zope/interface/tests/test_declarations.py::Test_provider::test_w_class src/zope/interface/tests/test_declarations.py::Test_moduleProvides::test_called_from_class src/zope/interface/tests/test_declarations.py::Test_moduleProvides::test_called_from_function src/zope/interface/tests/test_declarations.py::Test_moduleProvides::test_called_once_from_module_scope src/zope/interface/tests/test_declarations.py::Test_moduleProvides::test_called_twice_from_module_scope src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_catches_only_AttributeError_on_class src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_catches_only_AttributeError_on_provides src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_existing_provides src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_existing_provides_is_not_spec src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_existing_provides_is_spec src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_raises_AttributeError_when_provides_fails_type_check_AttributeError src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_raises_AttributeError_when_provides_fails_type_check_RuntimeError src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_wo_existing_provides_classless src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_wo_provides_on_class_w_implements src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_wo_provides_on_class_wo_implements src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_catches_only_AttributeError_on_class src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_catches_only_AttributeError_on_provides src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_existing_provides src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_existing_provides_is_not_spec src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_existing_provides_is_spec src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_optimizations src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_raises_AttributeError_when_provides_fails_type_check_AttributeError src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_raises_AttributeError_when_provides_fails_type_check_RuntimeError src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_wo_existing_provides_classless src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_wo_provides_on_class_w_implements src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_wo_provides_on_class_wo_implements src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_catches_only_AttributeError_on_class src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_catches_only_AttributeError_on_providedBy src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_multi_level_multi_inheritance src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_when_base_doesnt_implement_interface src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_when_base_implements_interface src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_when_base_is_object src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_super_when_object_directly_provides src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec_class_w_implements src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec_w_provides_diff_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec_w_provides_no_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_invalid_spec_w_provides_same_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_w_providedBy_valid_spec src/zope/interface/tests/test_declarations.py::Test_providedByFallback::test_wo_providedBy_on_class_wo_implements src/zope/interface/tests/test_declarations.py::Test_providedBy::test_catches_only_AttributeError_on_class src/zope/interface/tests/test_declarations.py::Test_providedBy::test_catches_only_AttributeError_on_providedBy src/zope/interface/tests/test_declarations.py::Test_providedBy::test_optimizations src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_multi_level_multi_inheritance src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_when_base_doesnt_implement_interface src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_when_base_implements_interface src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_when_base_is_object src/zope/interface/tests/test_declarations.py::Test_providedBy::test_super_when_object_directly_provides src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec_class_w_implements src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec_w_provides_diff_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec_w_provides_no_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_invalid_spec_w_provides_same_provides_on_class src/zope/interface/tests/test_declarations.py::Test_providedBy::test_w_providedBy_valid_spec src/zope/interface/tests/test_declarations.py::Test_providedBy::test_wo_providedBy_on_class_wo_implements src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorFallbackTests::test_accessed_via_class src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorFallbackTests::test_accessed_via_inst_w_provides src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorFallbackTests::test_accessed_via_inst_wo_provides src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorTests::test_accessed_via_class src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorTests::test_accessed_via_inst_w_provides src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorTests::test_accessed_via_inst_wo_provides src/zope/interface/tests/test_declarations.py::ObjectSpecificationDescriptorTests::test_optimizations src/zope/interface/tests/test_interface.py::Test_invariant::test_w_multiple src/zope/interface/tests/test_interface.py::Test_invariant::test_w_single src/zope/interface/tests/test_interface.py::Test_taggedValue::test_w_multiple src/zope/interface/tests/test_interface.py::Test_taggedValue::test_w_multiple_overwriting src/zope/interface/tests/test_interface.py::Test_taggedValue::test_w_single src/zope/interface/tests/test_interface.py::ElementTests::test_ctor_defaults src/zope/interface/tests/test_interface.py::ElementTests::test_ctor_no_doc_space_in_name src/zope/interface/tests/test_interface.py::ElementTests::test_getDirectTaggedValueTags src/zope/interface/tests/test_interface.py::ElementTests::test_getDirectTaggedValue_miss src/zope/interface/tests/test_interface.py::ElementTests::test_getTaggedValue_miss src/zope/interface/tests/test_interface.py::ElementTests::test_queryDirectTaggedValue_miss src/zope/interface/tests/test_interface.py::ElementTests::test_queryDirectTaggedValue_miss_w_default src/zope/interface/tests/test_interface.py::ElementTests::test_queryTaggedValue_miss src/zope/interface/tests/test_interface.py::ElementTests::test_queryTaggedValue_miss_w_default src/zope/interface/tests/test_interface.py::ElementTests::test_setTaggedValue src/zope/interface/tests/test_interface.py::ElementTests::test_verifies src/zope/interface/tests/test_interface.py::GenericSpecificationBaseTests::test_implementedBy_miss src/zope/interface/tests/test_interface.py::GenericSpecificationBaseTests::test_providedBy_miss src/zope/interface/tests/test_interface.py::SpecificationBaseTests::test_implementedBy_miss src/zope/interface/tests/test_interface.py::SpecificationBaseTests::test_optimizations src/zope/interface/tests/test_interface.py::SpecificationBaseTests::test_providedBy_miss src/zope/interface/tests/test_interface.py::SpecificationBasePyTests::test___call___hit src/zope/interface/tests/test_interface.py::SpecificationBasePyTests::test___call___miss src/zope/interface/tests/test_interface.py::SpecificationBasePyTests::test_implementedBy_hit src/zope/interface/tests/test_interface.py::SpecificationBasePyTests::test_implementedBy_miss src/zope/interface/tests/test_interface.py::SpecificationBasePyTests::test_isOrExtends_hit src/zope/interface/tests/test_interface.py::SpecificationBasePyTests::test_isOrExtends_miss src/zope/interface/tests/test_interface.py::SpecificationBasePyTests::test_providedBy_hit src/zope/interface/tests/test_interface.py::SpecificationBasePyTests::test_providedBy_miss src/zope/interface/tests/test_interface.py::InterfaceBaseTests::test___call___w___conform___ob_no_provides_wo_alternate src/zope/interface/tests/test_interface.py::InterfaceBaseTests::test___call___w___conform___returning_value src/zope/interface/tests/test_interface.py::InterfaceBaseTests::test___call___w_no_conform_catches_only_AttributeError src/zope/interface/tests/test_interface.py::InterfaceBaseTests::test___call___wo___conform___ob_no_provides_w_alternate src/zope/interface/tests/test_interface.py::InterfaceBaseTests::test__ge__NotImplemented src/zope/interface/tests/test_interface.py::InterfaceBaseTests::test__gt__NotImplemented src/zope/interface/tests/test_interface.py::InterfaceBaseTests::test__le__NotImplemented src/zope/interface/tests/test_interface.py::InterfaceBaseTests::test__lt__NotImplemented src/zope/interface/tests/test_interface.py::InterfaceBaseTests::test_optimizations src/zope/interface/tests/test_interface.py::InterfaceBasePyTests::test___adapt___ob_no_provides_uses_hooks src/zope/interface/tests/test_interface.py::InterfaceBasePyTests::test___adapt___ob_provides src/zope/interface/tests/test_interface.py::InterfaceBasePyTests::test___call___w___conform___miss_ob_provides src/zope/interface/tests/test_interface.py::InterfaceBasePyTests::test___call___w___conform___ob_no_provides_wo_alternate src/zope/interface/tests/test_interface.py::InterfaceBasePyTests::test___call___w___conform___returning_value src/zope/interface/tests/test_interface.py::InterfaceBasePyTests::test___call___w_no_conform_catches_only_AttributeError src/zope/interface/tests/test_interface.py::InterfaceBasePyTests::test___call___wo___conform___ob_no_provides_w_alternate src/zope/interface/tests/test_interface.py::InterfaceBasePyTests::test__ge__NotImplemented src/zope/interface/tests/test_interface.py::InterfaceBasePyTests::test__gt__NotImplemented src/zope/interface/tests/test_interface.py::InterfaceBasePyTests::test__le__NotImplemented src/zope/interface/tests/test_interface.py::InterfaceBasePyTests::test__lt__NotImplemented src/zope/interface/tests/test_interface.py::SpecificationTests::test___setBases_subscribes_bases_and_notifies_dependents src/zope/interface/tests/test_interface.py::SpecificationTests::test_changed_clears_volatiles_and_implied src/zope/interface/tests/test_interface.py::SpecificationTests::test_ctor src/zope/interface/tests/test_interface.py::SpecificationTests::test_extends_non_strict_w_self src/zope/interface/tests/test_interface.py::SpecificationTests::test_extends_strict_w_self src/zope/interface/tests/test_interface.py::SpecificationTests::test_extends_strict_wo_self src/zope/interface/tests/test_interface.py::SpecificationTests::test_get_hit_from_base_wo__v_attrs src/zope/interface/tests/test_interface.py::SpecificationTests::test_get_hit_w__v_attrs src/zope/interface/tests/test_interface.py::SpecificationTests::test_interfaces_skips_already_seen src/zope/interface/tests/test_interface.py::SpecificationTests::test_multiple_inheritance_no_interfaces src/zope/interface/tests/test_interface.py::SpecificationTests::test_subscribe_again src/zope/interface/tests/test_interface.py::SpecificationTests::test_subscribe_first_time src/zope/interface/tests/test_interface.py::SpecificationTests::test_unsubscribe src/zope/interface/tests/test_interface.py::SpecificationTests::test_unsubscribe_miss src/zope/interface/tests/test_interface.py::InterfaceClassTests::test___contains___hit src/zope/interface/tests/test_interface.py::InterfaceClassTests::test___contains___miss src/zope/interface/tests/test_interface.py::InterfaceClassTests::test___getitem___hit src/zope/interface/tests/test_interface.py::InterfaceClassTests::test___getitem___miss src/zope/interface/tests/test_interface.py::InterfaceClassTests::test___hash___missing_required_attrs src/zope/interface/tests/test_interface.py::InterfaceClassTests::test___hash___normal src/zope/interface/tests/test_interface.py::InterfaceClassTests::test___iter__ src/zope/interface/tests/test_interface.py::InterfaceClassTests::test___reduce__ src/zope/interface/tests/test_interface.py::InterfaceClassTests::test__module__is_readonly src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_assignment_to__class__ src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_assignment_to__class__2 src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_comparison_with_None src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_comparison_with_same_instance src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_comparison_with_same_named_instance_in_other_module src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_ctor_attrs_w___annotations__ src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_ctor_attrs_w___locals__ src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_ctor_attrs_w__decorator_non_return src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_ctor_attrs_w_invalid_attr_type src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_ctor_bad_bases src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_ctor_defaults src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_ctor_w_attrs_attrib_methods src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_ctor_w_explicit___doc__ src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_direct_hit_local_miss_bases src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_direct_miss src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_getBases src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_getDescriptionFor_hit src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_getDescriptionFor_miss src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_interfaces src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_isEqualOrExtendedBy_identity src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_isEqualOrExtendedBy_subiface src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_isEqualOrExtendedBy_unrelated src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_namesAndDescriptions_w_all_False_ignores_bases src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_namesAndDescriptions_w_all_True_bases_w_same_names src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_namesAndDescriptions_w_all_True_no_bases src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_namesAndDescriptions_w_all_True_simple src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_names_w_all_False_ignores_bases src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_names_w_all_True_bases_w_same_names src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_names_w_all_True_no_bases src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_names_w_all_True_w_bases_simple src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_queryDescriptionFor_hit src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_queryDescriptionFor_miss src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_validateInvariants_fail_in_base_w_errors_passed src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_validateInvariants_fail_in_base_wo_errors_passed src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_validateInvariants_fail_w_errors_passed src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_validateInvariants_fail_wo_errors_passed src/zope/interface/tests/test_interface.py::InterfaceClassTests::test_validateInvariants_pass src/zope/interface/tests/test_interface.py::InterfaceTests::testInterfaceExtendsInterface src/zope/interface/tests/test_interface.py::InterfaceTests::test___call___defers_to___conform___ src/zope/interface/tests/test_interface.py::InterfaceTests::test___call___miss_w_alternate src/zope/interface/tests/test_interface.py::InterfaceTests::test___call___miss_wo_alternate src/zope/interface/tests/test_interface.py::InterfaceTests::test___call___object_implements src/zope/interface/tests/test_interface.py::InterfaceTests::test___call___w_adapter_hook src/zope/interface/tests/test_interface.py::InterfaceTests::test___contains__derived src/zope/interface/tests/test_interface.py::InterfaceTests::test___contains__nonesuch src/zope/interface/tests/test_interface.py::InterfaceTests::test___contains__simple src/zope/interface/tests/test_interface.py::InterfaceTests::test___doc___as_element src/zope/interface/tests/test_interface.py::InterfaceTests::test___doc___element src/zope/interface/tests/test_interface.py::InterfaceTests::test___doc___non_element src/zope/interface/tests/test_interface.py::InterfaceTests::test___getitem___derived src/zope/interface/tests/test_interface.py::InterfaceTests::test___getitem__nonesuch src/zope/interface/tests/test_interface.py::InterfaceTests::test___getitem__simple src/zope/interface/tests/test_interface.py::InterfaceTests::test___iter__derived src/zope/interface/tests/test_interface.py::InterfaceTests::test___iter__empty src/zope/interface/tests/test_interface.py::InterfaceTests::test___iter__simple src/zope/interface/tests/test_interface.py::InterfaceTests::test_attributes_link_to_interface src/zope/interface/tests/test_interface.py::InterfaceTests::test_classImplements_base_and_derived src/zope/interface/tests/test_interface.py::InterfaceTests::test_classImplements_base_not_derived src/zope/interface/tests/test_interface.py::InterfaceTests::test_classImplements_multiple src/zope/interface/tests/test_interface.py::InterfaceTests::test_classImplements_multiple_w_explict_implements src/zope/interface/tests/test_interface.py::InterfaceTests::test_classImplements_simple src/zope/interface/tests/test_interface.py::InterfaceTests::test_description_cache_management src/zope/interface/tests/test_interface.py::InterfaceTests::test_function_attributes_become_tagged_values src/zope/interface/tests/test_interface.py::InterfaceTests::test_getDescriptionFor_derived src/zope/interface/tests/test_interface.py::InterfaceTests::test_getDescriptionFor_nonesuch_no_default src/zope/interface/tests/test_interface.py::InterfaceTests::test_getDescriptionFor_simple src/zope/interface/tests/test_interface.py::InterfaceTests::test_getDirectTaggedValue_ignores__iro__ src/zope/interface/tests/test_interface.py::InterfaceTests::test_getTaggedValue_follows__iro__ src/zope/interface/tests/test_interface.py::InterfaceTests::test_interface_object_provides_Interface src/zope/interface/tests/test_interface.py::InterfaceTests::test_invariant_as_decorator src/zope/interface/tests/test_interface.py::InterfaceTests::test_invariant_mutandis src/zope/interface/tests/test_interface.py::InterfaceTests::test_invariant_nested src/zope/interface/tests/test_interface.py::InterfaceTests::test_invariant_simple src/zope/interface/tests/test_interface.py::InterfaceTests::test_methods_link_to_interface src/zope/interface/tests/test_interface.py::InterfaceTests::test_namesAndDescriptions_derived src/zope/interface/tests/test_interface.py::InterfaceTests::test_namesAndDescriptions_simple src/zope/interface/tests/test_interface.py::InterfaceTests::test_names_derived src/zope/interface/tests/test_interface.py::InterfaceTests::test_names_simple src/zope/interface/tests/test_interface.py::InterfaceTests::test_taggedValue src/zope/interface/tests/test_interface.py::InterfaceTests::test_verifyClass src/zope/interface/tests/test_interface.py::InterfaceTests::test_verifyObject src/zope/interface/tests/test_interface.py::AttributeTests::test__repr__w_interface src/zope/interface/tests/test_interface.py::AttributeTests::test__repr__wo_interface src/zope/interface/tests/test_interface.py::AttributeTests::test__str__w_interface src/zope/interface/tests/test_interface.py::AttributeTests::test__str__wo_interface src/zope/interface/tests/test_interface.py::AttributeTests::test_ctor_defaults src/zope/interface/tests/test_interface.py::AttributeTests::test_ctor_no_doc_space_in_name src/zope/interface/tests/test_interface.py::AttributeTests::test_getDirectTaggedValueTags src/zope/interface/tests/test_interface.py::AttributeTests::test_getDirectTaggedValue_miss src/zope/interface/tests/test_interface.py::AttributeTests::test_getTaggedValue_miss src/zope/interface/tests/test_interface.py::AttributeTests::test_queryDirectTaggedValue_miss src/zope/interface/tests/test_interface.py::AttributeTests::test_queryDirectTaggedValue_miss_w_default src/zope/interface/tests/test_interface.py::AttributeTests::test_queryTaggedValue_miss src/zope/interface/tests/test_interface.py::AttributeTests::test_queryTaggedValue_miss_w_default src/zope/interface/tests/test_interface.py::AttributeTests::test_setTaggedValue src/zope/interface/tests/test_interface.py::AttributeTests::test_verifies src/zope/interface/tests/test_interface.py::MethodTests::test___call___raises_BrokenImplementation src/zope/interface/tests/test_interface.py::MethodTests::test__repr__w_interface src/zope/interface/tests/test_interface.py::MethodTests::test__repr__wo_interface src/zope/interface/tests/test_interface.py::MethodTests::test__str__w_interface src/zope/interface/tests/test_interface.py::MethodTests::test__str__wo_interface src/zope/interface/tests/test_interface.py::MethodTests::test_ctor_defaults src/zope/interface/tests/test_interface.py::MethodTests::test_ctor_no_doc_space_in_name src/zope/interface/tests/test_interface.py::MethodTests::test_getDirectTaggedValueTags src/zope/interface/tests/test_interface.py::MethodTests::test_getDirectTaggedValue_miss src/zope/interface/tests/test_interface.py::MethodTests::test_getSignatureInfo_bare src/zope/interface/tests/test_interface.py::MethodTests::test_getSignatureString_bare src/zope/interface/tests/test_interface.py::MethodTests::test_getSignatureString_w_kwargs src/zope/interface/tests/test_interface.py::MethodTests::test_getSignatureString_w_only_required src/zope/interface/tests/test_interface.py::MethodTests::test_getSignatureString_w_optional src/zope/interface/tests/test_interface.py::MethodTests::test_getSignatureString_w_varargs src/zope/interface/tests/test_interface.py::MethodTests::test_getTaggedValue_miss src/zope/interface/tests/test_interface.py::MethodTests::test_optional_as_property src/zope/interface/tests/test_interface.py::MethodTests::test_queryDirectTaggedValue_miss src/zope/interface/tests/test_interface.py::MethodTests::test_queryDirectTaggedValue_miss_w_default src/zope/interface/tests/test_interface.py::MethodTests::test_queryTaggedValue_miss src/zope/interface/tests/test_interface.py::MethodTests::test_queryTaggedValue_miss_w_default src/zope/interface/tests/test_interface.py::MethodTests::test_setTaggedValue src/zope/interface/tests/test_interface.py::MethodTests::test_verifies src/zope/interface/tests/test_interface.py::Test_fromFunction::test_bare src/zope/interface/tests/test_interface.py::Test_fromFunction::test_full_spectrum src/zope/interface/tests/test_interface.py::Test_fromFunction::test_w_interface src/zope/interface/tests/test_interface.py::Test_fromFunction::test_w_kwargs src/zope/interface/tests/test_interface.py::Test_fromFunction::test_w_name src/zope/interface/tests/test_interface.py::Test_fromFunction::test_w_only_required src/zope/interface/tests/test_interface.py::Test_fromFunction::test_w_optional src/zope/interface/tests/test_interface.py::Test_fromFunction::test_w_optional_self src/zope/interface/tests/test_interface.py::Test_fromFunction::test_w_varargs src/zope/interface/tests/test_interface.py::Test_fromMethod::test_full_spectrum src/zope/interface/tests/test_interface.py::Test_fromMethod::test_no_args src/zope/interface/tests/test_interface.py::Test_fromMethod::test_w_non_method
docs/conf.py docs/README.rst src/zope/interface/common/__init__.py src/zope/interface/interface.py src/zope/interface/__init__.py docs/api/declarations.rst src/zope/interface/_zope_interface_coptimizations.c CHANGES.rst src/zope/interface/interfaces.py
docs/conf.py docs/README.rst src/zope/interface/common/__init__.py src/zope/interface/interface.py src/zope/interface/__init__.py docs/api/declarations.rst src/zope/interface/_zope_interface_coptimizations.c CHANGES.rst src/zope/interface/interfaces.py