docs: def debounce(self, wait, immediate=None):
          """
          Returns a function, that, as long as it continues to be invoked,
          will not be triggered. The function will be called after it stops
          being called for N milliseconds. If `immediate` is passed, trigger
          the function on the leading edge, instead of the trailing.
          """
          wait = (float(wait) / float(1000))
  
          def debounced(*args, **kwargs):
              def call_it():
                  self.obj(*args, **kwargs)
              try:
                  debounced.t.cancel()
              except(AttributeError):
                  pass
              debounced.t = Timer(wait, call_it)
              debounced.t.start()
          return self._wrap(debounced)