summaryrefslogtreecommitdiff
path: root/docs
diff options
context:
space:
mode:
Diffstat (limited to 'docs')
-rw-r--r--docs/README.rst49
-rw-r--r--docs/api/declarations.rst2
2 files changed, 44 insertions, 7 deletions
diff --git a/docs/README.rst b/docs/README.rst
index 6fbd5f8..0364a81 100644
--- a/docs/README.rst
+++ b/docs/README.rst
@@ -863,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:
@@ -897,7 +898,13 @@ 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:
.. doctest::
@@ -936,21 +943,27 @@ 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.
The ``adapt`` method is responsible for adapting an object to the
reciever.
-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::
@@ -989,6 +1002,28 @@ 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`
+
.. [#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 955d246..fa265e7 100644
--- a/docs/api/declarations.rst
+++ b/docs/api/declarations.rst
@@ -36,6 +36,8 @@ To declare an interface itself, extend the ``Interface`` base class.
.. documented in README.rst
+.. autofunction:: interfacemethod
+
Declaring The Interfaces of Objects
===================================