def METHOD_NAME(self, *module_args, **complex_args):
    previous_frame = inspect.currentframe().f_back
    filename, line_number, function_name, lines, index = inspect.getframeinfo(previous_frame)
    verbose = complex_args.pop('verbose', True)
    if verbose:
        logger.debug(
            "{}::{}#{}: [{}] AnsibleModule::{}, args={}, kwargs={}".format(
                filename,
                function_name,
                line_number,
                self.hostname,
                self.module_name,
                json.dumps(module_args, cls=AnsibleHostBase.CustomEncoder),
                json.dumps(complex_args, cls=AnsibleHostBase.CustomEncoder)
            )
        )
    else:
        logger.debug(
            "{}::{}#{}: [{}] AnsibleModule::{} executing...".format(
                filename,
                function_name,
                line_number,
                self.hostname,
                self.module_name
            )
        )
    module_ignore_errors = complex_args.pop('module_ignore_errors', False)
    module_async = complex_args.pop('module_async', False)
    if module_async:
        def run_module(module_args, complex_args):
            return self.module(*module_args, **complex_args)[self.hostname]
        pool = ThreadPool()
        result = pool.apply_async(run_module, (module_args, complex_args))
        return pool, result
    module_args = json.loads(json.dumps(module_args, cls=AnsibleHostBase.CustomEncoder))
    complex_args = json.loads(json.dumps(complex_args, cls=AnsibleHostBase.CustomEncoder))
    res = self.module(*module_args, **complex_args)[self.hostname]
    if verbose:
        logger.debug(
            "{}::{}#{}: [{}] AnsibleModule::{} Result => {}".format(
                filename,
                function_name,
                line_number,
                self.hostname,
                self.module_name, json.dumps(res, cls=AnsibleHostBase.CustomEncoder)
            )
        )
    else:
        logger.debug(
            "{}::{}#{}: [{}] AnsibleModule::{} done, is_failed={}, rc={}".format(
                filename,
                function_name,
                line_number,
                self.hostname,
                self.module_name,
                res.is_failed,
                res.get('rc', None)
            )
        )
    if (res.is_failed or 'exception' in res) and not module_ignore_errors:
        raise RunAnsibleModuleFail("run module {} failed".format(self.module_name), res)
    return res