/**
  * @access   private
  */
 function _sort(&$graph)
 {
     // Mark every node as not visited
     $nodes =& $graph->getNodes();
     $nodeKeys = array_keys($nodes);
     $refGenerator = array();
     foreach ($nodeKeys as $key) {
         $refGenerator[] = false;
         $nodes[$key]->setMetadata('topological-sort-visited', $refGenerator[sizeof($refGenerator) - 1]);
     }
     // Iteratively peel off leaf nodes
     $topologicalLevel = 0;
     do {
         // Find out which nodes are leafs (excluding visited nodes)
         $leafNodes = array();
         foreach ($nodeKeys as $key) {
             if (!$nodes[$key]->getMetadata('topological-sort-visited') && Structures_Graph_Manipulator_TopologicalSorter::_nonVisitedInDegree($nodes[$key]) == 0) {
                 $leafNodes[] =& $nodes[$key];
             }
         }
         // Mark leafs as visited
         $refGenerator[] = $topologicalLevel;
         for ($i = sizeof($leafNodes) - 1; $i >= 0; $i--) {
             $visited =& $leafNodes[$i]->getMetadata('topological-sort-visited');
             $visited = true;
             $leafNodes[$i]->setMetadata('topological-sort-visited', $visited);
             $leafNodes[$i]->setMetadata('topological-sort-level', $refGenerator[sizeof($refGenerator) - 1]);
         }
         $topologicalLevel++;
     } while (sizeof($leafNodes) > 0);
     // Cleanup visited marks
     foreach ($nodeKeys as $key) {
         $nodes[$key]->unsetMetadata('topological-sort-visited');
     }
 }