//
// Copyright (c) 2008, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 27 Nov 08 Brian Frank Creation
//
using web
**
** PipelineMod routes seriallly through a list of sub-WebMods.
**
** See [pod doc]`pod-doc#pipeline`
**
const class PipelineMod : WebMod
{
**
** Constructor with it-block.
**
new make(|This|? f)
{
f?.call(this)
if (before.isEmpty && steps.isEmpty && after.isEmpty)
throw ArgErr("PipelineMod has not steps configured")
}
**
** Steps to run serially regardless of 'WebRes.isDone'
** before every request.
**
const WebMod[] before := WebMod[,]
**
** Steps to run serially until 'WebRes.isDone' returns true.
**
const WebMod[] steps := WebMod[,]
**
** Steps to run serially regardless of 'WebRes.isDone'
** after every request.
**
const WebMod[] after := WebMod[,]
**
** Call 'onStart' on sub-mods.
**
override Void onStart()
{
before.each |mod| { mod.onStart }
steps.each |mod| { mod.onStart }
after.each |mod| { mod.onStart }
}
**
** Call 'onStop' on sub-mods.
**
override Void onStop()
{
before.each |mod| { mod.onStop}
steps.each |mod| { mod.onStop }
after.each |mod| { mod.onStop }
}
**
** Service the pipeline.
**
override Void onService()
{
before.each |mod| { req.mod = mod; mod.onService }
steps.each |mod| { req.mod = mod; if (!res.isDone) mod.onService }
after.each |mod| { req.mod = mod; mod.onService }
}
}