def METHOD_NAME(func: Callable) -> Callable:
    @wraps(func)
    def wrapper(*args: List[Any], **kwargs: Any) -> Any:
        tracemalloc.start()
        result = func(*args, **kwargs)
        # get memory usage immediately after function call, we interested in "first_size" value
        first_size, first_peak = tracemalloc.get_traced_memory()
        # get snapshot immediately just in case we will use it
        snapshot = tracemalloc.take_snapshot()
        # only if we exceeded the quota, build log_messages with traces
        first_size_in_megabytes = first_size / 1024**2
        if first_size_in_megabytes > max_memory_in_megabytes:
            log_messages: List[str] = []
            top_stats = snapshot.statistics("lineno")
            for index, stat in enumerate(top_stats[:print_limit], 1):
                frame = stat.traceback[0]
                filename = os.sep.join(frame.filename.split(os.sep)[-2:])
                log_messages.append("#%s: %s:%s: %.1f KiB" % (index, filename, frame.lineno, stat.size / 1024))
                line = linecache.getline(frame.filename, frame.lineno).strip()
                if line:
                    log_messages.append(f"    {line}")
            traceback_log = "\n".join(log_messages)
            assert False, f"Overuse of memory, used: {first_size_in_megabytes}Mb, limit: {max_memory_in_megabytes}Mb!!\n{traceback_log}"
        return result
    return wrapper