       @block = @description
       @description = @block.description or @block.name
 
-  run: (@runner, @assertions, @binding, @bare, @onFinish, @beforeBlocks = [], @afterBlocks = [])->
-    @runner.emit 'context:start', name: @description
+  processDsl: (@runner, @binding, @bare)->
     @dsl = new DescribeDsl
-    @doRun() unless (@block.runSpecs or @block.prototype?.runSpecs) and @throwOnInvalidBinding()
-
-  doRun: -> @runAround @beforeBlocks, @afterBlocks, @onDescriptionFinished, @processDescriptionBlock
-
-  throwOnInvalidBinding: ->
-    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"
-      @runner.emit 'test:error', name: @description, error: e
-      @onDescriptionFinished(e)
-      return true
-    false
-
-  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)=>
+    (@block.runSpecs or @block.prototype?.runSpecs) and @detectBindingError()
+
     @binding or= {}
     @injectDsl() unless @bare
     if @block.runSpecs or @block.prototype?.runSpecs

    @runner.emit 'oojspec:examples:add', @dsl._examplesCount_
    @removeDsl() unless @bare
    @bare or= @binding.bare
    @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

  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
