docs: def handleEvent(self, eventObj):
          """All MOUSEMOTION, MOUSEBUTTONUP, MOUSEBUTTONDOWN event objects
          created by Pygame should be passed to this method. handleEvent() will
          detect if the event is relevant to this button and change its state.
  
          There are two ways that your code can respond to button-events. One is
          to inherit the PygButton class and override the mouse*() methods. The
          other is to have the caller of handleEvent() check the return value
          for the strings 'enter', 'move', 'down', 'up', 'click', or 'exit'.
  
          Note that mouseEnter() is always called before mouseMove(), and
          mouseMove() is always called before mouseExit(). Also, mouseUp() is
          always called before mouseClick().
  
          buttonDown is always True when mouseDown() is called, and always False
          when mouseUp() or mouseClick() is called. lastMouseDownOverButton is
          always False when mouseUp() or mouseClick() is called."""
  
          if eventObj.type not in (MOUSEMOTION, MOUSEBUTTONUP, MOUSEBUTTONDOWN) or not self._visible:
              # The button only cares bout mouse-related events (or no events, if it is invisible)
              return []
  
          retVal = []
  
          hasExited = False
          if not self.mouseOverButton and self._rect.collidepoint(eventObj.pos):
              # if mouse has entered the button:
              self.mouseOverButton = True
              self.mouseEnter(eventObj)
              retVal.append('enter')
          elif self.mouseOverButton and not self._rect.collidepoint(eventObj.pos):
              # if mouse has exited the button:
              self.mouseOverButton = False
              hasExited = True # call mouseExit() later, since we want mouseMove() to be handled before mouseExit()
  
          if self._rect.collidepoint(eventObj.pos):
              # if mouse event happened over the button:
              if eventObj.type == MOUSEMOTION:
                  self.mouseMove(eventObj)
                  retVal.append('move')
              elif eventObj.type == MOUSEBUTTONDOWN:
                  self.buttonDown = True
                  self.lastMouseDownOverButton = True
                  self.mouseDown(eventObj)
                  retVal.append('down')
          else:
              if eventObj.type in (MOUSEBUTTONUP, MOUSEBUTTONDOWN):
                  # if an up/down happens off the button, then the next up won't cause mouseClick()
                  self.lastMouseDownOverButton = False
  
          # mouse up is handled whether or not it was over the button
          doMouseClick = False
          if eventObj.type == MOUSEBUTTONUP:
              if self.lastMouseDownOverButton:
                  doMouseClick = True
              self.lastMouseDownOverButton = False
  
              if self.buttonDown:
                  self.buttonDown = False
                  self.mouseUp(eventObj)
                  retVal.append('up')
  
              if doMouseClick:
                  self.buttonDown = False
                  self.mouseClick(eventObj)
                  retVal.append('click')
  
          if hasExited:
              self.mouseExit(eventObj)
              retVal.append('exit')
  
          return retVal