def METHOD_NAME(
    cls,
    controller: Optional[Type] = None,
    *,
    name: Optional[str] = None,
    body_action: Optional[bool] = None,
):
    r"""Registers a new control with Habitat-Sim. Registered controls can
    then be retrieved via `get_move_fn()`
    See `new-actions <new-actions.html>`_ for an example of how to add new actions
    *outside* the core habitat_sim package.
    :param controller: The class of the controller to register. Must inherit from `agent.SceneNodeControl`.
        If :py:`None`, will return a wrapper for use with decorator syntax.
    :param name: The name to register the control with. If :py:`None`, will
        register with the name of the controller converted to snake case,
        i.e. a controller with class name ``MoveForward`` will be registered as
        ``move_forward``.
    :param body_action: Whether or not this action manipulates the agent's body
        (thereby also moving the sensors) or manipulates just the sensors.
        This is a non-optional keyword arguement and must be set (this is done
        for readability).
    """
    assert (
        body_action is not None
    ), "body_action must be explicitly set to True or False"
    from habitat_sim.agent.controls.controls import SceneNodeControl
    def _wrapper(controller: Type[SceneNodeControl]):
        assert issubclass(
            controller, SceneNodeControl
        ), "All controls must inherit from habitat_sim.agent.SceneNodeControl"
        cls._mapping["move_fn"][
            _camel_to_snake(controller.__name__) if name is None else name
        ] = controller(body_action)
        return controller
    if controller is None:
        return _wrapper
    return _wrapper(controller)