class DirectedAcyclicGraph extends SimpleDirectedGraph<V, E> implements Iterable<V> {

    @Override
    public E addEdge(V sourceVertex, V targetVertex)
    {
        assertVertexExist(sourceVertex);
        assertVertexExist(targetVertex);

        E result;
        try {
            updateDag(sourceVertex, targetVertex);
            result = super.addEdge(sourceVertex, targetVertex);
        } catch (CycleFoundException e) {
            throw new IllegalArgumentException(EDGE_WOULD_INDUCE_A_CYCLE);
        }
        return result;
    }

    public  DirectedAcyclicGraph(Class<? extends E> edgeClass);
    public  DirectedAcyclicGraph(Class<? extends E> edgeClass, boolean weighted);
    public  DirectedAcyclicGraph(EdgeFactory<V, E> ef);
    public  DirectedAcyclicGraph(EdgeFactory<V, E> ef, boolean weighted);
    protected  DirectedAcyclicGraph(
        EdgeFactory<V, E> ef, VisitedStrategyFactory visitedStrategyFactory,
        TopoOrderMap<V> topoOrderMap, boolean weighted);

}