code: def get_routing_attributes(obj, modify_doc=False, keys=None):
      
      if keys is None:
          keys = dir(obj)
  
      for val, method_str in _find_routeable_attributes(obj, keys):
  
          path, *doc = val.__doc__.split(maxsplit=1) or ('', '')
  
          if not path:
              continue
  
          if modify_doc:
              val.__doc__ = ''.join(doc)
  
          method = HTTPMethod[method_str]
  
          yield method, path, val
docs: Loops through the provided object (using the dir() function) and
      finds any callables which match the name signature (e.g.
      get_foo()) AND has a docstring beginning with a path-like char
      string.
      This does process things in alphabetical order (rather than than
      the unpredictable __dict__ attribute) so take this into
      consideration if certain routes should be checked before others.
      Unfortunately, this is a problem because the 'all' method will
      always come before others, so there is no capturing one type
      followed by a catch-all 'all'. Until a solution is found, just
      make a router by hand.