docs: def collect_doc(module, base_class=None, prefix="", flag_exclude_prefix=False):
      """
      Collects class names and docstrings in module for classes starting with prefix
  
      Arguments:
          module -- Python module
          prefix -- argument for str.startswith(); if not passed, does not filter
          base_class -- filters only descendants of this class
          flag_exclude_prefix -- whether or not to exclude prefix from class name in result
  
      Returns: [(classname0, signature, docstring0), ...]
      """
  
      ret = []
      for attrname in module.__all__:
          if prefix and not attrname.startswith(prefix):
              continue
  
          attr = module.__getattribute__(attrname)
  
          if base_class is not None and not issubclass(attr, base_class):
              continue
  
          spec = inspect.signature(attr)
  
          ret.append((attrname if not flag_exclude_prefix else attrname[len(prefix):], spec, attr.__doc__))
  
      return ret