     @runner.emit 'oojspec:examples:add', @dsl._examplesCount_
     @removeDsl() unless @bare
     @bare or= @binding.bare
+
+    d.processDsl @runner, @binding, @bare for d in @dsl._examples_ when d instanceof Description
+
+  detectBindingError: ->
+    try
+      @binding = if @block.prototype then new @block else @block
+      if @binding and not (@bare = @block.bare)
+        for reserved in RESERVED when @binding[reserved]
+          throw new Error("'#{reserved}' method is reserved for oojspec usage only")
+    catch e
+      e.name = "syntax error"
+      @bindingError = e
+
+  injectDsl: -> @binding[p] = v for p, v of @dsl; return
+
+  removeDsl: -> delete @binding[p] for p in RESERVED_FOR_DESCRIPTION_DSL; return
+
+  run: (@assertions, @onFinish, @beforeBlocks = [], @afterBlocks = [])->
+    @runner.emit 'context:start', name: @description
+    if @bindingError
+      @runner.emit 'test:error', name: @description, error: @bindingError
+      @onDescriptionFinished @bindingError
+    else
+      @doRun()
+
+  doRun: -> @runAround @beforeBlocks, @afterBlocks, @onDescriptionFinished, @processDescriptionBlock
+
+  onDescriptionFinished: (error)=>
+    if error and not error.handled
+      error.handled = true
+      @runner.emit 'test:error', { name: 'Error running describe statements', error }
+    @runner.emit 'context:end'
+    @onFinish error
+
+  runAround: (befores, afters, onFinish, block)->
+    new AroundBlock(befores, afters, block).run @runner, @assertions, @binding, @bare, onFinish
+
+  processDescriptionBlock: (onFinish)=>
     @runAround @dsl._beforeAllBlocks_, @dsl._afterAllBlocks_, onFinish, (@onExamplesFinished)=>
       @runNextStep()
-
-  injectDsl: -> @binding[p] = v for p, v of @dsl; return
-
-  removeDsl: -> delete @binding[p] for p in RESERVED_FOR_DESCRIPTION_DSL; return
 
   runNextStep: =>
     (@onExamplesFinished(); return) unless @dsl._examples_.length

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

  runSpecs: ->
    @reporter = buster.reporters.html.create detectCssPath: false
    @reporter.listen @runner
    d.processDsl @runner for d in @descriptions
    @runner.emit 'suite:start', name: "Specs"
    @runNextDescription()

  runNextDescription: =>
    (@runner.emit 'suite:end', @stats; return) unless @descriptions.length
    @descriptions.shift().run @assertions, @runNextDescription

  describe: (description, block)=>
    @stats.contexts++ # only root descriptions will be count
