docs: def build_resource_dependency_graph(resource_classes,
                                      include_backrefs=False):
      """
      Builds a graph of dependencies among the given resource classes.
  
      The dependency graph is a directed graph with member resource classes as
      nodes. An edge between two nodes represents a member or collection
      attribute.
  
      :param resource_classes: resource classes to determine interdependencies
        of.
      :type resource_classes: sequence of registered resources.
      :param bool include_backrefs: flag indicating if dependencies
        introduced by back-references (e.g., a child resource referencing its
        parent) should be included in the dependency graph.
      """
      def visit(mb_cls, grph, path, incl_backrefs):
          for attr_name in get_resource_class_attribute_names(mb_cls):
              if is_resource_class_terminal_attribute(mb_cls, attr_name):
                  continue
              child_descr = getattr(mb_cls, attr_name)
              child_mb_cls = get_member_class(child_descr.attr_type)
              # We do not follow cyclic references back to a resource class
              # that is last in the path.
              if len(path) > 0 and child_mb_cls is path[-1] \
                 and not incl_backrefs:
                  continue
              if not grph.has_node(child_mb_cls):
                  grph.add_node(child_mb_cls)
                  path.append(mb_cls)
                  visit(child_mb_cls, grph, path, incl_backrefs)
                  path.pop()
              if not grph.has_edge((mb_cls, child_mb_cls)):
                  grph.add_edge((mb_cls, child_mb_cls))
      dep_grph = digraph()
      for resource_class in resource_classes:
          mb_cls = get_member_class(resource_class)
          if not dep_grph.has_node(mb_cls):
              dep_grph.add_node(mb_cls)
              visit(mb_cls, dep_grph, [], include_backrefs)
      return dep_grph