diff --git a/CHANGES.rst b/CHANGES.rst
index 7ac92c4..db52ae5 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -4,7 +4,10 @@ Changes
 4.2.1 (unreleased)
 ------------------
 
-- TBD
+- Add the ability to sort the objects returned by ``implementedBy``.
+  This is compatible with the way interface classes sort so they can
+  be used together in ordered containers like BTrees.
+  (https://github.com/zopefoundation/zope.interface/issues/42)
 
 4.2.0 (2016-06-10)
 ------------------
diff --git a/src/zope/interface/declarations.py b/src/zope/interface/declarations.py
index 5c4a20a..d770fa0 100644
--- a/src/zope/interface/declarations.py
+++ b/src/zope/interface/declarations.py
@@ -30,7 +30,6 @@ import sys
 from types import FunctionType
 from types import MethodType
 from types import ModuleType
-import warnings
 import weakref
 
 from zope.interface.advice import addClassAdvisor
@@ -131,12 +130,86 @@ class Implements(Declaration):
 
     __name__ = '?'
 
+    @classmethod
+    def named(cls, name, *interfaces):
+        # Implementation method: Produce an Implements interface with
+        # a fully fleshed out __name__ before calling the constructor, which
+        # sets bases to the given interfaces and which may pass this object to
+        # other objects (e.g., to adjust dependents). If they're sorting or comparing
+        # by name, this needs to be set.
+        inst = cls.__new__(cls)
+        inst.__name__ = name
+        inst.__init__(*interfaces)
+        return inst
+
     def __repr__(self):
         return '<implementedBy %s>' % (self.__name__)
 
     def __reduce__(self):
         return implementedBy, (self.inherit, )
 
+    def __cmp(self, other):
+        # Yes, I did mean to name this __cmp, rather than __cmp__.
+        # It is a private method used by __lt__ and __gt__.
+        # This is based on, and compatible with, InterfaceClass.
+        # (The two must be mutually comparable to be able to work in e.g., BTrees.)
+        # Instances of this class generally don't have a __module__ other than
+        # `zope.interface.declarations`, whereas they *do* have a __name__ that is the
+        # fully qualified name of the object they are representing.
+
+        # Note, though, that equality and hashing are still identity based. This
+        # accounts for things like nested objects that have the same name (typically
+        # only in tests) and is consistent with pickling. As far as comparisons to InterfaceClass
+        # goes, we'll never have equal name and module to those, so we're still consistent there.
+        # Instances of this class are essentially intended to be unique and are
+        # heavily cached (note how our __reduce__ handles this) so having identity
+        # based hash and eq should also work.
+        if other is None:
+            return -1
+
+        n1 = (self.__name__, self.__module__)
+        n2 = (getattr(other, '__name__', ''), getattr(other,  '__module__', ''))
+
+        # This spelling works under Python3, which doesn't have cmp().
+        return (n1 > n2) - (n1 < n2)
+
+    def __hash__(self):
+        return Declaration.__hash__(self)
+
+    def __eq__(self, other):
+        return self is other
+
+    def __ne__(self, other):
+        return self is not other
+
+    def __lt__(self, other):
+        c = self.__cmp(other)
+        return c < 0
+
+    def __le__(self, other):
+        c = self.__cmp(other)
+        return c <= 0
+
+    def __gt__(self, other):
+        c = self.__cmp(other)
+        return c > 0
+
+    def __ge__(self, other):
+        c = self.__cmp(other)
+        return c >= 0
+
+def _implements_name(ob):
+    # Return the __name__ attribute to be used by its __implemented__
+    # property.
+    # This must be stable for the "same" object across processes
+    # because it is used for sorting. It needn't be unique, though, in cases
+    # like nested classes named Foo created by different functions, because
+    # equality and hashing is still based on identity.
+    # It might be nice to use __qualname__ on Python 3, but that would produce
+    # different values between Py2 and Py3.
+    return (getattr(ob, '__module__', '?') or '?') + \
+        '.' + (getattr(ob, '__name__', '?') or '?')
+
 def implementedByFallback(cls):
     """Return the interfaces implemented for a class' instances
 
@@ -183,10 +256,11 @@ def implementedByFallback(cls):
             return spec
 
     # TODO: need old style __implements__ compatibility?
+    spec_name = _implements_name(cls)
     if spec is not None:
         # old-style __implemented__ = foo declaration
         spec = (spec, ) # tuplefy, as it might be just an int
-        spec = Implements(*_normalizeargs(spec))
+        spec = Implements.named(spec_name, *_normalizeargs(spec))
         spec.inherit = None    # old-style implies no inherit
         del cls.__implemented__ # get rid of the old-style declaration
     else:
@@ -197,12 +271,9 @@ def implementedByFallback(cls):
                 raise TypeError("ImplementedBy called for non-factory", cls)
             bases = ()
 
-        spec = Implements(*[implementedBy(c) for c in bases])
+        spec = Implements.named(spec_name, *[implementedBy(c) for c in bases])
         spec.inherit = cls
 
-    spec.__name__ = (getattr(cls, '__module__', '?') or '?') + \
-                    '.' + (getattr(cls, '__name__', '?') or '?')
-
     try:
         cls.__implemented__ = spec
         if not hasattr(cls, '__providedBy__'):
@@ -314,7 +385,8 @@ class implementer:
             classImplements(ob, *self.interfaces)
             return ob
 
-        spec = Implements(*self.interfaces)
+        spec_name = _implements_name(ob)
+        spec = Implements.named(spec_name, *self.interfaces)
         try:
             ob.__implemented__ = spec
         except AttributeError:
@@ -641,7 +713,7 @@ def classProvides(*interfaces):
     """
     # This entire approach is invalid under Py3K.  Don't even try to fix
     # the coverage for this block there. :(
-                       
+
     if PYTHON3: #pragma NO COVER
         raise TypeError(_ADVICE_ERROR % 'provider')
 
diff --git a/src/zope/interface/interface.py b/src/zope/interface/interface.py
index 5a77adb..e7eff5d 100644
--- a/src/zope/interface/interface.py
+++ b/src/zope/interface/interface.py
@@ -152,7 +152,7 @@ class InterfaceBasePy(object):
             if adapter is not None:
                 return adapter
 
-    
+
 InterfaceBase = InterfaceBasePy
 try:
     from _zope_interface_coptimizations import InterfaceBase

Make declarations.Implements (and possibly Provides) comparable?
Recently we had the need to do some `IComponents`-like things on some very large persistent data sets. So we started with a subclass of `AdapterRegistry` and made it use BTrees instead of dicts. Everything works fine so long as you stay in the realm of interfaces, but as soon as you try to do something based on classes, like `components.registerAdapter(factory, provided=IFoo, required=(str,))`  you blow up with `TypeError: Object has default comparison`. 

Actually it's slightly worse than that. Some of the dicts used in the implementation of Components (which we also replaced with BTrees) use keys that are tuples. Tuples are automatically comparable, even if their elements aren't. But having non-comparable keys (or rather, keys that change across processes) is a sure way to corrupt the BTree.

I looked into it, and was pretty surprised to find that not only are `Implements` and `Provides` not comparable, they actually rely on the default, identity-based, `__hash__` and `__eq__` inherited from object. Everything pretty much happens to work out for a regular `PersistentAdapterRegistry` because of the way these objects are pickled (in Implement's case, via `__reduce__` and a call to `implementedBy`, which aggressively caches the same object, so identities stay the same in a single process even across pickling).

Is it a bad idea to make `Implements` comparable so it can be used in BTrees? To work for the `IComponents` use-case, it would have to be mutually-comparable with `InterfaceClass`, but it already has `__name__` and `__module__` (which is what `InterfaceClass` uses), so that might just work out nearly automatically.

If there's consensus this is a reasonable idea, I can work on a PR. (In our particular use-case, we were able to simply prohibit class-based registrations as they don't occur in our data set.)
diff --git a/src/zope/interface/tests/test_declarations.py b/src/zope/interface/tests/test_declarations.py
index 27a999a..83da6fa 100644
--- a/src/zope/interface/tests/test_declarations.py
+++ b/src/zope/interface/tests/test_declarations.py
@@ -238,7 +238,7 @@ class DeclarationTests(unittest.TestCase):
         self.assertEqual(list(after), [IFoo, IBar, IBaz])
 
 
-class ImplementsTests(unittest.TestCase):
+class TestImplements(unittest.TestCase):
 
     def _getTargetClass(self):
         from zope.interface.declarations import Implements
@@ -264,6 +264,25 @@ class ImplementsTests(unittest.TestCase):
         impl = self._makeOne()
         self.assertEqual(impl.__reduce__(), (implementedBy, (None,)))
 
+    def test_sort(self):
+        from zope.interface.declarations import implementedBy
+        class A(object):
+            pass
+        class B(object):
+            pass
+        from zope.interface.interface import InterfaceClass
+        IFoo = InterfaceClass('IFoo')
+
+        self.assertEqual(implementedBy(A), implementedBy(A))
+        self.assertEqual(hash(implementedBy(A)), hash(implementedBy(A)))
+        self.assertTrue(implementedBy(A) < None)
+        self.assertTrue(None > implementedBy(A))
+        self.assertTrue(implementedBy(A) < implementedBy(B))
+        self.assertTrue(implementedBy(A) > IFoo)
+        self.assertTrue(implementedBy(A) <= implementedBy(B))
+        self.assertTrue(implementedBy(A) >= IFoo)
+        self.assertTrue(implementedBy(A) != IFoo)
+
 
 class Test_implementedByFallback(unittest.TestCase):
 
@@ -597,7 +616,7 @@ class Test_implementer(unittest.TestCase):
         returned = decorator(foo)
         self.assertTrue(returned is foo)
         spec = foo.__implemented__
-        self.assertEqual(spec.__name__, '?')
+        self.assertEqual(spec.__name__, 'zope.interface.tests.test_declarations.?')
         self.assertTrue(spec.inherit is None)
         self.assertTrue(foo.__implemented__ is spec)
 
@@ -1567,7 +1586,7 @@ class _MonkeyDict(object):
 def test_suite():
     return unittest.TestSuite((
         unittest.makeSuite(DeclarationTests),
-        unittest.makeSuite(ImplementsTests),
+        unittest.makeSuite(TestImplements),
         unittest.makeSuite(Test_implementedByFallback),
         unittest.makeSuite(Test_implementedBy),
         unittest.makeSuite(Test_classImplementsOnly),
diff --git a/src/zope/interface/tests/test_odd_declarations.py b/src/zope/interface/tests/test_odd_declarations.py
index 1e62a4f..e508d1d 100644
--- a/src/zope/interface/tests/test_odd_declarations.py
+++ b/src/zope/interface/tests/test_odd_declarations.py
@@ -46,7 +46,6 @@ class B(Odd): __implemented__ = I2
 #       a different mechanism.
 
 # from zope.interface import classProvides
-
 class A(Odd):
     pass
 classImplements(A, I1)

pip install -e .[dev]
parse_log_pytest
pytest
nose coverage pytest
apt-get update apt-get install -y gcc
3.9
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
coverage==7.8.0
exceptiongroup @ file:///croot/exceptiongroup_1706031385326/work
iniconfig @ file:///home/linux1/recipes/ci/iniconfig_1610983019677/work
nose==1.3.7
packaging @ file:///croot/packaging_1734472117206/work
pluggy @ file:///croot/pluggy_1733169602837/work
pytest @ file:///croot/pytest_1738938843180/work
tomli @ file:///opt/conda/conda-bld/tomli_1657175507142/work
-e git+https://github.com/zopefoundation/zope.interface.git@e79273048b92735fb23fcee7f695a5ed5d72f647#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
  - exceptiongroup=1.2.0=py39h06a4308_0
  - iniconfig=1.1.1=pyhd3eb1b0_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
  - packaging=24.2=py39h06a4308_0
  - pip=25.0=py39h06a4308_0
  - pluggy=1.5.0=py39h06a4308_0
  - pytest=8.3.4=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
  - tomli=2.0.1=py39h06a4308_0
  - tzdata=2025a=h04d1e81_0
  - wheel=0.45.1=py39h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==7.8.0
      - nose==1.3.7
prefix: /opt/conda/envs/zope.interface

src/zope/interface/tests/test_declarations.py::TestImplements::test_sort src/zope/interface/tests/test_declarations.py::Test_implementer::test_nonclass_can_assign_attr
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::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__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___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___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_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::TestImplements::test___reduce__ src/zope/interface/tests/test_declarations.py::TestImplements::test___repr__ src/zope/interface/tests/test_declarations.py::TestImplements::test_ctor_no_bases 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_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_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_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_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_non_descriptor_aware_metaclass 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_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_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_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_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_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_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_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_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::test_suite src/zope/interface/tests/test_odd_declarations.py::Test::test_ObjectSpecification src/zope/interface/tests/test_odd_declarations.py::Test::test_classImplements src/zope/interface/tests/test_odd_declarations.py::Test::test_classImplementsOnly src/zope/interface/tests/test_odd_declarations.py::Test::test_directlyProvides src/zope/interface/tests/test_odd_declarations.py::Test::test_directlyProvides_fails_for_odd_class src/zope/interface/tests/test_odd_declarations.py::Test::test_implementedBy src/zope/interface/tests/test_odd_declarations.py::test_suite
src/zope/interface/declarations.py src/zope/interface/interface.py CHANGES.rst
src/zope/interface/declarations.py src/zope/interface/interface.py CHANGES.rst