   create_vertex: (opts) ->
     opts ||= {}
     id = opts.id || @next_vertex_id()
-    new @vertex_class(@, opts.value)
+    new @constructor.Vertex(@, opts.value)
 
   add_path: (array, options={}) ->
     digraph = @


class Digraph

  constructor: (@vertex_class, @arc_class) ->
    @vertex_id_counter = 0
    @arc_id_counter = 0
    @source = @create_vertex()

  track: (state, val) ->
    new MatchTracker(@, state, val)

#class State
  #constructor: (@digraph, @value) ->
    #@arc_class = @digraph.arc_class
    #@id = @digraph.next_vertex_id()
    #@_arcs = []

  #connect: (val, next_vertex) ->
    #arc = new @arc_class(@, @digraph.next_arc_id(), val, next_vertex)
    #@_arcs.push(arc)
    #arc

  #arcs: ->
    #@_arcs

  #find_arc: (val) ->
    #for arc in @_arcs
      #return arc if arc.value == val


#class Arc
  #constructor: (@vertex, @id, @value, @next_vertex) ->
    #@next_vertex ||= null

  #test: (value) ->
    #@value == value || @value == true

  #format_att: ->
    #"#{@vertex.id} #{@next_vertex.id} #{@formatValue(@value)}"

  #dotString: ->
    #edge = Graphviz.dotEdge(@vertex.id, @next_vertex.id)
    #attrs = Graphviz.dotAttrs({label: "#{@dot_label()}"})
    #output = "#{edge}#{attrs};\n"
    #if @next_vertex.value
      #node = Graphviz.dotNode(@next_vertex.id, {shape: "doublecircle"})
      #output += node

    #output

  #dot_label: ->
    #@formatValue(@value)

  #formatValue: (value) ->
    #if typeof(value) == "function"
      #"<lambda>"
    #else if value == true
      #return "<epsilon>"
    #else
      #value



