def METHOD_NAME(func: Callable):
    def wrapper(*args: tuple, **kwargs: dict):
        nonlocal labels
        nonlocal outputs
        nonlocal inputs
        # Set default `inputs` - inspect the full signature and add the user's input on top of it:
        if inputs:
            # Get the available parameters type hints from the function's signature:
            func_signature = inspect.signature(func)
            parameters = OrderedDict(
                {
                    parameter.name: parameter.annotation
                    for parameter in func_signature.parameters.values()
                }
            )
            # If user input is given, add it on top of the collected defaults (from signature):
            if isinstance(inputs, dict):
                parameters.update(inputs)
            inputs = parameters
        # Create a context handler and look for a context:
        cxt_handler = ContextHandler()
        cxt_handler.look_for_context(args=args, kwargs=kwargs)
        # If an MLRun context is found, parse arguments pre-run (kwargs are parsed inplace):
        if cxt_handler.is_context_available() and inputs:
            args = cxt_handler.parse_inputs(
                args=args, kwargs=kwargs, type_hints=inputs
            )
        # Call the original function and get the returning values:
        func_outputs = func(*args, **kwargs)
        # If an MLRun context is found, set the given labels and log the returning values to MLRun via the context:
        if cxt_handler.is_context_available():
            if labels:
                # TODO: Should deprecate this labels
                cxt_handler.set_labels(labels=labels)
            if outputs:
                cxt_handler.log_outputs(
                    outputs=func_outputs
                    if type(func_outputs) is tuple
                    and not config.packagers.pack_tuples
                    else [func_outputs],
                    log_hints=outputs,
                )
                return  # Do not return any values as the returning values were logged to MLRun.
        return func_outputs
    # Make sure to pass the wrapped function's signature (argument list, type hints and doc strings) to the wrapper:
    wrapper = functools.wraps(func)(wrapper)
    return wrapper