#-------------------------------------------------------------------------------
#
#  Copyright (c) 2009, Enthought, Inc.
#  All rights reserved.
#
#  This software is provided without warranty under the terms of the BSD
#  license included in enthought/LICENSE.txt and may be redistributed only
#  under the conditions described in the aforementioned license.  The license
#  is also available online at http://www.enthought.com/licenses/BSD.txt
#
#  Thanks for using Enthought open source!
#
#-------------------------------------------------------------------------------

# Standard library imports
import sys

# ETS imports
from traits.etsconfig.api import ETSConfig


def _init_toolkit():
    """ Initialise the current toolkit.
    """

    # Force Traits to decide on its toolkit if it hasn't already
    from traitsui.toolkit import toolkit as traits_toolkit
    traits_toolkit()

    # Import the selected backend
    backend = 'enable.savage.trait_defs.ui.%s' % ETSConfig.toolkit
    try:
        __import__(backend)
    except ImportError, SystemExit:
        raise ImportError, "Unable to import a Savage backend for the %s " \
            "toolkit." % ETSConfig.toolkit

    # Save the imported toolkit module.
    global _toolkit_backend
    _toolkit_backend = backend

# Do this once then disappear.
_init_toolkit()
del _init_toolkit


def toolkit_object(name, raise_exceptions=False):
    """ Return the toolkit specific object with the given name.  The name
        consists of the relative module path and the object name separated by a
        colon.
    """

    mname, oname = name.split(':')

    class Unimplemented (object):
        """ This is returned if an object isn't implemented by the selected
            toolkit. It raises an exception if it is ever instantiated.
        """

        def __init__(self, *args, **kwargs):
            raise NotImplementedError("The %s Savage backend doesn't implement"
                                      "%s" % (ETSConfig.toolkit, oname))

    be_obj = Unimplemented
    be_mname = _toolkit_backend + '.' + mname
    try:
        __import__(be_mname)
        try:
            be_obj = getattr(sys.modules[be_mname], oname)
        except AttributeError, e:
            if raise_exceptions: raise e
    except ImportError, e:
        if raise_exceptions: raise e

    return be_obj

