diff --git a/CHANGES.rst b/CHANGES.rst
index 1d6923c..cfb52d4 100644
--- a/CHANGES.rst
+++ b/CHANGES.rst
@@ -5,6 +5,13 @@
 5.0.0 (unreleased)
 ==================
 
+- Make an internal singleton object returned by APIs like
+  ``implementedBy`` and ``directlyProvidedBy`` immutable. Previously,
+  it was fully mutable and allowed changing its ``__bases___``. That
+  could potentially lead to wrong results in pathological corner
+  cases. See `issue 158
+  <https://github.com/zopefoundation/zope.interface/issues/158>`_.
+
 - Support the ``PURE_PYTHON`` environment variable at runtime instead
   of just at wheel build time. A value of 0 forces the C extensions to
   be used (even on PyPy) failing if they aren't present. Any other
diff --git a/src/zope/interface/declarations.py b/src/zope/interface/declarations.py
index cc20f5a..83f424c 100644
--- a/src/zope/interface/declarations.py
+++ b/src/zope/interface/declarations.py
@@ -111,6 +111,59 @@ class Declaration(Specification):
     __radd__ = __add__
 
 
+class _ImmutableDeclaration(Declaration):
+    # A Declaration that is immutable. Used as a singleton to
+    # return empty answers for things like ``implementedBy``.
+    # We have to define the actual singleton after normalizeargs
+    # is defined, and that in turn is defined after InterfaceClass and
+    # Implements.
+
+    __slots__ = ()
+
+    __instance = None
+
+    def __new__(cls):
+        if _ImmutableDeclaration.__instance is None:
+            _ImmutableDeclaration.__instance = object.__new__(cls)
+        return _ImmutableDeclaration.__instance
+
+    def __reduce__(self):
+        return "_empty"
+
+    @property
+    def __bases__(self):
+        return ()
+
+    @__bases__.setter
+    def __bases__(self, new_bases):
+        # We expect the superclass constructor to set ``self.__bases__ = ()``.
+        # Rather than attempt to special case that in the constructor and allow
+        # setting __bases__ only at that time, it's easier to just allow setting
+        # the empty tuple at any time. That makes ``x.__bases__ = x.__bases__`` a nice
+        # no-op too. (Skipping the superclass constructor altogether is a recipe
+        # for maintenance headaches.)
+        if new_bases != ():
+            raise TypeError("Cannot set non-empty bases on shared empty Declaration.")
+
+    @property
+    def dependents(self):
+        return {}
+
+    def changed(self, originally_changed):
+        # Does nothing, we have no dependents or dependencies
+        return
+
+    def interfaces(self):
+        # An empty iterator
+        return iter(())
+
+    def extends(self, interface, strict=True):
+        return False
+
+    def get(self, name, default=None):
+        return default
+
+
 ##############################################################################
 #
 # Implementation specifications
@@ -914,8 +967,6 @@ def _normalizeargs(sequence, output=None):
 
     return output
 
-# XXX: Declarations are mutable, allowing adjustments to their __bases__
-# so having one as a singleton may not be a great idea.
-_empty = Declaration() # type: Declaration
+_empty = _ImmutableDeclaration()
 
 objectSpecificationDescriptor = ObjectSpecificationDescriptor()

`_empty` singleton is mutable
zope.interface.declarations returns a global `_empty` Declaration object in a few cases. But this object is fully mutable: its bases can be set, it can be subscribed and have dependents added. That doesn't seem safe for a global object. 

Can we either:

- Stop returning a global object from these APIs (return a new object); or 
- introduce a special subclass that's truly immutable (prohibits changing bases, adding dependents, etc).
diff --git a/src/zope/interface/tests/test_declarations.py b/src/zope/interface/tests/test_declarations.py
index 887a5cb..5256b07 100644
--- a/src/zope/interface/tests/test_declarations.py
+++ b/src/zope/interface/tests/test_declarations.py
@@ -239,6 +239,59 @@ class DeclarationTests(unittest.TestCase):
         self.assertEqual(list(after), [IFoo, IBar, IBaz])
 
 
+class TestImmutableDeclaration(unittest.TestCase):
+
+    def _getTargetClass(self):
+        from zope.interface.declarations import _ImmutableDeclaration
+        return _ImmutableDeclaration
+
+    def _getEmpty(self):
+        from zope.interface.declarations import _empty
+        return _empty
+
+    def test_pickle(self):
+        import pickle
+        copied = pickle.loads(pickle.dumps(self._getEmpty()))
+        self.assertIs(copied, self._getEmpty())
+
+    def test_singleton(self):
+        self.assertIs(
+            self._getTargetClass()(),
+            self._getEmpty()
+        )
+
+    def test__bases__(self):
+        self.assertEqual(self._getEmpty().__bases__, ())
+
+    def test_change__bases__(self):
+        empty = self._getEmpty()
+        empty.__bases__ = ()
+        self.assertEqual(self._getEmpty().__bases__, ())
+
+        with self.assertRaises(TypeError):
+            empty.__bases__ = (1,)
+
+    def test_dependents(self):
+        empty = self._getEmpty()
+        deps = empty.dependents
+        self.assertEqual({}, deps)
+        # Doesn't change the return.
+        deps[1] = 2
+        self.assertEqual({}, empty.dependents)
+
+    def test_changed(self):
+        # Does nothing, has no visible side-effects
+        self._getEmpty().changed(None)
+
+    def test_extends_always_false(self):
+        self.assertFalse(self._getEmpty().extends(self))
+        self.assertFalse(self._getEmpty().extends(self, strict=True))
+        self.assertFalse(self._getEmpty().extends(self, strict=False))
+
+    def test_get_always_default(self):
+        self.assertIsNone(self._getEmpty().get('name'))
+        self.assertEqual(self._getEmpty().get('name', 42), 42)
+
 class TestImplements(unittest.TestCase):
 
     def _getTargetClass(self):

pip install -e .[test]
parse_log_pytest
requirements.txt
coverage zope.event Sphinx repoze.sphinx.autointerface pytest
apt-get update apt-get install -y gcc
3.7
requirements/base.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
alabaster==0.7.13
Babel==2.14.0
certifi @ file:///croot/certifi_1671487769961/work/certifi
charset-normalizer==3.4.1
coverage==7.2.7
docutils==0.19
exceptiongroup==1.2.2
idna==3.10
imagesize==1.4.1
importlib-metadata==6.7.0
iniconfig==2.0.0
Jinja2==3.1.6
MarkupSafe==2.1.5
packaging==24.0
pluggy==1.2.0
Pygments==2.17.2
pytest==7.4.4
pytz==2025.2
repoze.sphinx.autointerface==1.0.0
requests==2.31.0
snowballstemmer==2.2.0
Sphinx==5.3.0
sphinxcontrib-applehelp==1.0.2
sphinxcontrib-devhelp==1.0.2
sphinxcontrib-htmlhelp==2.0.0
sphinxcontrib-jsmath==1.0.1
sphinxcontrib-qthelp==1.0.3
sphinxcontrib-serializinghtml==1.1.5
tomli==2.0.1
typing_extensions==4.7.1
urllib3==2.0.7
zipp==3.15.0
zope.event==5.0
-e git+https://github.com/zopefoundation/zope.interface.git@c120080902ea01432bceefa329b8c40a34782552#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
  - certifi=2022.12.7=py37h06a4308_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=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - alabaster==0.7.13
      - babel==2.14.0
      - charset-normalizer==3.4.1
      - coverage==7.2.7
      - docutils==0.19
      - exceptiongroup==1.2.2
      - idna==3.10
      - imagesize==1.4.1
      - importlib-metadata==6.7.0
      - iniconfig==2.0.0
      - jinja2==3.1.6
      - markupsafe==2.1.5
      - packaging==24.0
      - pluggy==1.2.0
      - pygments==2.17.2
      - pytest==7.4.4
      - pytz==2025.2
      - repoze-sphinx-autointerface==1.0.0
      - requests==2.31.0
      - snowballstemmer==2.2.0
      - sphinx==5.3.0
      - sphinxcontrib-applehelp==1.0.2
      - sphinxcontrib-devhelp==1.0.2
      - sphinxcontrib-htmlhelp==2.0.0
      - sphinxcontrib-jsmath==1.0.1
      - sphinxcontrib-qthelp==1.0.3
      - sphinxcontrib-serializinghtml==1.1.5
      - tomli==2.0.1
      - typing-extensions==4.7.1
      - urllib3==2.0.7
      - zipp==3.15.0
      - zope-event==5.0
prefix: /opt/conda/envs/zope.interface

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_pickle src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_singleton src/zope/interface/tests/test_declarations.py::Test_implementedByFallback::test_dictless_wo_existing_Implements_wo_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_alsoProvides::test_wo_existing_provides 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::Test_directlyProvidedBy::test_w_declarations_in_class_but_not_instance src/zope/interface/tests/test_declarations.py::Test_directlyProvidedBy::test_wo_declarations_in_class_or_instance src/zope/interface/tests/test_declarations.py::Test_getObjectSpecificationFallback::test_wo_existing_provides_classless src/zope/interface/tests/test_declarations.py::Test_getObjectSpecification::test_wo_existing_provides_classless
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::TestImmutableDeclaration::test__bases__ src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_extends_always_false src/zope/interface/tests/test_declarations.py::TestImmutableDeclaration::test_get_always_default 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::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_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_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_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_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_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::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_w_simple_metaclass 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_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_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_optimizations 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_optimizations 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/declarations.py CHANGES.rst
src/zope/interface/declarations.py CHANGES.rst