code: public function handleCustomAction(HTTPRequest $r)
      {
          $action = $r->param('Action');
          if (!$this->record->isCustomActionAllowed($action)) {
              return $this->httpError(403);
          }
  
          $formAction = $this->record->findActionByName($action);
          if (!$formAction) {
              return $this->httpError(403, "Action $action doesn't exist");
          }
  
          $message = $this->record->$action($formAction, $this->controller, $r);
  
          Controller::curr()->getResponse()->addHeader("X-Pjax", "Content");
          Controller::curr()->getResponse()->addHeader('X-Status', $message);
  
          if ($formAction->getRedirectURL()) {
              return Controller::curr()->redirect($formAction->getRedirectURL());
          }
  
          if ($formAction->getRedirectType() == BetterButtonCustomAction::GOBACK) {
              return Controller::curr()->redirect(preg_replace('/\?.*/', '', $this->parent->getBackLink()));
          }
  
          return Controller::curr()->redirect(
              $this->controller->getEditLink($this->record->ID)
          );
      }
docs: Takes the action at /customaction/my-action-name and feeds it to the DataObject.
  Checks to see if the method is allowed to be invoked first.
  
  @param  HTTPRequest $r
  @return HTTPResponse