class ClasspathGraphVisitor {
        MetadataGraph graph;

        ClasspathContainer cpc;

        List<MetadataGraphVertex> visited;

        // -----------------------------------------------------------------------
        protected ClasspathGraphVisitor(MetadataGraph cleanGraph, ClasspathContainer cpc) {
            this.cpc = cpc;
            this.graph = cleanGraph;

            visited = new ArrayList<>(cleanGraph.getVertices().size());
        }

        // -----------------------------------------------------------------------
        protected void visit(MetadataGraphVertex node) // , String version, String artifactUri )
                {<FILL_FUNCTION_BODY>}
        // -----------------------------------------------------------------------
        // -----------------------------------------------------------------------
    }

            ArtifactMetadata md = node.getMd();
            if (visited.contains(node)) {
                return;
            }

            cpc.add(md);
            //
            //            TreeSet<MetadataGraphEdge> deps = new TreeSet<MetadataGraphEdge>(
            //                        new Comparator<MetadataGraphEdge>()
            //                        {
            //                            public int compare( MetadataGraphEdge e1
            //                                              , MetadataGraphEdge e2
            //                                              )
            //                            {
            //                                if( e1.getDepth() == e2.getDepth() )
            //                                {
            //                                    if( e2.getPomOrder() == e1.getPomOrder() )
            //                                        return
            // e1.getTarget().toString().compareTo(e2.getTarget().toString() );
            //
            //                                    return e2.getPomOrder() - e1.getPomOrder();
            //                                }
            //
            //                                return e2.getDepth() - e1.getDepth();
            //                            }
            //                        }
            //                    );

            List<MetadataGraphEdge> exits = graph.getExcidentEdges(node);

            if (exits != null && exits.size() > 0) {
                MetadataGraphEdge[] sortedExits = exits.toArray(new MetadataGraphEdge[0]);
                Arrays.sort(sortedExits, (e1, e2) -> {
                    if (e1.getDepth() == e2.getDepth()) {
                        if (e2.getPomOrder() == e1.getPomOrder()) {
                            return e1.getTarget()
                                    .toString()
                                    .compareTo(e2.getTarget().toString());
                        }
                        return e2.getPomOrder() - e1.getPomOrder();
                    }
                    return e2.getDepth() - e1.getDepth();
                });

                for (MetadataGraphEdge e : sortedExits) {
                    MetadataGraphVertex targetNode = e.getTarget();
                    targetNode.getMd().setArtifactScope(e.getScope());
                    targetNode.getMd().setWhy(e.getSource().getMd().toString());
                    visit(targetNode);
                }
            }
        
<no_super_class>