def inspect_node(mixed, *, _partial=None):
    """
    If the given argument is somehow a :class:`bonobo.config.Configurable` object (either a subclass, an instance, or
    a partially configured instance), then it will return a :class:`ConfigurableInspection` namedtuple, used to inspect
    the configurable metadata (options). If you want to get the option values, you don't need this, it is only usefull
    to perform introspection on a configurable.

    If it's not looking like a configurable, it will raise a :class:`TypeError`.

    :param mixed:
    :return: ConfigurableInspection

    :raise: TypeError
    """
    if isconfigurabletype(mixed, strict=True):
        inst, typ = None, mixed
    elif isconfigurable(mixed):
        inst, typ = mixed, type(mixed)
    elif hasattr(mixed, "func"):
        return inspect_node(mixed.func, _partial=(mixed.args, mixed.keywords))
    else:
        raise TypeError(
            "Not a Configurable, nor a Configurable instance and not even a partially configured Configurable. Check your inputs."
        )

    return ConfigurableInspection(typ, inst, list(typ.__options__), list(typ.__processors__), _partial)