# Path: doubles/object_double.py
# class ObjectDouble(object):
#     """
#     A pure double representing the target object.
# 
#     ::
# 
#         dummy_user = ObjectDouble(user)
# 
#     :param object target: The object the newly created ObjectDouble will verify against.
#     """
#     is_class = False
# 
#     def __init__(self, target):
#         self._doubles_target = target
# 
#     def __repr__(self):
#         """Provides a string representation of the double.
# 
#         NOTE: Includes the memory address and the name of the object being doubled.
# 
#         :return: A string representation of the double.
#         :rtype: str
#         """
# 
#         address = hex(id(self))
#         class_name = self.__class__.__name__
# 
#         return '<{} of {!r} object at {}>'.format(
#             class_name,
#             self._doubles_target,
#             address
#         )
# 
# Path: doubles/verification.py
# def is_callable(obj):
#     if isfunction(obj):
#         return True
#     return hasattr(obj, '__call__')


from collections import namedtuple
from inspect import classify_class_attrs, isclass, ismodule, getmembers
from doubles.object_double import ObjectDouble
from doubles.verification import is_callable
            return instance.__dict__[name](*args, **kwargs)
        return original(instance, *args, **kwargs)

    func._doubles_target_method = original
    return func


class Target(object):
    """
    A wrapper around an object that owns methods to be doubled. Provides additional introspection
    such as the class and the kind (method, class, property, etc.)
    """

    def __init__(self, obj):
        """
        :param object obj: The real target object.
        """

        self.obj = obj
        self.doubled_obj = self._determine_doubled_obj()
        self.doubled_obj_type = self._determine_doubled_obj_type()
        self.attrs = self._generate_attrs()

    def is_class_or_module(self):
        """Determines if the object is a class or a module

        :return: True if the object is a class or a module, False otherwise.
        :rtype: bool
        """


# Path: doubles/object_double.py
# class ObjectDouble(object):
#     """
#     A pure double representing the target object.
# 
#     ::
# 
#         dummy_user = ObjectDouble(user)
# 
#     :param object target: The object the newly created ObjectDouble will verify against.
#     """
#     is_class = False
# 
#     def __init__(self, target):
#         self._doubles_target = target
# 
#     def __repr__(self):
#         """Provides a string representation of the double.
# 
#         NOTE: Includes the memory address and the name of the object being doubled.
# 
#         :return: A string representation of the double.
#         :rtype: str
#         """
# 
#         address = hex(id(self))
#         class_name = self.__class__.__name__
# 
#         return '<{} of {!r} object at {}>'.format(
#             class_name,
#             self._doubles_target,
#             address
#         )
# 
# Path: doubles/verification.py
# def is_callable(obj):
#     if isfunction(obj):
#         return True
#     return hasattr(obj, '__call__')


# Path: doubles/target.py
from collections import namedtuple
from inspect import classify_class_attrs, isclass, ismodule, getmembers
from doubles.object_double import ObjectDouble
from doubles.verification import is_callable

            return instance.__dict__[name](*args, **kwargs)
        return original(instance, *args, **kwargs)

    func._doubles_target_method = original
    return func


class Target(object):
    """
    A wrapper around an object that owns methods to be doubled. Provides additional introspection
    such as the class and the kind (method, class, property, etc.)
    """

    def __init__(self, obj):
        """
        :param object obj: The real target object.
        """

        self.obj = obj
        self.doubled_obj = self._determine_doubled_obj()
        self.doubled_obj_type = self._determine_doubled_obj_type()
        self.attrs = self._generate_attrs()

    def is_class_or_module(self):
        """Determines if the object is a class or a module

        :return: True if the object is a class or a module, False otherwise.
        :rtype: bool
        """


        if isinstance(self.obj, ObjectDouble):