def METHOD_NAME(self, module: cst.Module) -> cst.Module:
    # We use `unsafe_skip_copy`` here not only to save some time, but
    # because `deep_replace`` is identity-based and will not work on
    # the original module if the wrapper does a deep copy:
    # in that case we would need to use `wrapped_module.module`
    # instead of `module`.
    wrapped_module = cst.MetadataWrapper(module, unsafe_skip_copy=True)
    visitors = GET_ALL_VISITORS()
    violations = []
    needed_imports = []
    wrapped_module.visit_batched(visitors)
    for v in visitors:
        violations += v.violations
        needed_imports += v.needed_imports
    fixes_count = 0
    replacement_map = {}
    assert self.context.filename is not None
    for violation in violations:
        skip_violation = False
        if self.config is None or self.config.select != "ALL":
            for disabled_code in DISABLED_BY_DEFAULT:
                if violation.error_code.startswith(disabled_code):
                    skip_violation = True
                    break
        if skip_violation:
            continue
        if violation.replacement is not None:
            replacement_map[id(violation.node)] = violation.replacement
            fixes_count += 1
        try:
            path = Path(self.context.filename).relative_to(Path.cwd())
        except ValueError:
            # Not a subpath of a current dir, use absolute path
            path = Path(self.context.filename)
        print(f"{path}{violation.codemod_result()}")
    new_module = deep_multi_replace(module, replacement_map)
    add_imports_visitor = codemod.visitors.AddImportsVisitor(
        self.context, needed_imports
    )
    new_module = new_module.visit(add_imports_visitor)
    update_functorch_imports_visitor = _UpdateFunctorchImports()
    new_module = new_module.visit(update_functorch_imports_visitor)
    if fixes_count == 0 and not update_functorch_imports_visitor.changed:
        raise codemod.SkipFile("No changes")
    return new_module