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 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