docs: def do(self, job_func, *args, **kwargs):
          """
          Specifies the job_func that should be called every time the
          job runs.
  
          Any additional arguments are passed on to job_func when
          the job runs.
  
          :param job_func: The function to be scheduled
          :return: The invoked job instance
          """
          self.job_func = functools.partial(job_func, *args, **kwargs)
          try:
              functools.update_wrapper(self.job_func, job_func)
          except AttributeError:
              # job_funcs already wrapped by functools.partial won't have
              # __name__, __module__ or __doc__ and the update_wrapper()
              # call will fail.
              pass
          self._schedule_next_run()
          self.scheduler.jobs.append(self)
          return self