Injects your module with utool magic

    Utool magic is not actually magic. It just turns your ``print`` statments into
    logging statments, allows for your module to be used with the utool.Indent
    context manager and the and utool.indent_func decorator. ``printDBG`` will soon
    be deprecated as will ``print_``. The function rrr is a developer convinience for
    reloading the module dynamically durring runtime. The profile decorator is
    a no-op if not using kernprof.py, otherwise it is kernprof.py's profile
    decorator.

    Args:
        module_name (str): the __name__ varaible in your module
        module_prefix (str): a user defined module prefix
        DEBUG (bool):
        module (None): the actual module (optional)

    Returns:
        tuple : (print, print_, printDBG, rrr, profile_)

    Example:
        >>> # DISABLE_DOCTEST
        >>> from utool.util_inject import *  # NOQA
        >>> from __future__ import absolute_import, division, print_function, unicode_literals
        >>> from util.util_inject import inject
        >>> print, rrr, profile = inject2(__name__, '[mod]')

def inject(module_name=None, module_prefix='[???]', DEBUG=False, module=None, N=1):
    """
    Injects your module with utool magic

    Utool magic is not actually magic. It just turns your ``print`` statments into
    logging statments, allows for your module to be used with the utool.Indent
    context manager and the and utool.indent_func decorator. ``printDBG`` will soon
    be deprecated as will ``print_``. The function rrr is a developer convinience for
    reloading the module dynamically durring runtime. The profile decorator is
    a no-op if not using kernprof.py, otherwise it is kernprof.py's profile
    decorator.

    Args:
        module_name (str): the __name__ varaible in your module
        module_prefix (str): a user defined module prefix
        DEBUG (bool):
        module (None): the actual module (optional)

    Returns:
        tuple : (print, print_, printDBG, rrr, profile_)

    Example:
        >>> # DISABLE_DOCTEST
        >>> from utool.util_inject import *  # NOQA
        >>> from __future__ import absolute_import, division, print_function, unicode_literals
        >>> from util.util_inject import inject
        >>> print, rrr, profile = inject2(__name__, '[mod]')
    """
    #noinject(module_name, module_prefix, DEBUG, module, N=1)
    noinject(module_name, module_prefix, DEBUG, module, N=N)
    module = _get_module(module_name, module)
    rrr         = make_module_reload_func(None, module_prefix, module)
    profile_    = make_module_profile_func(None, module_prefix, module)
    print_funcs = inject_print_functions(None, module_prefix, DEBUG, module)
    (print, print_, printDBG) = print_funcs
    return (print, print_, printDBG, rrr, profile_)