##############################################################################
#
# Copyright (c) 2004, 2005 Zope Corporation and Contributors.
# All Rights Reserved.
#
# This software is subject to the provisions of the Zope Public License,
# Version 2.1 (ZPL).  A copy of the ZPL should accompany this distribution.
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
# FOR A PARTICULAR PURPOSE.
#
##############################################################################
"""Five interfaces

$Id: interfaces.py 18584 2005-10-14 17:13:27Z regebro $
"""
from zope.interface import Interface, Attribute
from zope.component.interfaces import IComponentLookup

class IRegisterUtilitySimply(Interface):
    """Register utilities simply

    Allow local registrations of utilities, in a much simpler
    manner than Zope 3 does it currently.

    Note: The name of this interface is expressed as a verb
    (describing the action it expresses, namely registering
    utilities).  The reason for that is that the names *utility
    registry* (successor of the Zope 3 utility service) and *utility
    registration* (object in a registration stack, part of the
    complicated registration framework in Zope 3) have different
    connotations in Zope 3 than we want to express here.
    """

    def registerUtility(self, interface, utility, name=''):
        """Registers a utility in the local context"""
        # TODO Define an exception than is to be thrown when a local
        # utility of that interface and name is already registered.

    next = Attribute("The next local registry in the tree. This attribute "
                     "represents the parent of this registry node. If the "
                     "value is ``None``, then this registry represents the "
                     "root of the tree")

class IFiveUtilityRegistry(IRegisterUtilitySimply):
    """Look up and register utilities"""
     
    def getUtility(interface, name='', context=None):
        """Get the utility that provides interface

        Returns the nearest utility to the context that implements the
        specified interface.  If one is not found, raises
        ComponentLookupError.
        """

    def queryUtility(interface, name='', default=None, context=None):
        """Look for the utility that provides interface

        Returns the nearest utility to the context that implements
        the specified interface.  If one is not found, returns default.
        """

    def getUtilitiesFor(interface, context=None):
        """Return the utilities that provide an interface

        An iterable of utility name-value pairs is returned.
        """

    def getAllUtilitiesRegisteredFor(interface, context=None):
        """Return all registered utilities for an interface

        This includes overridden utilities.

        An iterable of utility instances is returned.  No names are
        returned.
        """

class IFiveSiteManager(IComponentLookup, IRegisterUtilitySimply):
    """Five site manager

    For the sake of forward-portability, registering utilities can be
    done directly on the site manager to cut out the middle man called
    utility service (this corresponds to Zope 3.1's understanding of
    site managers).  An implementation of this interface will probably
    delegate the work to an IFiveUtilityService component, though."""
