         else form
       )
 
+    return this
+
   nextForm: ->
     requirement = @nextRequirement()
     return  unless requirement?
+    
     provider = @nextProvider requirement
+    return  unless provider?
+
     @showForm provider
 
-  nextRequirement: ->
-    @collector.nextRequirement()
+    return provider
+
+  nextRequirement: -> @collector.nextRequirement()
 
   nextProvider: (key, from) ->
     providers = @providers[key]
     providers.i = from ? providers.i ? 0
     provider = providers[providers.i++]
-    return provider  if provider
+    return provider  if provider?
+
     try @nextProvider key, 0
 
   addForm: (formName, form, provides = []) ->


    return this

  provideData: (form, provides) ->
    for field in provides
      @providers[field] ?= []
      @providers[field].push(
        if 'string' is typeof form


  constructor: (options = {}, data) ->
    super options, data

    @collector = new Collector
    @collector.on 'Pending', @bound 'nextForm'
    @forwardEvent @collector, 'DataCollected'

    @forms      = {}
    @providers  = {}

  enter: -> @ready @bound 'nextForm'

  requireData: (fields, mode = 'all') ->
    gate =
      if fields.isGate
      then fields
      else @[mode] fields...

    @collector.addRequirement gate

