     nextStep = @dsl._examples_.shift()
     (@reportDeferred(nextStep.description); @runNextStep(); return) if nextStep.pending
     nextTick =
-      if nextStep instanceof Description then => nextStep
-        .run @runner, @assertions, @context, @runNextStep, @dsl._beforeBlocks_, @dsl._afterBlocks_
+      if nextStep instanceof Description then =>
+        nextStep.run @runner, @assertions, @binding, @bare, @runNextStep, \
+          @dsl._beforeBlocks_, @dsl._afterBlocks_
       else => # ExampleWithHooks
-        nextStep.run @runner, @assertions, @context, @onExampleFinished
+        nextStep.run @runner, @assertions, @binding, @bare, @onExampleFinished
     setTimeout nextTick, 0
 
   onExampleFinished: (error)=>

  describe:  (description, block)=>
    @_examples_.push new Description(description, block, @_beforeBlocks_, @_afterBlocks_)
  example:   (description, block)=>
    @_examples_.push new ExampleWithHooks(description, @_beforeBlocks_, @_afterBlocks_, block)
  pending:   (description)=> @_examples_.push {description, pending: true}

class AroundBlock
  constructor: (@beforeBlocks, @afterBlocks, @block)->

  run: (@runner, @assertions, @context, @onFinish)->
    @runGroup @beforeBlocks, ((e)=> @onBeforeError e), (wasSuccessful)=>
      if wasSuccessful
        @runMainBlock @block, (error)=>
          @registerError error
          @runAfterGroup()
      else @runAfterGroup()


  nextTick: =>
    (@onFinish(@wasSuccessful); return) unless @nextIndex < @blocks.length
    block = @blocks[@nextIndex++]
    new Example(block).run @assertions, @binding, @bare, (error)=>
      (@wasSuccessful = false; @onError error) if error
      setTimeout @nextTick, 0

class Example
  TICK = 10 # ms
  constructor: (@exampleBlock)-> @describeDsl = {}

  run: (@assertions, @binding, @bare, @onFinish)->
    @dsl = new ExampleDsl(@assertions.assert, @assertions.expect, @assertions.fail, \
                          @assertions.refute)
    if @binding and not @bare
      for m in RESERVED_FOR_DESCRIPTION_DSL
        @describeDsl[m] = b if b = @binding[m]
        delete @binding[m]
      (@binding[m] = b if b = @dsl[m]) for m in RESERVED_FOR_EXAMPLE_DSL
    @tryBlock @exampleBlock, ->
      if @binding and not @bare
        delete @binding.runs
        delete @binding.waitsFor
      (@finish(); return) unless (@steps = @dsl._asyncQueue_).length
      @runNextAsyncStep()

  tryBlock: (block, onSuccess)->
    try
      binding = @binding or @dsl
      onSuccess.call this, block.call(binding, @dsl)
    catch error
      error = new Error(error) if typeof error is 'string'
      error.message = "'#{error.message}' in '#{block.description}'" if block?.description
      @finish error

  runNextAsyncStep: ->
    (@finish(); return) unless @steps.length
    step = @steps.shift()
    if step instanceof Function
      @tryBlock step, @runNextAsyncStep
