docs: def get_interesting_members(base_class, cls):
      """Returns a list of methods that can be routed to"""
  
      base_members = dir(base_class)
      predicate = inspect.ismethod if _py2 else inspect.isfunction
      all_members = inspect.getmembers(cls, predicate=predicate)
      return [member for member in all_members
              if not member[0] in base_members
              and ((hasattr(member[1], "__self__") and not member[1].__self__ in inspect.getmro(cls)) if _py2 else True)
              and not member[0].startswith("_")
              and not member[0].startswith("before_")
              and not member[0].startswith("after_")]