docs: def find_dependencies(module, depth=0, deps=None, seen=None, max_depth=99):
      """
      Finds all objects a module depends on up to a certain depth truncating cyclic dependencies at the first instance
  
      :param module: The module to find dependencies of
      :type module: types.ModuleType
      :param depth: The current depth of the dependency resolution from module
      :type depth: int
      :param deps: The dependencies we've encountered organized by depth.
      :type deps: dict
      :param seen: The modules we've already resolved dependencies for
      :type seen: set
      :param max_depth: The maximum depth to resolve dependencies
      :type max_depth: int
  
      :rtype: dict
      :returns: A dictionary of lists containing tuples describing dependencies. (module, name, object) Where module is a reference to the module, name is the name of the object according to that module's scope, and object is the object itself in that module.
      """
      deps = {} if not deps else deps
      seen = set([]) if not seen else seen
      if not isinstance(module, types.ModuleType) or module in seen or depth > max_depth:
          return None
      for name, object in module.__dict__.items():
          seen.add(module)
          if not hasattr(object, '__name__'):
              continue
          if depth in deps:
              deps[depth].append((module, name, object))
          else:
              deps[depth] = [(module, name, object)]
  
          find_dependencies(inspect.getmodule(object), depth=depth+1, deps=deps, seen=seen)
  
      return deps