def METHOD_NAME(
    cls,
    transfer_data: TransferData | dict[str, t.Any],
    start: datetime.datetime | str,
    interval: datetime.timedelta | int | None,
    *,
    name: str | None = None,
    stop_after: datetime.datetime | None = None,
    stop_after_n: int | None = None,
    scope: str | None = None,
    environment: str | None = None,
) -> TimerJob:
    r"""
    Specify data to create a Timer job using the parameters for a transfer. Timer
    will use those parameters to run the defined transfer operation, recurring at
    the given interval.
    :param transfer_data: A :class:`TransferData <globus_sdk.TransferData>` object.
        Construct this object exactly as you would normally; Timer will use this to
        run the recurring transfer.
    :type transfer_data: globus_sdk.TransferData
    :param start: The datetime at which to start the Timer job.
    :type start: datetime.datetime or str
    :param interval: The interval at which the Timer job should recur. Interpreted
        as seconds if specified as an integer. If ``stop_after_n == 1``, i.e. the
        job is set to run only a single time, then interval *must* be None.
    :type interval: datetime.timedelta or int
    :param name: A (not necessarily unique) name to identify this job in Timer
    :type name: str, optional
    :param stop_after: A date after which the Timer job will stop running
    :type stop_after: datetime.datetime, optional
    :param stop_after_n: A number of executions after which the Timer job will stop
    :type stop_after_n: int
    :param scope: Timer defaults to the Transfer 'all' scope. Use this parameter to
        change the scope used by Timer when calling the Transfer Action Provider.
    :type scope: str, optional
    :param environment: For internal use: because this method needs to generate a
        URL for the Transfer Action Provider, this argument can control which
        environment the Timer job is sent to.
    :type environment: str, optional
    """
    transfer_action_url = slash_join(
        get_service_url("actions", environment=environment), "transfer/transfer/run"
    )
    log.info(
        "Creating TimerJob from TransferData, action_url=%s", transfer_action_url
    )
    for key in ("submission_id", "skip_activation_check"):
        if key in transfer_data:
            raise ValueError(
                f"cannot create TimerJob from TransferData which has {key} set"
            )
    # dict will either convert a `TransferData` object or leave us with a dict here
    callback_body = {"body": dict(transfer_data)}
    return cls(
        transfer_action_url,
        callback_body,
        start,
        interval,
        name=name,
        stop_after=stop_after,
        stop_after_n=stop_after_n,
        scope=scope,
    )