# 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

        if isinstance(self.obj, ObjectDouble):
            return self.obj._doubles_target
        else:
            return self.obj

    def _determine_doubled_obj_type(self):
        """Returns the type (class) of the target object.

        :return: The type (class) of the target.
        :rtype: type, classobj
        """

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

        return self.doubled_obj.__class__

    def _generate_attrs(self):
        """Get detailed info about target object.

        Uses ``inspect.classify_class_attrs`` to get several important details about each attribute
        on the target object.

        :return: The attribute details dict.
        :rtype: dict
        """
        attrs = {}

        if ismodule(self.doubled_obj):

# 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


        if isinstance(self.obj, ObjectDouble):
            return self.obj._doubles_target
        else:
            return self.obj

    def _determine_doubled_obj_type(self):
        """Returns the type (class) of the target object.

        :return: The type (class) of the target.
        :rtype: type, classobj
        """

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

        return self.doubled_obj.__class__

    def _generate_attrs(self):
        """Get detailed info about target object.

        Uses ``inspect.classify_class_attrs`` to get several important details about each attribute
        on the target object.

        :return: The attribute details dict.
        :rtype: dict
        """
        attrs = {}

        if ismodule(self.doubled_obj):

            for name, func in getmembers(self.doubled_obj, is_callable):