Listing 1

<event-handlers>
	<event-handler event="home" access="public">
		<view-page name="index" />
	</event-handler>

	<event-handler event="preferences" access="public">
		<view-page name="preferences" />
	</event-handler>

	<event-handler event="about" access="public">
		<view-page name="about" />
	</event-handler>

	<event-handler event="legal" access="public">
		<view-page name="legal" />
	</event-handler>

	<event-handler event="affiliate" access="public">
		<view-page name="affiliate" />
	</event-handler>

	<event-handler event="category" access="public">
		<view-page name="category" />
	</event-handler>

	<event-handler event="product" access="public">
		<view-page name="category" />
	</event-handler>

	<event-handler event="search" access="public">
		<!-- Right now the search functionality is performed in page (via a call to
		 store.search()), but it should probably be moved to a listener call.-->
		<view-page name="searchResults" />
	</event-handler>

	<event-handler event="updateUserPreferences" access="public">
		<!-- We'll notify the listener to update the user preferences. When they're updated,
		 'userPreferencesUpdated' event is announced. When the event is announced, we want to
		  map it to 'show preferences' event. -->
		<event-mapping event="userPreferencesUpdated" mapping="preferences" />
		<notify listener="StoreListener" method="updateUserPreferences" />
	</event-handler>

	<event-handler event="showCart" access="public">
		<view-page name="cart" />
	</event-handler>

	<event-handler event="addItemsToCart" access="public">
		<!-- Notify the listener to add the item to the cart.
		When updated, 'cartUpdated' event is announced. -->
		<notify listener="StoreListener" method="addItemsToCart" />
	</event-handler>

	<event-handler event="updateCart" access="public">
		<!-- Notify the listener to update the cart. When updated, 'cartUpdated' event is
		 announced. -->
		<notify listener="StoreListener" method="updateCart" />
	</event-handler>

	<event-handler event="cartUpdated" access="private">
		<redirect event="showCart" args="statusMessage" />
	</event-handler>

	<event-handler event="startCheckout" access="public">
		<event-arg name="step" value="1" />
		<view-page name="checkout" />
	</event-handler>

	<event-handler event="continueCheckout" access="public">
		<!-- Notify the listener to persist the current step's data. When updated,
		 'checkoutStep' event is announced (with the step incremented). -->
		<notify listener="CheckoutListener" method="continueCheckout" />
	</event-handler>

	<event-handler event="checkoutStep" access="private">
		<notify listener="CheckoutListener" method="getStatesList" resultArg="qryStateList"
		 />
		<notify listener="CheckoutListener" method="getShippingMethods"
		 resultArg="qryShippingMethods" />
		<view-page name="checkout" />
	</event-handler>

	<event-handler event="previousCheckout" access="public">
		<announce event="checkoutStep" />
	</event-handler>

	<event-handler event="completeCheckout" access="public">
		<notify listener="CheckoutListener" method="completeCheckout" />
	</event-handler>

	<event-handler event="checkoutComplete" access="private">
		<!-- Redirect to the 'checkoutReceipt' event so hitting reload won't re-order. -->
		<redirect event="checkoutReceipt" />
	</event-handler>

	<event-handler event="checkoutReceipt" access="public">
		<event-arg name="step" value="7" />
		<view-page name="checkout" />
	</event-handler>

	<event-handler event="exceptionEvent" access="private">
		<view-page name="exception" />
	</event-handler>
</event-handlers>

Listing 2

<cffunction name="updateUserPreferences" access="public" returntype="void" output="false"
 hint="">
	<cfargument name="event" type="MachII.framework.Event" required="true" />
	<cfset var user = event.getArg('user') />

	<!--- Update the user's preferences. --->
	<cfset user.setEmail( event.getArg('email') ) />
	<cfset user.setPreference('favoritepet', event.getArg('favoritepet')) />
	<cfset user.setPreference('mailings_sales', event.getArg('mailings_sales','0')) />
	<cfset user.setPreference('mailings_tips', event.getArg('mailings_tips','0')) />

	<!--- Set a status message in the event. --->
	<cfset arguments.event.setArg('statusMessage', 'Your preferences have been saved.') />

	<!--- Announce an event to let the app know the user's preferences have been updated.
	 --->
	<cfset announceEvent('userPreferencesUpdated', arguments.event.getArgs()) />
</cffunction>