 
   getData: -> @collector.data
 
-  isSatisfied: -> 
-    @collector.gate.isSatisfied()
+  isSatisfied: -> @collector.gate.isSatisfied()
 
   collectData: (data) ->
     @collector.collectData data

        else form
      )

  nextForm: ->
    requirement = @nextRequirement()
    return  unless requirement?
    provider = @nextProvider requirement
    @showForm provider

  nextRequirement: ->
    @collector.nextRequirement()

  nextProvider: (key, from) ->
    providers = @providers[key]
    providers.i = from ? providers.i ? 0
    provider = providers[providers.i++]
    return provider  if provider
    try @nextProvider key, 0

  addForm: (formName, form, provides = []) ->

      else
        (key for own key of @fields when not (key of @children))

    nextNode: ->
      node = @ordered[@index]

      unless node? #cycle
        @index = 0

        return @nextNode() 

      if node.isGate #fork

        if node.isSatisfied() #skip
          @index++

          return @nextNode()

        else #propagate
          return node.nextNode()

      @index++ #continue

      return node

    addChild: (child) ->
      @children[child] = child

      return this

    removeChild: (child) ->
      delete @children[child]

      return this

    addField: (field) ->
