exports.Actor = class extends require('../actor').Actor

  @build: (freakset, scope, errFn, opts, fn) ->
    [freakset, scope, errFn, opts, fn] = @::ensureArgs(arguments...)

    if typeof opts == "function"
      fn = opts
      opts = undefined

    innerFreakset = freakset.klass.build( store: freakset.store, outerFreakset: freakset )
    freakset.modifyStack freakset, { type: "rescue", scope: scope, fn: fn, errFn: errFn, innerFreakset: innerFreakset }, opts
    freakset.innerFreaksets.push(innerFreakset)
    fn(innerFreakset)
    return innerFreakset

  @run: (freakset, actor) ->
    try
      freakset.buildAndRunFreakset(stack: actor.innerFreakset.stack, store: freakset.store, outerFreakset: freakset)
    catch e
      # TODO: We might want to throw a Freakset exception if a errFn is not defined
      actor.errFn(e, freakset, actor.innerFreakset)
      freakset.commit()
