     @onFinish error
 
   runAround: (befores, afters, onFinish, block)->
-    new AroundBlock(befores, afters, block).run @runner, @assertions, @context, onFinish
+    new AroundBlock(befores, afters, block).run @runner, @assertions, @binding, @bare, onFinish
 
   processDescriptionBlock: (onFinish)=>
-    context = @context or @dsl
-    @block.call context, context
+    if @block.runSpecs or @block.prototype?.runSpecs
+      @binding.runSpecs @dsl
+    else
+      binding = @binding or @dsl
+      @block.call binding, @dsl
     @runAround @dsl._beforeAllBlocks_, @dsl._afterAllBlocks_, onFinish, (@onExamplesFinished)=>
       @runNextStep()
 

      onFinish error

  runGroup: (group, onError, onFinish)->
    new ExampleGroupWithoutHooks(@assertions, @context, group, onFinish, onError).run()

  onBeforeError: (error)-> error.source = "before hook"; @registerError error
  onAfterError:  (error)-> error.source = "after hook";  @registerError error

  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
