docs: def task(self, func: Optional[Callable]=None, name: Optional[str]=None,
               queue: Optional[str]=None, max_retries: Optional[Number]=None,
               periodicity: Optional[timedelta]=None):
          """Decorator to register a task function.
  
          :arg name: name of the task, used later to schedule jobs
          :arg queue: queue of the task, the default is used if not provided
          :arg max_retries: maximum number of retries, the default is used if
               not provided
          :arg periodicity: for periodic tasks, delay between executions as a
               timedelta
  
          >>> tasks = Tasks()
          >>> @tasks.task(name='foo')
          >>> def foo():
          ...    pass
          """
          if func is None:
              return functools.partial(self.task, name=name, queue=queue,
                                       max_retries=max_retries,
                                       periodicity=periodicity)
  
          self.add(func, name=name, queue=queue, max_retries=max_retries,
                   periodicity=periodicity)
  
          # Add an attribute to the function to be able to conveniently use it as
          # spin.schedule(function) instead of spin.schedule('task_name')
          func.task_name = name
  
          return func