     control._done? result.error, results
     @emit 'done', result.error, results
     return results
+
+  # allows users to override how a context is built by changing this function.
+  # also, this defualt implementation accepts a base object (prototype) to use
+  # when creating a new context object, and a property descriptor
+  _buildContext: (options) ->
+    # if they specified a context to use, then use it
+    if options?.context? then options.context
+
+    # otherwise, build a new context.
+    # use their specified prototype or an empty object,
+    # and a property descriptor (if specified)
+    else Object.create options?.base ? {}, options?.props

      result.removed = @array.splice index, 1

      # let everyone know we removed it
      @emit 'remove', fn

    # and return the result whether it's empty or not
    return result

      @emit 'remove', array   # emit a remove event with the array

  # main function which begins the execution of the chain
  # options optionally configures `context`, `done`, and `_buildContext`
  run: (options, done) ->
    context = @_buildContext options               # build/use context
    done = options?.done ? done                    # look for `done`
    control = new Control @, @array, context, done # create controller
    @emit 'start', control:control, chain:this     # notify we're starting
