# 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
        """

        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):
            return self.obj.is_class

        return isclass(self.doubled_obj) or ismodule(self.doubled_obj)

    def _determine_doubled_obj(self):
        """Return the target object.

        Returns the object that should be treated as the target object. For partial doubles, this
        will be the same as ``self.obj``, but for pure doubles, it's pulled from the special
        ``_doubles_target`` attribute.

        :return: The object to be doubled.
        :rtype: object
        """


# 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

        """

        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):
            return self.obj.is_class

        return isclass(self.doubled_obj) or ismodule(self.doubled_obj)

    def _determine_doubled_obj(self):
        """Return the target object.

        Returns the object that should be treated as the target object. For partial doubles, this
        will be the same as ``self.obj``, but for pure doubles, it's pulled from the special
        ``_doubles_target`` attribute.

        :return: The object to be doubled.
        :rtype: object
        """


        if isinstance(self.obj, ObjectDouble):