Interfaces
----------

This is the same thing as object-oriented programming `interfaces`_.

.. _`interfaces`: http://java.sun.com/docs/books/tutorial/java/concepts/interface.html

Definition of an interface is quite trivial. An example from cubicweb
itself (found in cubicweb/interfaces.py):

.. sourcecode:: python

    class ITree(Interface):

        def parent(self):
            """returns the parent entity"""

        def children(self):
            """returns the item's children"""

        def children_rql(self):
            """returns RQL to get children"""

        def iterchildren(self):
            """iterates over the item's children"""

        def is_leaf(self):
            """returns true if this node as no child"""

        def is_root(self):
            """returns true if this node has no parent"""

        def root(self):
            """returns the root object"""


Declaration of interfaces implemented by a class
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. sourcecode:: python

  from cubicweb.interfaces import ITree
  from cubicweb.mixins import TreeMixIn

  class MyEntity(TreeMixIn, AnyEntity):
      __regid__ = 'MyEntity'
      __implements__ = AnyEntity.__implements__ + ('ITree',)

      tree_attribute = 'filed_under'

The TreeMixIn here provides a default implementation for the
interface. The tree_attribute class attribute is actually used by this
implementation to help implement correct behaviour.

Interfaces (and some implementations as mixins) defined in the library
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

.. automodule:: cubicweb.interfaces
   :members:

.. automodule:: cubicweb.mixins
   :members:



