docs: def get_annotation(cls, fn):
          """Find the _schema_annotation attribute for the given function.
  
          This will descend through decorators until it finds something that has
          the attribute. If it doesn't find it anywhere, it will return None.
  
          :param func fn: Find the attribute on this function.
          :returns: an instance of
              :class:`~doctor.resource.ResourceSchemaAnnotation` or
              None.
          """
          while fn is not None:
              if hasattr(fn, '_schema_annotation'):
                  return fn._schema_annotation
              fn = getattr(fn, 'im_func', fn)
              closure = getattr(fn, '__closure__', None)
              fn = closure[0].cell_contents if closure is not None else None
          return None