/** Recursive template method for a generic DFS traversal.
    * @param v Start vertex of the traversal
    * @return result of the traversal
    */
  protected Object dfsTraversal(Vertex v) {
    initResult();
    if (!isDone())
      startVisit(v);
    if (!isDone()) {
      visit(v);
      for (Iterator inEdges = G.incidentEdges(v); inEdges.hasNext(); ) {
	Edge nextEdge = (Edge) inEdges.next();
	if (!isVisited(nextEdge)) {
	  // found an unexplored edge, explore it
	  visit(nextEdge);
	  Vertex w = G.opposite(v, nextEdge);
	  if (!isVisited(w)) { 
	    // w is unexplored, this is a discovery edge
	    traverseDiscovery(nextEdge, v);
	    if (isDone())
	      break;
	    visitResult = dfsTraversal(w);
	    if (isDone())
	      break;
	  }
	  else { 
	    // w is explored, this is a back edge
	    traverseBack(nextEdge, v);
	    if (isDone())
	      break;
	  }
	}
      }
    }
    if(!isDone())
      finishVisit(v);
    return result();
  }