def METHOD_NAME(self, original: cst.Call, updated: cst.Call) -> cst.CSTNode:
    try:
        key = original.func.attr.value
        kword_params = self.METHOD_TO_PARAMS[key]
    except (AttributeError, KeyError):
        # Either not a method from the API or too convoluted to be sure.
        return updated
    # If the existing code is valid, keyword args come after positional args.
    # Therefore, all positional args must map to the first parameters.
    args, kwargs = partition(lambda a: not bool(a.keyword), updated.args)
    if any(k.keyword.value == "request" for k in kwargs):
        # We've already fixed this file, don't fix it again.
        return updated
    kwargs, ctrl_kwargs = partition(
        lambda a: not a.keyword.value in self.CTRL_PARAMS,
        kwargs
    )
    args, ctrl_args = args[:len(kword_params)], args[len(kword_params):]
    ctrl_kwargs.extend(cst.Arg(value=a.value, keyword=cst.Name(value=ctrl))
                       for a, ctrl in zip(ctrl_args, self.CTRL_PARAMS))
    request_arg = cst.Arg(
        value=cst.Dict([
            cst.DictElement(
                cst.SimpleString("'{}'".format(name)),
                cst.Element(value=arg.value)
            )
            # Note: the args + kwargs looks silly, but keep in mind that
            # the control parameters had to be stripped out, and that
            # those could have been passed positionally or by keyword.
            for name, arg in zip(kword_params, args + kwargs)]),
        keyword=cst.Name("request")
    )
    return updated.with_changes(
        args=[request_arg] + ctrl_kwargs
    )