#!/usr/bin/env python
# encoding: utf-8
"""
A class for creating a Twisted service that is configured using IPython's
configuration system.
"""

#-----------------------------------------------------------------------------
#  Copyright (C) 2008-2009  The IPython Development Team
#
#  Distributed under the terms of the BSD License.  The full license is in
#  the file COPYING, distributed as part of this software.
#-----------------------------------------------------------------------------

#-----------------------------------------------------------------------------
# Imports
#-----------------------------------------------------------------------------

import zope.interface as zi

from IPython.core.component import Component

#-----------------------------------------------------------------------------
# Code
#-----------------------------------------------------------------------------


class IConfiguredObjectFactory(zi.Interface):
    """I am a component that creates a configured object.

    This class is useful if you want to configure a class that is not a 
    subclass of :class:`IPython.core.component.Component`.
    """

    def __init__(config):
        """Get ready to configure the object using config."""

    def create():
        """Return an instance of the configured object."""


class ConfiguredObjectFactory(Component):

    zi.implements(IConfiguredObjectFactory)

    def __init__(self, config):
        super(ConfiguredObjectFactory, self).__init__(None, config=config)

    def create(self):
        raise NotImplementedError('create must be implemented in a subclass')


class IAdaptedConfiguredObjectFactory(zi.Interface):
    """I am a component that adapts and configures an object.

    This class is useful if you have the adapt an instance and configure it.
    """

    def __init__(config, adaptee=None):
        """Get ready to adapt adaptee and then configure it using config."""

    def create():
        """Return an instance of the adapted and configured object."""


class AdaptedConfiguredObjectFactory(Component):

    # zi.implements(IAdaptedConfiguredObjectFactory)

    def __init__(self, config, adaptee):
        # print
        # print "config pre:", config
        super(AdaptedConfiguredObjectFactory, self).__init__(None, config=config)
        # print
        # print "config post:", config
        self.adaptee = adaptee

    def create(self):
        raise NotImplementedError('create must be implemented in a subclass')