docs: def build_resource_graph(resource, dependency_graph=None):
      """
      Traverses the graph of resources that is reachable from the given
      resource.
  
      If a resource dependency graph is given, links to other resources are
      only followed if the dependency graph has an edge connecting the two
      corresponding resource classes; otherwise, a default graph is built
      which ignores all direct cyclic resource references.
  
      :resource: a :class:`everest.resources.MemberResource` instance.
      :returns: a :class:`ResourceGraph` instance representing the graph of
          resources reachable from the given resource.
      """
      def visit(rc, grph, dep_grph):
          mb_cls = type(rc)
          attr_map = get_resource_class_attributes(mb_cls)
          for attr_name, attr in iteritems_(attr_map):
              if is_resource_class_terminal_attribute(mb_cls, attr_name):
                  continue
              # Only follow the resource attribute if the dependency graph
              # has an edge here.
              child_mb_cls = get_member_class(attr.attr_type)
              if not dep_grph.has_edge((mb_cls, child_mb_cls)):
                  continue
              child_rc = getattr(rc, attr_name)
              if is_resource_class_collection_attribute(mb_cls, attr_name):
                  for child_mb in child_rc:
                      if not grph.has_node(child_mb): # Ignore cyclic references.
                          grph.add_node(child_mb)
                          grph.add_edge((rc, child_mb))
                          visit(child_mb, grph, dep_grph)
              else: # Member.
                  if not grph.has_node(child_rc): # Ignore cyclic references.
                      grph.add_node(child_rc)
                      grph.add_edge((rc, child_rc))
                      visit(child_rc, grph, dep_grph)
      if  dependency_graph is None:
          dependency_graph = build_resource_dependency_graph(
                                              [get_member_class(resource)])
      graph = ResourceGraph()
      if provides_member_resource(resource):
          rcs = [resource]
      else:
          rcs = resource
      for rc in rcs:
          graph.add_node(rc)
          visit(rc, graph, dependency_graph)
      return graph