""" A decorator for marking methods/functions as deprecated. """


# Standard library imports.
import logging

# We only warn about each function or method once!
_cache = {}


def deprecated(message):
    """ A factory for decorators for marking methods/functions as deprecated.

    """

    def decorator(fn):
        """ A decorator for marking methods/functions as deprecated. """

        def wrapper(*args, **kw):
            """ The method/function wrapper. """

            global _cache

            module_name = fn.__module__
            function_name = fn.__name__

            if (module_name, function_name) not in _cache:
                logging.getLogger(module_name).warning(
                    'DEPRECATED: %s.%s, %s' % (
                        module_name, function_name, message
                    )
                )

                _cache[(module_name, function_name)] = True

            return fn(*args, **kw)

        wrapper.__doc__  = fn.__doc__
        wrapper.__name__ = fn.__name__

        return wrapper

    return decorator

#### EOF ######################################################################

#  Test the 'trait_set', 'trait_get' interface to
#  the HasTraits class.
#
#  Copyright (c) 2014, Enthought, Inc.
#  All rights reserved.
#
#  This software is provided without warranty under the terms of the BSD
#  License included in /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!

""" A decorator for marking methods/functions as deprecated. """

# Standard library imports.
import functools
import warnings


def deprecated(message):
    """ A factory for decorators for marking methods/functions as deprecated.

    """
    def decorator(fn):
        """ A decorator for marking methods/functions as deprecated. """

        @functools.wraps(fn)
        def wrapper(*args, **kw):
            """ The method/function wrapper. """

            warnings.warn(message, DeprecationWarning, stacklevel=2)
            return fn(*args, **kw)

        return wrapper

    return decorator

Simplify deprecation machinery: don't cache previous messages, and use warnings instead of logging.