docs: def on_touch_down(self, touch):
          """Check for collisions and select an appropriate entity."""
          if hasattr(self, '_lasttouch') and self._lasttouch == touch:
              return
          if not self.collide_point(*touch.pos):
              return
          touch.push()
          touch.apply_transform_2d(self.to_local)
          if self.app.selection:
              if self.app.selection.collide_point(*touch.pos):
                  Logger.debug("Board: hit selection")
                  touch.grab(self.app.selection)
          pawns = list(self.pawns_at(*touch.pos))
          if pawns:
              Logger.debug("Board: hit {} pawns".format(len(pawns)))
              self.selection_candidates = pawns
              if self.app.selection in self.selection_candidates:
                  self.selection_candidates.remove(self.app.selection)
              touch.pop()
              return True
          spots = list(self.spots_at(*touch.pos))
          if spots:
              Logger.debug("Board: hit {} spots".format(len(spots)))
              self.selection_candidates = spots
              if self.adding_portal:
                  self.origspot = self.selection_candidates.pop(0)
                  self.protodest = Dummy(
                      name='protodest',
                      pos=touch.pos,
                      size=(0, 0)
                  )
                  self.add_widget(self.protodest)
                  self.protodest.on_touch_down(touch)
                  self.protoportal = self.proto_arrow_cls(
                      origin=self.origspot,
                      destination=self.protodest
                  )
                  self.add_widget(self.protoportal)
                  if self.reciprocal_portal:
                      self.protoportal2 = self.proto_arrow_cls(
                          destination=self.origspot,
                          origin=self.protodest
                      )
                      self.add_widget(self.protoportal2)
              touch.pop()
              return True
          arrows = list(self.arrows_at(*touch.pos))
          if arrows:
              Logger.debug("Board: hit {} arrows".format(len(arrows)))
              self.selection_candidates = arrows
              if self.app.selection in self.selection_candidates:
                  self.selection_candidates.remove(self.app.selection)
              touch.pop()
              return True
          touch.pop()