docs: def on(f):
      """Decorator for action handlers.
  
      The action name is inferred from the function name.
  
      This also decorates the method with `tornado.gen.coroutine` so that
      `~tornado.concurrent.Future` can be yielded.
      """
      action = f.__name__
      f.action = action
  
      @wrapt.decorator
      @tornado.gen.coroutine
      def _execute(wrapped, instance, args, kwargs):
          return wrapped(*args, **kwargs)
  
      return _execute(f)