RequestManager

Package: MachII.framework
Manages request functionality for the framework.

<!--- License: Copyright 2008 GreatBizTools, LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. Copyright: GreatBizTools, LLC Author: Peter J. Farrell (peter@mach-ii.com) $Id: RequestManager.cfc 1117 2008-10-22 18:55:18Z peterfarrell $ Created version: 1.5.0 Updated version: 1.5.0 Notes: --->

Method Summary
public RequestManager init(AppManager appManager)

Initializes the manager.

public void addOnRequestEndCallback(any callback, string method, string moduleName)

Adds an on request end callback to be run at the end of processing an event.

public void addPostRedirectCallback(any callback, string method, string moduleName)

Adds a post-redirect callback to be run after a redirect occurs.

public void addPreRedirectCallback(any callback, string method, string moduleName)

Adds a pre-redirect callback to be run before a redirect occurs.

public string buildUrl(string moduleName, string eventName, [any urlParameters=""], [string urlBase="#getDefaultUrlBase()#"])

Builds a framework specific url.

public void cleanupCallbacks(string moduleName)

Cleans up callbacks by module name.

public void configure()

Configures nothing.

private AppManager getAppManager()
private string getDefaultUrlBase()
private string getEventParameter()
private Log getLog()

Gets the log.

private numeric getMaxEvents()
private string getModuleDelimiter()
public array getOnRequestEndCallbacks()
private string getPairDelimiter()
private string getParameterPrecedence()
private string getParseSes()
public array getPostRedirectCallbacks()
public array getPreRedirectCallbacks()
private PropertyManager getPropertyManager()
private string getQueryStringDelimiter()
public RequestHandler getRequestHandler()

Returns a new or cached instance of a RequestHandler.

public any getRequestRedirectPersist()
private string getSeriesDelimiter()
private Utils getUtils()
private struct parseBuildUrlParameters(any urlParameters)

Parses the build url parameters into a useable form.

public struct parseSesParameters(string pathInfo)

Parse SES parameters.

public struct readPersistEventData(struct eventArgs)

Gets a persisted event by id if found in event args.

public string savePersistEventData(struct eventArgs)

Saves persisted event data and returns the persistId.

private void setAppManager(AppManager appManager)
private void setDefaultUrlBase(string defaultUrlBase)
private void setEventParameter(string eventParameter)
private void setLog(LogFactory logFactory)

Uses the log factory to create a log.

private void setMaxEvents(numeric maxEvents)
private void setModuleDelimiter(string moduleDelimiter)
private void setPairDelimiter(string pairDelimiter)
private void setParameterPrecedence(string parameterPrecedence)
private void setParseSes(string parseSes)
private void setQueryStringDelimiter(string queryStringDelimiter)
public void setRequestRedirectPersist(any requestRedirectPersist)
private void setSeriesDelimiter(string seriesDelimiter)
Method Detail
addOnRequestEndCallback

public void addOnRequestEndCallback( any callback, string method, string moduleName )

Adds an on request end callback to be run at the end of processing an event.

Parameters:
any callback
string method
string moduleName

Code:

	<cffunction name="addOnRequestEndCallback" access="public" returntype="void" output="false"
		hint="Adds an on request end callback to be run at the end of processing an event.">
		<cfargument name="callback" type="any" required="true" />
		<cfargument name="method" type="string" required="true" />
		<cfargument name="moduleName" type="string" required="true" />
		<cfset ArrayAppend(variables.onRequestEndCallbacks, arguments) />
	</cffunction> 

addPostRedirectCallback

public void addPostRedirectCallback( any callback, string method, string moduleName )

Adds a post-redirect callback to be run after a redirect occurs.

Parameters:
any callback
string method
string moduleName

Code:

	<cffunction name="addPostRedirectCallback" access="public" returntype="void" output="false"
		hint="Adds a post-redirect callback to be run after a redirect occurs.">
		<cfargument name="callback" type="any" required="true" />
		<cfargument name="method" type="string" required="true" />
		<cfargument name="moduleName" type="string" required="true" />
		<cfset ArrayAppend(variables.postRedirectCallbacks, arguments) />
	</cffunction> 

addPreRedirectCallback

public void addPreRedirectCallback( any callback, string method, string moduleName )

Adds a pre-redirect callback to be run before a redirect occurs.

Parameters:
any callback
string method
string moduleName

Code:

	<cffunction name="addPreRedirectCallback" access="public" returntype="void" output="false"
		hint="Adds a pre-redirect callback to be run before a redirect occurs.">
		<cfargument name="callback" type="any" required="true" />
		<cfargument name="method" type="string" required="true" />
		<cfargument name="moduleName" type="string" required="true" />
		<cfset ArrayAppend(variables.preRedirectCallbacks, arguments) />
	</cffunction> 

buildUrl

public string buildUrl( string moduleName, string eventName, [any urlParameters=""], [string urlBase="#getDefaultUrlBase()#"] )

Builds a framework specific url.

Parameters:
string moduleName
string eventName
[any urlParameters=""]
[string urlBase="#getDefaultUrlBase()#"]

Code:

	<cffunction name="buildUrl" access="public" returntype="string" output="false"
		hint="Builds a framework specific url.">
		<cfargument name="moduleName" type="string" required="true"
			hint="Name of the module to build the url with." />
		<cfargument name="eventName" type="string" required="true"
			hint="Name of the event to build the url with." />
		<cfargument name="urlParameters" type="any" required="false" default=""
			hint="Name/value pairs (urlArg1=value1|urlArg2=value2) to build the url with or a struct of data." />
		<cfargument name="urlBase" type="string" required="false" default="#getDefaultUrlBase()#"
			hint="Base of the url. Defaults to the value of the urlBase property." />
		
		<cfset var builtUrl = "" />
		<cfset var queryString = "" />
		<cfset var params = parseBuildUrlParameters(arguments.urlParameters) />
		<cfset var value = "" />
		<cfset var i = "" />

		
		<cfif Len(arguments.moduleName) AND Len(arguments.eventName)>
			<cfset queryString = queryString & getEventParameter() & getPairDelimiter() & arguments.moduleName & getModuleDelimiter() & arguments.eventName />
		<cfelseif NOT Len(arguments.moduleName) AND Len(arguments.eventName)>
			<cfset queryString = queryString & getEventParameter() & getPairDelimiter()& arguments.eventName />
		</cfif>
		
		
		<cfloop collection="#params#" item="i">
			<cfif IsSimpleValue(params[i])>
				
				<cfif getParseSes()>
					<cfset params[i] = Replace(params[i], ";", "U_03B", "all") />
				</cfif>
				<cfif NOT Len(params[i]) AND getSeriesDelimiter() EQ getPairDelimiter() AND getParseSes()>
					<cfset params[i] = "_-_NULL_-_" />
				</cfif>
				<cfset queryString = queryString & getSeriesDelimiter() & i & getPairDelimiter() & URLEncodedFormat(params[i]) />
			</cfif>
		</cfloop>
		
		
		<cfif Len(queryString)>
			<cfset builtUrl = arguments.urlBase & getQueryStringDelimiter() & queryString />
			<cfif getSeriesDelimiter() NEQ "&">
				<cfset builtUrl = builtUrl & getSeriesDelimiter() />
			</cfif>
		<cfelse>
			<cfset builtUrl = arguments.urlBase />
		</cfif>
		
		<cfreturn builtUrl />
	</cffunction> 

cleanupCallbacks

public void cleanupCallbacks( string moduleName )

Cleans up callbacks by module name.

Parameters:
string moduleName

Code:

	<cffunction name="cleanupCallbacks" access="public" returntype="void" output="false"
		hint="Cleans up callbacks by module name.">
		<cfargument name="moduleName" type="string" required="true" />
		
		<cfset var i = "" />
		<cfset var j = 0 />
		
		<cfloop list="#variables.callbackGroupNames#" index="i">
			<cfloop from="1" to="#ArrayLen(variables[i])#" index="j">
				<cfif variables[i][j].moduleName EQ arguments.moduleName>
					<cfset ArrayDeleteAt(variables[i], j) />
				</cfif>
			</cfloop>
		</cfloop>
	</cffunction> 

configure

public void configure( )

Configures nothing.

Parameters:

Code:

	<cffunction name="configure" access="public" returntype="void" output="false"
		hint="Configures nothing.">
		
	</cffunction> 

getAppManager

private AppManager getAppManager( )

Parameters:

Code:

	<cffunction name="getAppManager" access="private" returntype="MachII.framework.AppManager" output="false">
		<cfreturn variables.appManager />
	</cffunction> 

getDefaultUrlBase

private string getDefaultUrlBase( )

Parameters:

Code:

	<cffunction name="getDefaultUrlBase" access="private" returntype="string" output="false">
		<cfreturn variables.defaultUrlBase />
	</cffunction> 

getEventParameter

private string getEventParameter( )

Parameters:

Code:

	<cffunction name="getEventParameter" access="private" returntype="string" output="false">
		<cfreturn variables.eventParameter />
	</cffunction> 

getLog

private Log getLog( )

Gets the log.

Parameters:

Code:

	<cffunction name="getLog" access="private" returntype="MachII.logging.Log" output="false"
		hint="Gets the log.">
		<cfreturn variables.log />
	</cffunction> 

getMaxEvents

private numeric getMaxEvents( )

Parameters:

Code:

	<cffunction name="getMaxEvents" access="private" returntype="numeric" output="false">
		<cfreturn variables.maxEvents />
	</cffunction> 

getModuleDelimiter

private string getModuleDelimiter( )

Parameters:

Code:

	<cffunction name="getModuleDelimiter" access="private" returntype="string" output="false">
		<cfreturn variables.moduleDelimiter />
	</cffunction> 

getOnRequestEndCallbacks

public array getOnRequestEndCallbacks( )

Parameters:

Code:

	<cffunction name="getOnRequestEndCallbacks" access="public" returntype="array" output="false"
		hints="Gets the on request end callbacks.">
		<cfreturn variables.onRequestEndCallbacks />
	</cffunction> 

getPairDelimiter

private string getPairDelimiter( )

Parameters:

Code:

	<cffunction name="getPairDelimiter" access="private" returntype="string" output="false">
		<cfreturn variables.pairDelimiter />
	</cffunction> 

getParameterPrecedence

private string getParameterPrecedence( )

Parameters:

Code:

	<cffunction name="getParameterPrecedence" access="private" returntype="string" output="false">
		<cfreturn variables.parameterPrecedence />
	</cffunction> 

getParseSes

private string getParseSes( )

Parameters:

Code:

	<cffunction name="getParseSes" access="private" returntype="string" output="false">
		<cfreturn variables.parseSes />
	</cffunction> 

getPostRedirectCallbacks

public array getPostRedirectCallbacks( )

Parameters:

Code:

	<cffunction name="getPostRedirectCallbacks" access="public" returntype="array" output="false"
		hints="Gets the post-redirect callbacks.">
		<cfreturn variables.postRedirectCallbacks />
	</cffunction> 

getPreRedirectCallbacks

public array getPreRedirectCallbacks( )

Parameters:

Code:

	<cffunction name="getPreRedirectCallbacks" access="public" returntype="array" output="false"
		hints="Gets the pre-redirect callbacks.">
		<cfreturn variables.preRedirectCallbacks />
	</cffunction> 

getPropertyManager

private PropertyManager getPropertyManager( )

Parameters:

Code:

	<cffunction name="getPropertyManager" access="private" returntype="MachII.framework.PropertyManager" output="false">
		<cfreturn getAppManager().getPropertyManager() />
	</cffunction> 

getQueryStringDelimiter

private string getQueryStringDelimiter( )

Parameters:

Code:

	<cffunction name="getQueryStringDelimiter" access="private" returntype="string" output="false">
		<cfreturn variables.queryStringDelimiter />
	</cffunction> 

getRequestHandler

public RequestHandler getRequestHandler( )

Returns a new or cached instance of a RequestHandler.

Parameters:

Code:

	<cffunction name="getRequestHandler" access="public" returntype="MachII.framework.RequestHandler" output="false"
		hint="Returns a new or cached instance of a RequestHandler.">
		
		<cfset var appKey = getAppManager().getAppKey() />
		
		<cfif NOT StructKeyExists(request, "_MachIIRequestHandler_" & appKey)>
			<cfset request["_MachIIRequestHandler_" & appKey] = 
					CreateObject("component", "MachII.framework.RequestHandler").init(getAppManager(), getEventParameter(), getParameterPrecedence(), getModuleDelimiter(), getMaxEvents(), getOnRequestEndCallbacks()) />
		</cfif>
		
		<cfreturn request["_MachIIRequestHandler_" & appKey]  />
	</cffunction> 

getRequestRedirectPersist

public any getRequestRedirectPersist( )

Parameters:

Code:

	<cffunction name="getRequestRedirectPersist" access="public" returntype="any" output="false">
		<cfreturn variables.requestRedirectPersist />
	</cffunction> 

getSeriesDelimiter

private string getSeriesDelimiter( )

Parameters:

Code:

	<cffunction name="getSeriesDelimiter" access="private" returntype="string" output="false">
		<cfreturn variables.seriesDelimiter />
	</cffunction> 

getUtils

private Utils getUtils( )

Parameters:

Code:

	<cffunction name="getUtils" access="private" returntype="MachII.util.Utils" output="false">
		<cfreturn getAppManager().getUtils() />
	</cffunction> 

init

public RequestManager init( AppManager appManager )

Initializes the manager.

Parameters:
AppManager appManager

Code:

	<cffunction name="init" access="public" returntype="RequestManager" output="false"
		hint="Initializes the manager.">
		<cfargument name="appManager" type="MachII.framework.AppManager" required="true"
			hint="Sets the base AppManager." />

		<cfset var urlDelimiters = "" />	
		
		<cfset setAppManager(arguments.appManager) />
		<cfset setLog(arguments.appManager.getLogFactory()) />

		
		<cfset urlDelimiters = getPropertyManager().getProperty("urlDelimiters") />
		<cfset setDefaultUrlBase(getPropertyManager().getProperty("urlBase")) />
		<cfset setEventParameter(getPropertyManager().getProperty("eventParameter")) />
		<cfset setParameterPrecedence(getPropertyManager().getProperty("parameterPrecedence")) />
		<cfset setParseSES(getPropertyManager().getProperty("urlParseSES")) />
		<cfset setModuleDelimiter(getPropertyManager().getProperty("moduleDelimiter")) />
		<cfset setMaxEvents(getPropertyManager().getProperty("maxEvents")) />
		
		
		<cfset setQueryStringDelimiter(ListGetAt(urlDelimiters, 1, "|")) />
		<cfset setSeriesDelimiter(ListGetAt(urlDelimiters, 2, "|")) />
		<cfset setPairDelimiter(ListGetAt(urlDelimiters, 3, "|")) />
		
		
		<cfset setRequestRedirectPersist(CreateObject("component", "MachII.framework.RequestRedirectPersist").init(arguments.appManager)) />

		<cfreturn this />
	</cffunction> 

parseBuildUrlParameters

private struct parseBuildUrlParameters( any urlParameters )

Parses the build url parameters into a useable form.

Parameters:
any urlParameters

Code:

	<cffunction name="parseBuildUrlParameters" access="private" returntype="struct" output="false"
		hint="Parses the build url parameters into a useable form.">
		<cfargument name="urlParameters" type="any" required="true"
			hint="Takes string of name/value pairs or a struct.">
		
		<cfset var params = StructNew() />
		<cfset var temp = "" />
		<cfset var i = "" />
		
		<cfif IsSimpleValue(arguments.urlParameters)>
			<cfloop list="#arguments.urlParameters#" index="i" delimiters="|">
				<cfif ListLen(i, "=") EQ 2>
					<cfset temp = ListLast(i, "=") />
				<cfelse>
					<cfset temp = "" />
				</cfif>
				<cfset params[ListFirst(i, "=")] = temp />
			</cfloop>
		<cfelseif IsStruct(arguments.urlParameters)>
			<cfset params = arguments.urlParameters />
		<cfelse>
			<cfthrow
				type="MachII.framework.urlParametersInvalidType"
				message="BuildUrl()'s urlParameters attribute takes a list or struct."/>
		</cfif>
		
		<cfreturn params />
	</cffunction> 

parseSesParameters

public struct parseSesParameters( string pathInfo )

Parse SES parameters.

Parameters:
string pathInfo

Code:

	<cffunction name="parseSesParameters" access="public" returntype="struct" output="false"
		hint="Parse SES parameters.">
		<cfargument name="pathInfo" type="string" required="true" />
		
		<cfset var names = "" />
		<cfset var value = "" />
		<cfset var params = StructNew() />
		<cfset var i = "" />

		
		<cfif getParseSes() AND Len(arguments.pathInfo) GT 1>
			
			
			<cfset arguments.pathInfo = Mid(arguments.pathInfo, 2, Len(arguments.pathInfo)) />
			
			<cfif Right(arguments.pathInfo, 1) IS getSeriesDelimiter()>
				<cfset arguments.pathInfo = Mid(arguments.pathInfo, 1, Len(arguments.pathInfo) - 1) />
			</cfif>
			
			
			<cfset arguments.pathInfo = Replace(arguments.pathInfo, "U_03B", ";", "all") />
			
			<cfif getSeriesDelimiter() EQ getPairDelimiter()>
			
				<cfset names = ListToArray(arguments.pathInfo, getSeriesDelimiter()) />
				
				<cfloop from="1" to="#ArrayLen(names)#" index="i" step="2">
					<cfif i + 1 LTE ArrayLen(names) AND names[i+1] NEQ "_-_NULL_-_">
						<cfset value = names[i+1] />
					<cfelse>
						<cfset value = "" />
					</cfif>
					<cfset params[names[i]] = value />
				</cfloop>
			<cfelse>
				
				<cfset names = ListToArray(arguments.pathInfo, getSeriesDelimiter()) />
				
				<cfloop from="1" to="#ArrayLen(names)#" index="i">
					<cfif ListLen(names[i], getPairDelimiter()) EQ 2>
						<cfset value = ListGetAt(names[i], 2, getPairDelimiter()) />
					<cfelse>
						<cfset value = "" />
					</cfif>
					<cfset params[ListGetAt(names[i], 1, getPairDelimiter())] =  value />
				</cfloop>
			</cfif>
		</cfif>
		
		<cfreturn params />
	</cffunction> 

readPersistEventData

public struct readPersistEventData( struct eventArgs )

Gets a persisted event by id if found in event args.

Parameters:
struct eventArgs

Code:

	<cffunction name="readPersistEventData" access="public" returntype="struct" output="false"
		hint="Gets a persisted event by id if found in event args.">
		<cfargument name="eventArgs" type="struct" required="true" />
		
		<cfset var data = getRequestRedirectPersist().read(arguments.eventArgs) />
		<cfset var postRedirectCallbacks = getPostRedirectCallbacks() />
		<cfset var i = "" />
		
		
		<cfif StructCount(data)>
			
			<cfloop from="1" to="#ArrayLen(postRedirectCallbacks)#" index="i">
				<cfinvoke component="#postRedirectCallbacks[i].callback#"
					method="#postRedirectCallbacks[i].method#">
					<cfinvokeargument name="data" value="#data#" />
				</cfinvoke>
			</cfloop>
			
			<cfreturn data.eventArgs />	
		<cfelse>
			<cfreturn data />
		</cfif>
	</cffunction> 

savePersistEventData

public string savePersistEventData( struct eventArgs )

Saves persisted event data and returns the persistId.

Parameters:
struct eventArgs

Code:

	<cffunction name="savePersistEventData" access="public" returntype="string" output="false"
		hint="Saves persisted event data and returns the persistId.">
		<cfargument name="eventArgs" type="struct" required="true" />
		
		<cfset var persistId = "" />
		<cfset var data = StructNew() />
		<cfset var preRedirectCallbacks = getPreRedirectCallbacks() />
		<cfset var i = "" />
		
		<cfloop from="1" to="#ArrayLen(preRedirectCallbacks)#" index="i">
			<cfinvoke component="#preRedirectCallbacks[i].callback#"
				method="#preRedirectCallbacks[i].method#">
				<cfinvokeargument name="data" value="#data#" />
			</cfinvoke>
		</cfloop>
		
		<cfset data.eventArgs = arguments.eventArgs />
		
		<cfset persistId = getRequestRedirectPersist().save(data) />
		
		<cfreturn persistId />
	</cffunction> 

setAppManager

private void setAppManager( AppManager appManager )

Parameters:
AppManager appManager

Code:

	<cffunction name="setAppManager" access="private" returntype="void" output="false">
		<cfargument name="appManager" type="MachII.framework.AppManager" required="true" />
		<cfset variables.appManager = arguments.appManager />
	</cffunction> 

setDefaultUrlBase

private void setDefaultUrlBase( string defaultUrlBase )

Parameters:
string defaultUrlBase

Code:

	<cffunction name="setDefaultUrlBase" access="private" returntype="void" output="false">
		<cfargument name="defaultUrlBase" type="string" required="true" />
		<cfset variables.defaultUrlBase = arguments.defaultUrlBase />
	</cffunction> 

setEventParameter

private void setEventParameter( string eventParameter )

Parameters:
string eventParameter

Code:

	<cffunction name="setEventParameter" access="private" returntype="void" output="false">
		<cfargument name="eventParameter" type="string" required="true" />
		<cfset variables.eventParameter = arguments.eventParameter />
	</cffunction> 

setLog

private void setLog( LogFactory logFactory )

Uses the log factory to create a log.

Parameters:
LogFactory logFactory

Code:

	<cffunction name="setLog" access="private" returntype="void" output="false"
		hint="Uses the log factory to create a log.">
		<cfargument name="logFactory" type="MachII.logging.LogFactory" required="true" />
		<cfset variables.log = arguments.logFactory.getLog(getMetadata(this).name) />
	</cffunction> 

setMaxEvents

private void setMaxEvents( numeric maxEvents )

Parameters:
numeric maxEvents

Code:

	<cffunction name="setMaxEvents" access="private" returntype="void" output="false">
		<cfargument name="maxEvents" type="numeric" required="true" />
		<cfset variables.maxEvents = arguments.maxEvents />
	</cffunction> 

setModuleDelimiter

private void setModuleDelimiter( string moduleDelimiter )

Parameters:
string moduleDelimiter

Code:

	<cffunction name="setModuleDelimiter" access="private" returntype="void" output="false">
		<cfargument name="moduleDelimiter" type="string" required="true" />
		<cfset variables.moduleDelimiter = arguments.moduleDelimiter />
	</cffunction> 

setPairDelimiter

private void setPairDelimiter( string pairDelimiter )

Parameters:
string pairDelimiter

Code:

	<cffunction name="setPairDelimiter" access="private" returntype="void" output="false">
		<cfargument name="pairDelimiter" type="string" required="true" />
		<cfset variables.pairDelimiter = arguments.pairDelimiter />
	</cffunction> 

setParameterPrecedence

private void setParameterPrecedence( string parameterPrecedence )

Parameters:
string parameterPrecedence

Code:

	<cffunction name="setParameterPrecedence" access="private" returntype="void" output="false">
		<cfargument name="parameterPrecedence" type="string" required="true" />
		<cfset variables.parameterPrecedence = arguments.parameterPrecedence />
	</cffunction> 

setParseSes

private void setParseSes( string parseSes )

Parameters:
string parseSes

Code:

	<cffunction name="setParseSes" access="private" returntype="void" output="false">
		<cfargument name="parseSes" type="string" required="true" />
		<cfset variables.parseSes = arguments.parseSes />
	</cffunction> 

setQueryStringDelimiter

private void setQueryStringDelimiter( string queryStringDelimiter )

Parameters:
string queryStringDelimiter

Code:

	<cffunction name="setQueryStringDelimiter" access="private" returntype="void" output="false">
		<cfargument name="queryStringDelimiter" type="string" required="true" />
		<cfset variables.queryStringDelimiter = arguments.queryStringDelimiter />
	</cffunction> 

setRequestRedirectPersist

public void setRequestRedirectPersist( any requestRedirectPersist )

Parameters:
any requestRedirectPersist

Code:

	<cffunction name="setRequestRedirectPersist" access="public" returntype="void" output="false">
		<cfargument name="requestRedirectPersist" type="any" required="true" />
		<cfset variables.requestRedirectPersist = arguments.requestRedirectPersist />
	</cffunction> 

setSeriesDelimiter

private void setSeriesDelimiter( string seriesDelimiter )

Parameters:
string seriesDelimiter

Code:

	<cffunction name="setSeriesDelimiter" access="private" returntype="void" output="false">
		<cfargument name="seriesDelimiter" type="string" required="true" />
		<cfset variables.seriesDelimiter = arguments.seriesDelimiter />
	</cffunction>