<?xml version="1.0" encoding="UTF-8"?>
<commit>
  <added type="array">
    <added>
      <filename>lib/Catalyst/Helper/Handel.pm</filename>
    </added>
    <added>
      <filename>lib/Catalyst/Model/Handel/Cart.pm</filename>
    </added>
    <added>
      <filename>lib/Catalyst/Model/Handel/Order.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Base.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Cart/Schema.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Compat.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Compat/Currency.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Components/Constraints.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Components/DefaultValues.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Components/Validation.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Iterator/DBIC.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Iterator/List.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Iterator/Results.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual/About.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual/Cookbook.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual/Cookbook/AddingColumns.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual/Cookbook/WritingCustomStorage.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual/Intro.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual/KnownIssues.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual/QuickStart.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual/Requirements.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual/Schema.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual/Storage.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual/Storage/DBIC.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Manual/Upgrading.pod</filename>
    </added>
    <added>
      <filename>lib/Handel/Order/Schema.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Schema.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Schema/DBIC/Cart.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Schema/DBIC/Cart/Item.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Schema/DBIC/Order.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Schema/DBIC/Order/Item.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Storage.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Storage/DBIC.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Storage/DBIC/Cart.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Storage/DBIC/Cart/Item.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Storage/DBIC/Order.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Storage/DBIC/Order/Item.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Storage/DBIC/Result.pm</filename>
    </added>
    <added>
      <filename>lib/Handel/Storage/Result.pm</filename>
    </added>
    <added>
      <filename>lib/Module/Starter/Handel.pm</filename>
    </added>
    <added>
      <filename>script/handel.pl</filename>
    </added>
    <added>
      <filename>t/base_cart_class.t</filename>
    </added>
    <added>
      <filename>t/base_create_accessors.t</filename>
    </added>
    <added>
      <filename>t/base_create_instance.t</filename>
    </added>
    <added>
      <filename>t/base_get_column.t</filename>
    </added>
    <added>
      <filename>t/base_item_class.t</filename>
    </added>
    <added>
      <filename>t/base_set_column.t</filename>
    </added>
    <added>
      <filename>t/base_storage.t</filename>
    </added>
    <added>
      <filename>t/base_storage_class.t</filename>
    </added>
    <added>
      <filename>t/base_update.t</filename>
    </added>
    <added>
      <filename>t/cart_create.t</filename>
    </added>
    <added>
      <filename>t/cart_item_create.t</filename>
    </added>
    <added>
      <filename>t/cart_search.t</filename>
    </added>
    <added>
      <filename>t/catalyst_helpers_handel.t</filename>
    </added>
    <added>
      <filename>t/catalyst_helpers_scaffold.t</filename>
    </added>
    <added>
      <filename>t/catalyst_model_cart.t</filename>
    </added>
    <added>
      <filename>t/catalyst_model_order.t</filename>
    </added>
    <added>
      <filename>t/compat.t</filename>
    </added>
    <added>
      <filename>t/compat_cart_item_new.t</filename>
    </added>
    <added>
      <filename>t/compat_cart_items.t</filename>
    </added>
    <added>
      <filename>t/compat_cart_load.t</filename>
    </added>
    <added>
      <filename>t/compat_cart_new.t</filename>
    </added>
    <added>
      <filename>t/compat_currency.t</filename>
    </added>
    <added>
      <filename>t/compat_order_item_new.t</filename>
    </added>
    <added>
      <filename>t/compat_order_items.t</filename>
    </added>
    <added>
      <filename>t/compat_order_load.t</filename>
    </added>
    <added>
      <filename>t/compat_order_new.t</filename>
    </added>
    <added>
      <filename>t/config_modperl1.t</filename>
    </added>
    <added>
      <filename>t/config_modperl2.t</filename>
    </added>
    <added>
      <filename>t/constraints_cart_name.t</filename>
    </added>
    <added>
      <filename>t/exceptions_axkit.t</filename>
    </added>
    <added>
      <filename>t/htdocs/tt2/constants.tt2</filename>
    </added>
    <added>
      <filename>t/htdocs/tt2/out/constants.tt2.out</filename>
    </added>
    <added>
      <filename>t/iterator.t</filename>
    </added>
    <added>
      <filename>t/iterator_dbic.t</filename>
    </added>
    <added>
      <filename>t/iterator_list.t</filename>
    </added>
    <added>
      <filename>t/iterator_results.t</filename>
    </added>
    <added>
      <filename>t/l10n_lexicon_synced.t</filename>
    </added>
    <added>
      <filename>t/lib/Handel/Checkout/Plugin/NotBlessedPlugin.pm</filename>
    </added>
    <added>
      <filename>t/lib/Handel/Checkout/Plugin/NotISAPlugin.pm</filename>
    </added>
    <added>
      <filename>t/lib/Handel/Subclassing/Base1.pm</filename>
    </added>
    <added>
      <filename>t/lib/Handel/Subclassing/Base2.pm</filename>
    </added>
    <added>
      <filename>t/lib/Handel/Subclassing/Base3.pm</filename>
    </added>
    <added>
      <filename>t/lib/Handel/Subclassing/Currency.pm</filename>
    </added>
    <added>
      <filename>t/lib/Handel/Subclassing/GenericItem.pm</filename>
    </added>
    <added>
      <filename>t/lib/Handel/Subclassing/Storage.pm</filename>
    </added>
    <added>
      <filename>t/lib/Handel/Test.pm</filename>
    </added>
    <added>
      <filename>t/lib/Handel/Test/Schema.pm</filename>
    </added>
    <added>
      <filename>t/lib/Handel/TestComponents/Constraints.pm</filename>
    </added>
    <added>
      <filename>t/lib/Handel/TestComponents/DefaultValues.pm</filename>
    </added>
    <added>
      <filename>t/lib/Handel/TestComponents/Validation.pm</filename>
    </added>
    <added>
      <filename>t/manifest.t</filename>
    </added>
    <added>
      <filename>t/module_starter.t</filename>
    </added>
    <added>
      <filename>t/order_create.t</filename>
    </added>
    <added>
      <filename>t/order_item_create.t</filename>
    </added>
    <added>
      <filename>t/order_save.t</filename>
    </added>
    <added>
      <filename>t/order_search.t</filename>
    </added>
    <added>
      <filename>t/schema.t</filename>
    </added>
    <added>
      <filename>t/sql/test.sqlite.sql</filename>
    </added>
    <added>
      <filename>t/storage_add_columns.t</filename>
    </added>
    <added>
      <filename>t/storage_add_constraint.t</filename>
    </added>
    <added>
      <filename>t/storage_check_constraints.t</filename>
    </added>
    <added>
      <filename>t/storage_clone.t</filename>
    </added>
    <added>
      <filename>t/storage_column_accessors.t</filename>
    </added>
    <added>
      <filename>t/storage_columns.t</filename>
    </added>
    <added>
      <filename>t/storage_constraints.t</filename>
    </added>
    <added>
      <filename>t/storage_copyable_item_columns.t</filename>
    </added>
    <added>
      <filename>t/storage_currency_class.t</filename>
    </added>
    <added>
      <filename>t/storage_currency_columns.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_add_columns.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_add_constraint.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_add_item.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_clone.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_column_accessors.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_columns.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_connection_info.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_constraints.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_copyable_item_columns.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_count_items.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_create.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_currency_code.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_currency_columns.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_currency_format.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_default_values.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_delete.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_delete_items.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_has_column.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_primary_columns.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_process_error.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_remove_columns.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_remove_constraint.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_remove_constraints.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_schema_class.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_schema_instance.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_search.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_search_items.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_setup.t</filename>
    </added>
    <added>
      <filename>t/storage_dbic_validation.t</filename>
    </added>
    <added>
      <filename>t/storage_default_values.t</filename>
    </added>
    <added>
      <filename>t/storage_has_column.t</filename>
    </added>
    <added>
      <filename>t/storage_iterator_class.t</filename>
    </added>
    <added>
      <filename>t/storage_new.t</filename>
    </added>
    <added>
      <filename>t/storage_primary_columns.t</filename>
    </added>
    <added>
      <filename>t/storage_remove_columns.t</filename>
    </added>
    <added>
      <filename>t/storage_remove_constraint.t</filename>
    </added>
    <added>
      <filename>t/storage_remove_constraints.t</filename>
    </added>
    <added>
      <filename>t/storage_set_default_values.t</filename>
    </added>
    <added>
      <filename>t/storage_setup.t</filename>
    </added>
    <added>
      <filename>t/storage_validate_data.t</filename>
    </added>
    <added>
      <filename>t/storage_validation.t</filename>
    </added>
    <added>
      <filename>t/style_critic_core.rc</filename>
    </added>
    <added>
      <filename>t/style_critic_core.t</filename>
    </added>
    <added>
      <filename>t/style_no_tabs.t</filename>
    </added>
    <added>
      <filename>t/tt2_constants.t</filename>
    </added>
  </added>
  <modified type="array">
    <modified>
      <diff>@@ -1,12 +1,278 @@
 Revision history for Perl module Handel
 
+1.00000 Sun June 24 08:57:22 2007
+    - constraint_price now uses $currency-&gt;value if value isa
+        Data::Currency object
+
+0.99_19 Thur June 21 21:02:36 2007
+    - Storage-&gt;setup now puts non-accessor keys into %$self
+    - Removed incomplete L10N Lexicons
+    - Cleanup coverage before 1.0 release
+    - DBIx::Class 0.08 Released &amp; Required
+    - Added AutoCommit to Handel::Test
+    - Tweaked failing checkout process tests
+
+0.99_18 Wed Apr 18 19:55:09 2007
+    - Added --version to handel.pl/handel.bat
+    - Fixed Handel::Compat::Currency pod
+    - Updated prereq to use DBIx::Class 0.07999_02
+    - Added skips for DBD::SQLite 1.13 (teh devil) causing failing tests
+    - Updated Perl::Critic tests
+
+0.99_17 Wed Mar 21 20:11:24 2007
+    - Renamed ConfigReaders %Defaults to %DEFAULTS
+    - Removed t/style_critic_tests. ETOOMUCHWORKFORLITTLEBENEFIT
+    - Updated Test::MockObject in tests to 1.07
+    - Fixed destroy in Order
+    - Fixed has_column check when setting item currency columns
+
+    BREAKING API CHANGE:
+    - Handel::Currency isa Data::Currency
+    - H::C::format moved to as_string; now just returns the format
+
+0.99_16 Thur Dec 21 16:21:15 2006
+    - Added \%options/order_by to search/items in Cart/Order
+    - Added has_column to DBIC Storage to use ResultSource-&gt;has_column
+    - Added has_column to Result/DBIC Result
+    - Fixed TT demo code. Maybe that will die some day.
+        Seriously. Two words: Catalyst Helpers. :-)
+    - Fixed issue where Compat Currency convert failed with converter returns 0
+    - Changed quickstart setup script to *_handel.pl
+    - Added 0700 perms to handel.pl app script
+    - Storage::process_error now only dies Handel::Exception subclasses instead
+        of all blessed objects
+    - Renamed DBIC schema classes into Schema::DBIC space, like their RDBO
+        cousins
+
+0.99_15 Sun Nov 12 17:50:52 2006
+    - L10N files now use constant-like keys rather than english errors
+    - L10N::es_es.pm reworked by Diego Kuperman
+    - L10N::fr reworked by Pierrick DINTRAT
+    - Added l10n_lexicon_synced.t to ensure language lexicons are synced with
+        each other via key checks
+    - Removed constraint_uuid check from Checkout order/cart since it's not
+        subclass friendly (RT#19813,TKP)
+    - Checkout cart now throws an exception of now order can be found matching
+        the search criteria
+    - Converted tests to use Handel::Test
+    - Cleanup tests against Perl::Critic
+    - Fixed Checkout prototype mismatch warning under perl &gt; 5.8.8
+    - Added more config tests for MP1/MP2
+    - Added more Schema connect tests
+    - Added more Base tests
+    - Added Iterator tests
+    - Fixed bug in Iterator:::DBIC where first increments the resulset
+    - Fixed issue in Cat Helpers that treated MyApp::Controller:: as a valid
+        name
+    - Added Catalyst Model setup tests
+    - Added Catalyst Scaffold Helper tests
+    - Added checkout_class to Order pod
+    - Added Module::Starter::Handel to help kickstart Handel projects
+    - Added currency_code_column to storage so DBIC inflators can set currency
+        code using another column in the row
+    - Removed formatting options from Currency-&gt;convert now that it always
+        returns a currency object instead of formatted strings
+    - Reworked Handel::Currency to be more object like with its parameters
+    - Added Handel::Compat::Currency, inserted automatically when loading
+        Handel::Compat
+    - Added compat_currency.t tests
+    - Converted to Module::Pluggable::Object
+    - Cart restore now throws exception on unknown mode like it was supposed to
+    - Only create currency converter when calling convert for the first time
+    - Added handel.pl quickstart scripts for Module::Starter::Handel apps
+    - Added Catalyst::Helper::Handel to create entire cat app w/ starter
+        subclasses
+    - Huge test coverage. 99% w00t!
+    - Mostly Perl::Critic happy...except for some test labels
+    - Probably last release before 1.0!
+
+0.99_14 Sat Sep 23 19:14:22 2006
+    - Added Order::save method
+    - MarkOrderSaved plugin now uses Order::save method instead of setting
+        the type field directly
+    - Removed constraint_uuid check from Order create/reconcile as it's not
+        subclass of interchangable schema friendly (RT#19813,TKP)
+    - Changed id references in search to use first primary key from Storage
+        (RT#19813,TKP)
+    - Order creation from cart no does can('shopper') to help w/ subclassing
+
+0.99_13 Wed Sep 20 19:01:29 2006
+    - Added NEXT to prereqs for Handel::Compat
+    - Moved FormValidator::Simple from recommended to prereqs
+    - Added set_default_values to Storage
+    - Added check_constraints to Storage
+    - Added validate_data to Storage
+
+0.99_12 Fri Sep 15 22:28:53 2006
+    - Moved Locale::Currency/Format and WebServiceX modules to requirements
+    - Currency new() now takes $code and $format params
+    - Added name/code to Currency
+    - Added converter_class to Currency
+    - Added currency_code and currency_format to Storage
+    - Storage::DBIC now passes currency_code/format into DBIC inflate subs for
+        currency_columns
+    - Added Storage::DBIC currency_code/currency_format tests
+    - Finished Perl::Critic cleanup
+
+0.99_11 Sun Sep 10 13:33:22 2006
+    - Fix examples code in AddingColumns.pod
+    - Fixed pod references after DBIC Storage rearrangement
+    - Added item_storage_class/item_storage to Storage so item related methods
+        could get item storage config from item storage without being tied to
+        top level item class
+    - Moved item_class/cart_class back into Handel::Base. They don't belong in
+        storage
+    - Moved checkout_class back into Handel::Order. That doesn't belong in
+        storage either
+    - Added WritingCustomStorage to Cookbook
+    - Added has_column to Storage
+
+0.99_10 Wed Sep 06 21:02:33 2006
+    - Added start of Cookbook and Cookbook/AddColumns
+    - Moved DBIC specific Storage classes into DBIC namespace
+    - Changed process to get items-&gt;all instead of (items)
+
+0.99_09 Tue Sep 05 19:18:52 2006
+    - Catalyst Helpers now require FormValidator::Simple 0.17 (Woohoo!)
+    - Validation component now requires DBIx::Class::Validation 0.01001
+        which uses new FV::S for profile/instance/messages fixes
+    - Filled in pod generated by Catalyst Helpers in a moment of weakness
+
+0.99_08 Mon Sep 04 16:45:22 2006
+    - Added txn_begin/commit/rollback to Storage and Storage::DBIC to help
+        abstract Checkout::process from Storage.
+    - Added Storage::DBIC::Result to get DBIC specific things out of
+    Storage::Result
+    - Minor pod fixes
+
+0.99_07 Sun Sep 03 20:58:13 2006
+	WARNING: The auto generated Catalyst helper code requires
+	FormValidator::Simple
+	changes/fixes that have yet to be commited or accepted until the author
+	responds.
+	Contact me if you need a copy of the modified version.
+
+    - Moved perl_critic.t to style_perl_critic.t
+    - Added style_no_tabs.t
+    - Style tests now enabled via TEST_PRIVATE
+    - Reworked Catalyst Helpers for Controllers and their tests.
+    - Fixed issue where add_handler wasn't assigning unique pref ids when non
+        were specified in the plugins themselves.
+    - Moved requirements to Requirements.pod
+    - Cart destroy now works on a blessed object under Catalyst
+    - AssignOrderNumber checkout plugin no longer sets the updated field.
+        This will be rolled into the Order class in the next release.
+
+0.99_06 Fri Aug 25 20:53:26 2006
+    - Simplified Storage-&gt;setup and removed clear/reset nonsense
+    - Added Spanish lexion provided by Diego Kuperman
+    - Abstracted Iterator and added subclasses for lists, DBIC resultsets
+        and storage results
+    - Added result_iterator_class to Base using default of
+    Handel::Iterator::Results
+    - Storage now leaves DBIC result_class alone and returns
+    Handel::Iterator::DBIC
+        iterators for search/search_items
+    - Cart/Order now use Handel::Iterator::Results iterator
+    - Split DBIC specific storage into Storage::DBIC w/ massive tests
+    - Started moving news tests to Handel::Test w/ better db deploy/var
+    directory
+    - Split Manual Storage into Storage/Storage::DBIC
+    - Added param checks to many Storage methods
+    - Replaced old Makefile warnings w/ mention of Test::More and DateTime
+    compares
+    - Added Perl::Critic tests for my personal gratification. None pass yet. :-)
+    - currency_columns gets/sets list instead of arrayrefs to better match
+    generic
+        columns/primary_columns
+    - Bumped DBIC requirement to 0.08 (use -current for now)
+    - Reworked Catalyst Helpers for Models (Controllers are still broken)
+
+0.99_05 Wed Aug 09 21::02::29 2006
+    - Changed create_result in Base to create_instance
+    - Added create/search/uuid_maker/copyable_item_columns to Storage
+    - Storage-&gt;clone now clones even with an active schema instance
+    - Schema configuration in Storage now uses a clone of the item_classes
+        storage instead of the original, and redirects result-&gt;storage
+    - Cart/Order/Items now use storage create/search
+    - Cart/Order add() now use copyable_item_columns when passed objects
+    - Cart/Order add() now look for source columns and methods to fill
+        destination column values
+    - Various pod fixes
+    - Added more tests for create_instance/clone changes
+    - Cart/Order/Item new/load/destroy now take \%options, specifically
+    $options{storage}
+    - Order-&gt;new $process argument moved into \%options
+    - Order-&gt;copy_cart_items now just uses add
+    - Added checkout_class to Storage
+    - Storage now uses exception_action rather than dbh-&gt;{HandleError}
+    - Storage process_error now creates a Storage Exception for unknown errors
+    - Moved storage settings in Cart/Order Item into Storage::Cart/Order::Item
     - Applied Catalyst Helper test patch from Todd W.
-
-0.33 Mon Jun 19 19:31:23 2006
+    - Added Storage::Result, which is now returned by storage actions
+    - Handel::Currency convert now returns a new currency object
+    - Cart/Order/Item now use generic result objects
+    - Cart/Order clear now returns result of action like delete does
+    - Renamed Cart/Order/Item new() to create()
+    - Renamed Cart/Order/Item load() to search()
+    - Added load/new/items to Compat.t w/subclass tests
+
+0.99_04 Sat Jul 15 16:21:25 2006
+    - Schema configuration now finally uses load_components without the
+        Class::C3 recalc slowdown
+    - Validation component now uses throw_exception/next::method now that
+        load_components is used
+    - Major pod cleanup
+    - Excised all forms of RETURN_AS
+    - TEST_SPELLING is now TEST_POD, which all pod tests now use
+    - Order created/updated fields now return DateTime objects using
+        DBIx::Class::InflateColumn::DateTime
+    - Excised remaining UNIVERSAL::isa mistakes. Blessed is your friend.
+    - Order created/updated fields now default to DateTime-&gt;now
+
+0.99_03 Mon Jul 10 21:05:27 2006
+    - Fixed AxKit Exception Error (RT#19707,TKP)
+    - Added start of Handel::Manual
+    - uuid is now new_uuid, and now in Storage
+    - Removed setup_columns_accessors in favor or create_accessors in Base
+    - Cart/Order/Item classes now have a instance of storage instead of
+        subclassing it
+    - Added Handel::Base as super class for Cart/Order/Item classes
+    - Added Handel::Storage tests
+    - Handel::Storage now does all schema configurate during first
+        schema_instance call
+    - Added Handel::Storage::new/setup
+    - Cart/Order/Item classes now delegate direct schema access to Storage
+    - Added validation/constraint/default_value_class to Storage
+    - Converted Storage from Class::Data::Accessor to Class::Accesssor::Grouped
+    - Refactored injection of components into schema source classes
+    - schema_instance now creates a clone using compose_namespace and
+        does its component injection into the clone instead
+    - Added currency_class/currency_columns to Storage
+    - Added value() to Handel::Currency
+    - Added autoupdate to results that inherits from storage-&gt;autoupdate
+    - Added basic compatibility layer for older subclasses
+
+0.99_02 Mon Jun 05 22:08:32 2006
+    - Fixed test counts in t/order_new.t (RT#19700,TKP)
+    - Moved _error_handler in Storage to process_error and set
+        dbh-&gt;{HandelError} using $self-&gt;can
+    - Use blessed when setting schema_instance in Storage
+    - Abstracted schema setup when setting Storage-&gt;schema_instance($schema)
+
+0.99_01
+    - RETURN_AS has been removed from the API
+    - Data filters now take SQL::Abstract syntax for wildcards
+    - Converted from Class::DBI to DBIx::Class schemas
+    - Handel::ConfigReader is now a singleton via instance()
+    - Handel::DBI is deprecated in favor if Handel::Storage
+    - Moved column defaults into Handel::Components::DefaultValues
+    - Added constraint_cart_name
+
+0.33
     - Fixed version requirement for catalyst tests
     - Fixed cart iterator tests db file creation issues
     - Cart taglib now calls tag-based functions to ease subclassing
-    - Applied Catalyst Controller Helper patch from Todd W. for Catalyst 5.6+
 
 0.32 Sun Jan 22 18:19:38 2006
     - Added order_reconcile.t tests
@@ -412,3 +678,6 @@ Revision history for Perl module Handel
 
 
 
+
+
+</diff>
      <filename>Changes</filename>
    </modified>
    <modified>
      <diff>@@ -22,34 +22,73 @@ demo/tt2/style/css/basic.css
 lib/AxKit/XSP/Handel/Cart.pm
 lib/AxKit/XSP/Handel/Checkout.pm
 lib/AxKit/XSP/Handel/Order.pm
+lib/Catalyst/Helper/Handel.pm
 lib/Catalyst/Helper/Handel/Scaffold.pm
 lib/Catalyst/Helper/Controller/Handel/Cart.pm
 lib/Catalyst/Helper/Controller/Handel/Checkout.pm
 lib/Catalyst/Helper/Controller/Handel/Order.pm
 lib/Catalyst/Helper/Model/Handel/Cart.pm
 lib/Catalyst/Helper/Model/Handel/Order.pm
+lib/Catalyst/Model/Handel/Cart.pm
+lib/Catalyst/Model/Handel/Order.pm
 lib/Handel.pm
+lib/Handel/Base.pm
+lib/Handel/Compat.pm
+lib/Handel/Compat/Currency.pm
 lib/Handel/Cart.pm
 lib/Handel/Cart/Item.pm
+lib/Handel/Cart/Schema.pm
 lib/Handel/Checkout.pm
 lib/Handel/Checkout/Message.pm
 lib/Handel/Checkout/Plugin.pm
 lib/Handel/Checkout/Plugin/AssignOrderNumber.pm
 lib/Handel/Checkout/Plugin/MarkOrderSaved.pm
 lib/Handel/Checkout/Stash.pm
+lib/Handel/Components/Constraints.pm
+lib/Handel/Components/DefaultValues.pm
+lib/Handel/Components/Validation.pm
 lib/Handel/ConfigReader.pm
 lib/Handel/Constants.pm
 lib/Handel/Constraints.pm
 lib/Handel/Currency.pm
-lib/Handel/DBI.pm
 lib/Handel/Exception.pm
 lib/Handel/Iterator.pm
+lib/Handel/Iterator/DBIC.pm
+lib/Handel/Iterator/List.pm
+lib/Handel/Iterator/Results.pm
 lib/Handel/L10N.pm
 lib/Handel/L10N/en_us.pm
 lib/Handel/L10N/fr.pm
-lib/Handel/L10N/zh_tw.pm
+lib/Handel/Manual.pod
+lib/Handel/Manual/About.pod
+lib/Handel/Manual/Cookbook.pod
+lib/Handel/Manual/Cookbook/AddingColumns.pod
+lib/Handel/Manual/Cookbook/WritingCustomStorage.pod
+lib/Handel/Manual/Intro.pod
+lib/Handel/Manual/KnownIssues.pod
+lib/Handel/Manual/QuickStart.pod
+lib/Handel/Manual/Schema.pod
+lib/Handel/Manual/Storage.pod
+lib/Handel/Manual/Storage/DBIC.pod
+lib/Handel/Manual/Requirements.pod
+lib/Handel/Manual/Upgrading.pod
 lib/Handel/Order.pm
 lib/Handel/Order/Item.pm
+lib/Handel/Order/Schema.pm
+lib/Handel/Schema.pm
+lib/Handel/Schema/DBIC/Cart.pm
+lib/Handel/Schema/DBIC/Cart/Item.pm
+lib/Handel/Schema/DBIC/Order.pm
+lib/Handel/Schema/DBIC/Order/Item.pm
+lib/Handel/Storage.pm
+lib/Handel/Storage/Result.pm
+lib/Handel/Storage/DBIC.pm
+lib/Handel/Storage/DBIC/Cart.pm
+lib/Handel/Storage/DBIC/Cart/Item.pm
+lib/Handel/Storage/DBIC/Order.pm
+lib/Handel/Storage/DBIC/Order/Item.pm
+lib/Handel/Storage/DBIC/Result.pm
+lib/Module/Starter/Handel.pm
 lib/Template/Plugin/Handel/Cart.pm
 lib/Template/Plugin/Handel/Checkout.pm
 lib/Template/Plugin/Handel/Constants.pm
@@ -60,17 +99,27 @@ MANIFEST
 MANIFEST.SKIP
 META.yml
 README
+script/handel.pl
 sql/handel.sqlite.sql
+t/base_storage.t
+t/base_storage_class.t
+t/base_update.t
+t/base_create_accessors.t
+t/base_create_instance.t
+t/base_cart_class.t
+t/base_item_class.t
+t/base_get_column.t
+t/base_set_column.t
 t/basic.t
 t/cart_add.t
 t/cart_clear.t
 t/cart_delete.t
 t/cart_destroy.t
-t/cart_item_new.t
+t/cart_item_create.t
 t/cart_items.t
 t/cart_iterator.t
-t/cart_load.t
-t/cart_new.t
+t/cart_search.t
+t/cart_create.t
 t/cart_restore.t
 t/cart_restore_append.t
 t/cart_restore_append_filter.t
@@ -79,11 +128,15 @@ t/cart_restore_merge_filter.t
 t/cart_restore_replace.t
 t/cart_restore_replace_filter.t
 t/cart_save.t
+t/catalyst_helpers_handel.t
+t/catalyst_helpers_scaffold.t
 t/catalyst_helpers_controller_cart.t
 t/catalyst_helpers_controller_checkout.t
 t/catalyst_helpers_controller_order.t
 t/catalyst_helpers_model_cart.t
 t/catalyst_helpers_model_order.t
+t/catalyst_model_cart.t
+t/catalyst_model_order.t
 t/checkout_cart.t
 t/checkout_messages.t
 t/checkout_order.t
@@ -93,7 +146,10 @@ t/checkout_process.t
 t/checkout_stash.t
 t/conf/extra.conf.in
 t/config.t
+t/config_modperl1.t
+t/config_modperl2.t
 t/constants.t
+t/constraints_cart_name.t
 t/constraints_cart_type.t
 t/constraints_checkout_phase.t
 t/constraints_currency_code.t
@@ -102,8 +158,18 @@ t/constraints_price.t
 t/constraints_quantity.t
 t/constraints_uuid.t
 t/currency.t
-t/dbi.t
+t/compat.t
+t/compat_cart_load.t
+t/compat_cart_items.t
+t/compat_cart_new.t
+t/compat_cart_item_new.t
+t/compat_order_load.t
+t/compat_order_items.t
+t/compat_order_new.t
+t/compat_order_item_new.t
+t/compat_currency.t
 t/exceptions.t
+t/exceptions_axkit.t
 t/htdocs/axkit/cart_cart.xsp
 t/htdocs/axkit/cart_cart_add.xsp
 t/htdocs/axkit/cart_cart_add_filtered.xsp
@@ -322,6 +388,7 @@ t/htdocs/tt2/cart_restore_replace.tt2
 t/htdocs/tt2/cart_save.tt2
 t/htdocs/tt2/cart_update.tt2
 t/htdocs/tt2/cart_uuid.tt2
+t/htdocs/tt2/constants.tt2
 t/htdocs/tt2/checkout_messages.tt2
 t/htdocs/tt2/checkout_order.tt2
 t/htdocs/tt2/checkout_phases.tt2
@@ -367,6 +434,7 @@ t/htdocs/tt2/out/cart_restore_merge.tt2.out
 t/htdocs/tt2/out/cart_restore_replace.tt2.out
 t/htdocs/tt2/out/cart_save.tt2.out
 t/htdocs/tt2/out/cart_update.tt2.out
+t/htdocs/tt2/out/constants.tt2.out
 t/htdocs/tt2/out/checkout_messages.tt2.out
 t/htdocs/tt2/out/checkout_order.tt2.out
 t/htdocs/tt2/out/checkout_phases.tt2.out
@@ -390,9 +458,16 @@ t/htdocs/tt2/out/order_items_filtered.tt2.out
 t/htdocs/tt2/out/order_items_filtered_no_results.tt2.out
 t/htdocs/tt2/out/order_items_update.tt2.out
 t/htdocs/tt2/out/order_update.tt2.out
+t/iterator.t
+t/iterator_list.t
+t/iterator_dbic.t
+t/iterator_results.t
 t/l10n.t
+t/l10n_lexicon_synced.t
 t/lib/Handel/Checkout/Plugin/TestPlugin.pm
 t/lib/Handel/Checkout/Plugin/TestBogusPlugin.pm
+t/lib/Handel/Checkout/Plugin/NotBlessedPlugin.pm
+t/lib/Handel/Checkout/Plugin/NotISAPlugin.pm
 t/lib/Handel/Checkout/TestMessage.pm
 t/lib/Handel/OtherTestPlugins/Second.pm
 t/lib/Handel/Subclassing/Cart.pm
@@ -400,42 +475,113 @@ t/lib/Handel/Subclassing/CartOnly.pm
 t/lib/Handel/Subclassing/CartItem.pm
 t/lib/Handel/Subclassing/Checkout.pm
 t/lib/Handel/Subclassing/CheckoutStash.pm
+t/lib/Handel/Subclassing/Currency.pm
+t/lib/Handel/Subclassing/GenericItem.pm
 t/lib/Handel/Subclassing/Order.pm
 t/lib/Handel/Subclassing/OrderOnly.pm
 t/lib/Handel/Subclassing/OrderItem.pm
 t/lib/Handel/Subclassing/OrderCart.pm
 t/lib/Handel/Subclassing/OrdersCart.pm
 t/lib/Handel/Subclassing/Stash.pm
+t/lib/Handel/Subclassing/Base1.pm
+t/lib/Handel/Subclassing/Base2.pm
+t/lib/Handel/Subclassing/Base3.pm
+t/lib/Handel/Subclassing/Storage.pm
+t/lib/Handel/Test.pm
+t/lib/Handel/Test/Schema.pm
+t/lib/Handel/TestComponents/Constraints.pm
+t/lib/Handel/TestComponents/DefaultValues.pm
+t/lib/Handel/TestComponents/Validation.pm
 t/lib/Handel/TestHelper.pm
 t/lib/Handel/TestPipeline/InitializeTotals.pm
 t/lib/Handel/TestPipeline/ValidateError.pm
 t/lib/Handel/TestPipeline/ReadFromStash.pm
 t/lib/Handel/TestPipeline/WriteToStash.pm
 t/lib/Handel/TestPlugins/First.pm
+t/manifest.t
+t/module_starter.t
 t/order_add.t
 t/order_clear.t
 t/order_delete.t
 t/order_destroy.t
-t/order_item_new.t
+t/order_save.t
+t/order_item_create.t
 t/order_items.t
-t/order_load.t
-t/order_new.t
+t/order_search.t
+t/order_create.t
 t/order_reconcile.t
 t/pod_coverage.t
 t/pod_spelling.t
 t/pod_syntax.t
+t/schema.t
+t/style_critic_core.rc
+t/style_critic_core.t
+t/style_no_tabs.t
 t/strict.t
 t/SMOKE.PL
+t/storage_columns.t
+t/storage_copyable_item_columns.t
+t/storage_primary_columns.t
+t/storage_add_columns.t
+t/storage_new.t
+t/storage_remove_columns.t
+t/storage_add_constraint.t
+t/storage_remove_constraint.t
+t/storage_check_constraints.t
+t/storage_validate_data.t
+t/storage_set_default_values.t
+t/storage_setup.t
+t/storage_constraints.t
+t/storage_default_values.t
+t/storage_validation.t
+t/storage_iterator_class.t
+t/storage_currency_class.t
+t/storage_currency_columns.t
+t/storage_has_column.t
+t/storage_remove_constraints.t
+t/storage_column_accessors.t
+t/storage_clone.t
+t/storage_dbic_has_column.t
+t/storage_dbic_schema_class.t
+t/storage_dbic_connection_info.t
+t/storage_dbic_add_columns.t
+t/storage_dbic_add_constraint.t
+t/storage_dbic_add_item.t
+t/storage_dbic_clone.t
+t/storage_dbic_column_accessors.t
+t/storage_dbic_columns.t
+t/storage_dbic_copyable_item_columns.t
+t/storage_dbic_count_items.t
+t/storage_dbic_primary_columns.t
+t/storage_dbic_remove_columns.t
+t/storage_dbic_constraints.t
+t/storage_dbic_create.t
+t/storage_dbic_currency_columns.t
+t/storage_dbic_currency_code.t
+t/storage_dbic_currency_format.t
+t/storage_dbic_default_values.t
+t/storage_dbic_delete.t
+t/storage_dbic_delete_items.t
+t/storage_dbic_process_error.t
+t/storage_dbic_remove_constraint.t
+t/storage_dbic_remove_constraints.t
+t/storage_dbic_schema_instance.t
+t/storage_dbic_search.t
+t/storage_dbic_search_items.t
+t/storage_dbic_setup.t
+t/storage_dbic_validation.t
 t/sql/cart_create_table.sql
 t/sql/cart_delete_data.sql
 t/sql/cart_fake_data.sql
 t/sql/order_create_table.sql
 t/sql/order_delete_data.sql
 t/sql/order_fake_data.sql
+t/sql/test.sqlite.sql
 t/subclassing.t
 t/TEST.PL
 t/tt2_cart.t
 t/tt2_checkout.t
+t/tt2_constants.t
 t/tt2_order.t
 t/warnings.t
 t/xsp_cart.t</diff>
      <filename>MANIFEST</filename>
    </modified>
    <modified>
      <diff>@@ -2,6 +2,7 @@
 \bCVS\b
 ,v$
 \B\.svn\b
+\B\.tws\b
 ^blib/
 ^pm_to_blib
 ^MakeMaker-\d</diff>
      <filename>MANIFEST.SKIP</filename>
    </modified>
    <modified>
      <diff>@@ -1,39 +1,64 @@
 --- #YAML:1.0
 name: Handel
-abstract: Simple commerce framework with AxKit/TT/Catalyst support
+abstract: A cart/order/checkout framework with AxKit/TT/Catalyst support
 author: Christopher H. Laco &lt;claco@chrislaco.com&gt;
-version: 0.33
+version: 1.00000
 version_from: lib/Handel.pm
 installdirs: site
 license: perl
 requires:
-  Class::DBI: 0.96
-  Class::Data::Inheritable: 0
-  DBI: 1.36
+  DBIx::Class: 0.08000
+  DBIx::Class::UUIDColumns: 0.01
+  DBIx::Class::Validation: 0.01001
+  Data::Currency: 0.03
+  Class::Accessor::Grouped: 0.03
+  Class::ISA: 0
+  Class::Inspector: 0
+  Clone: 0
   Error: 0.14
   Locale::Maketext: 1.06
-  Module::Pluggable: 2.95
-  version: 0
+  Module::Pluggable: 3.1
+  Scalar::Util: 0
+  Tie::Hash: 0
+  DateTime: 0
+  DateTime::Format::MySQL: 0
+  Locale::Currency::Format: 1.22
+  Locale::Currency: 2.07
+  Finance::Currency::Convert::WebserviceX: 0.03
+  FormValidator::Simple: 0.17
+  NEXT: 0
+  FileHandle: 0,
+  File::Spec::Functions: 0
+  File::Path: 0
+  Module::Starter: 1.42
+  SQL::Translator: 0.08
+  Getopt::Long: 0
+  Pod::Usage: 0
+  DBD::SQLite: 0
 build_requires:
-  Test::More: 0.48
+  Test::More: 0.61
 recommends:
   AxKit: 1.61
-  Catalyst: 5.5
-  Class::DBI: 3.0.12
-  Data::FormValidator: 4.00
+  Catalyst::Runtime: 5.7001
+  Catalyst::Devel: 1.0
   HTML::FillInForm: 1.04
-  Finance-Currency-Convert-WebserviceX: 0.03
-  Locale::Currency::Format: 1.22
-  Locale::Currency: 2.07
   Pod::Coverage: 0.14
   Template: 2.14
+  YAML: 0.58
   Test::Pod: 1.00
   Test::Pod::Coverage: 1.04
   Test:Strict: 0.05
   Test::Spelling: 0.10
+  Test::NoTabs: 0.01
+  Test::Perl::Critic: 0.07
+  Test::CheckManifest: 0.07
+  Test::MockObject: 1.07
 no_index:
   directory:
     - demo
     - sql
 distribution_type: module
 generated_by: ExtUtils::MakeMaker version 6.17
+meta-spec:
+  url: http://module-build.sourceforge.net/META-spec-v1.2.html
+  version: 1.2</diff>
      <filename>META.yml</filename>
    </modified>
    <modified>
      <diff>@@ -1,47 +1,31 @@
 # $Id$
 use ExtUtils::MakeMaker;
-use 5.006;
+use 5.008001;
 use strict;
 use warnings FATAL =&gt; 'all';
 
 require Test::More;
-if (Test::More-&gt;VERSION &lt; 0.48) {
+if (Test::More-&gt;VERSION &lt; 0.60) {
     print &quot;\a\a\a\a\a&quot;;
     print &quot;----------------------------------------------------------\n&quot;;
-    print &quot;Test::More &lt; 0.48 sometimes causes test failures with\n&quot;;
-    print &quot;Class::DBI/IMA::DBI. Please consider updating Test::More\n&quot;;
-    print &quot;to version 0.48 or greater if you experience test failures\n&quot;;
-    print &quot;with 'attempt to free unreferenced scalar' errors.\n&quot;;
+    print &quot;Test::More &lt; 0.61 sometimes causes test failures with\n&quot;;
+    print &quot;when comparing strigified DateTime objects.\n&quot;;
+    print &quot;Please consider updating Test::More to version 0.61\n&quot;;
+    print &quot;or greater if you experience test failures.\n&quot;;
     print &quot;----------------------------------------------------------\n&quot;;
     sleep 5;
 };
 
-eval 'require Handel';
-if (!$@ &amp;&amp; Handel-&gt;VERSION eq '0.17') {
-    print &quot;\a\a\a\a\a&quot;;
-    print &quot;----------------------------------------------------------\n&quot;;
-    print &quot;BREAKING API CHANGES!!!!\n\n&quot;;
-    print &quot;Handel::Order &gt;= 0.18 is incompatable with Handel::Order\n&quot;;
-    print &quot;version 0.17 only. Earlier versions of Handel without\n&quot;;
-    print &quot;Handel::Order are not effected.\n&quot;;
-    print &quot;----------------------------------------------------------\n&quot;;
-    sleep 5;
-};
-
-my %modules;
-
-if ($^O eq 'MSWin32') {
-    eval 'use UUID 0.02;';
-    eval 'use Win32::Guidgen 0.02;' if $@;
-    eval 'use Win32API::GUID 0.02;' if $@;
-
-    %modules = ('UUID' =&gt; 0.02) if $@;
-} else {
-    %modules = ('Data::UUID' =&gt; 0.10);
-};
-if ($^O ne 'openbsd' &amp;&amp; eval {require APR::UUID}) {
-    %modules = ();
-};
+#eval 'require Handel';
+#if (!$@ &amp;&amp; $Handel::VERSION &lt;= '1.00') {
+#    print &quot;\a\a\a\a\a&quot;;
+#    print &quot;----------------------------------------------------------\n&quot;;
+#    print &quot;BREAKING API CHANGES!!!!\n\n&quot;;
+#    print &quot;Handel 1.0+ is not API compatable with Handel &lt;= 0.32.\n&quot;;
+#    print &quot;Please read the documentation for further details.\n&quot;;
+#    print &quot;----------------------------------------------------------\n&quot;;
+#    sleep 5;
+#};
 
 if ($ENV{TEST_HTTP}) {
     eval 'use Apache::Test 1.27';
@@ -75,44 +59,59 @@ if ($ENV{TEST_HTTP}) {
 
 my @clean = qw(
     smoke-report-*
-    t/cart*.db
-    t/order*.db
-    t/checkout*.db
-    t/subclassing.db
     t/TEST
     t/SMOKE
     t/logs
-    t/htdocs/*.db
-    t/TestApp
     t/conf/apache_test_config.pm
     t/conf/extra.conf
     t/conf/httpd.conf
     t/conf/modperl_inc.pl
     t/conf/modperl_startup.pl
     t/htdocs/index.html
+    t/var
 );
 
 WriteMakefile(
     NAME         =&gt; 'Handel',
     VERSION_FROM =&gt; 'lib/Handel.pm',
     AUTHOR       =&gt; 'Christopher H. Laco &lt;claco@chrislaco.com&gt;',
-    ABSTRACT     =&gt; 'Simple ecommerce framework with AxKit support',
+    ABSTRACT     =&gt; 'A cart/order/checkout framework with AxKit/TT/Catalyst support',
     PREREQ_PM    =&gt; {
-        'Class::DBI'        =&gt; '0.96',
-        'Class::Data::Inheritable' =&gt; '0',
-        'DBI'               =&gt; '1.36',
-        'Error'             =&gt; '0.14',
-        'Locale::Maketext'  =&gt; '1.06',
-        'Module::Pluggable' =&gt; '2.95',
-        'version'           =&gt; '0',
-        %modules
+        'DBIx::Class'              =&gt; '0.08000',
+        'DBIx::Class::UUIDColumns' =&gt; '0.01',
+        'DBIx::Class::Validation'  =&gt; '0.01001',
+        'Data::Currency'           =&gt; '0.03',
+        'Class::Accessor::Grouped' =&gt; '0.03',
+        'Class::ISA'               =&gt; '0',
+        'Class::Inspector'         =&gt; '0',
+        'Clone'                    =&gt; '0',
+        'Error'                    =&gt; '0.14',
+        'Locale::Maketext'         =&gt; '1.06',
+        'Module::Pluggable'        =&gt; '3.1',
+        'Module::Starter'          =&gt; '1.42',
+        'Scalar::Util'             =&gt; '0',
+        'Tie::Hash'                =&gt; '0',
+        'DateTime'                 =&gt; '0',
+        'DateTime::Format::MySQL'  =&gt; '0',
+        'Locale::Currency'         =&gt; '2.07',
+        'Locale::Currency::Format' =&gt; '1.22',
+        'FormValidator::Simple'    =&gt; '0.17',
+        'Finance::Currency::Convert::WebserviceX' =&gt; '0.03',
+        'NEXT'                     =&gt; '0',
+        'FileHandle'               =&gt; '0',
+        'File::Spec::Functions'    =&gt; '0',
+        'File::Path'               =&gt; '0',
+        'SQL::Translator'          =&gt; '0.08',
+        'Getopt::Long'             =&gt; '0',
+        'Pod::Usage'               =&gt; '0',
+        'DBD::SQLite'              =&gt; '0',
     },
-    (ExtUtils::MakeMaker-&gt;VERSION &gt;= 6.11) ?
-    (NO_META      =&gt; 1) : (),
-
+    EXE_FILES =&gt; [
+        'script/handel.pl'
+    ],
+    NO_META =&gt; 1,
     dist =&gt; {
         PREOP =&gt; 'pod2text lib/Handel.pm &gt; $(DISTVNAME)/README',
     },
-    clean =&gt; { FILES =&gt; join ' ', @clean },
-    test  =&gt; { TESTS =&gt; join ' ', (glob(&quot;t/*.t&quot;))}
+    clean =&gt; { FILES =&gt; join ' ', @clean }
 );</diff>
      <filename>Makefile.PL</filename>
    </modified>
    <modified>
      <diff>@@ -1,181 +1,35 @@
 NAME
-    Handel - Simple commerce framework with AxKit/TT/Catalyst support
+    Handel - A cart/order/checkout framework with AxKit/TT/Catalyst support
 
-DESCRIPTION
-    Handel is a quick and not-so-dirty ecommerce framework with AxKit taglib
-    support and TT2 (Template Toolkit) support. It was started for the
-    conversion of an IIS/ASP based commerce site to Apache/ModPerl, but I
-    decided that is might be useful to others so here it is on CPAN.
-
-    For the curious, Handel is German for commerce.
-
-WEBSITE
-    You can get the latest news, source, documentation and wiki help at
-    http://handelframework.com/.
-
-MAILING LIST
-    Join the mailing list at
-    http://lists.rawmode.org/cgi-bin/mailman/listinfo/handel. Big thanks to
-    gabb@#catalyst for the list space.
-
-GOALS
-    Database agnostic. Thanks to Class::DBI and staying away from auto
-    incrementing ids, Handel should run in any database that Class::DBI
-    supports.
-    Implementation agnostic. Handel should be able to be used from the
-    command line, from a web page, from a SOAP service, or from a GUI
-    application. It's simply a data access mechanism. Any interaction with
-    forms, web pages, browser, cookies, etc is the responsibility of the
-    consumer
-    Checkout agnostic. A checkout process means different things to
-    different people in different situations. The Handel checkout pipeline
-    by itself does absolutely nothing with an order. It is instead a plugin
-    manager that allows you to specify and build plugins to do various
-    actions (payment authorization, address validation, fax delivery, etc).
-    Each site, server, page, even process() call can have it's own unique
-    order processing pipeline.
-    Easy integration into AxKit using taglibs.
-    Easy integration into TT2 using plugins.
-    Easy integration into Catalyst using plugins.
-    Easy integration into other systems using SOAP.
-    Feature complete demo site in AxKit.
-    Feature complete demo site in TT2.
-    Feature complete demo site in Catalyst.
-    Public Subversion repository.
-    Public Wiki/Docs site.
-    Get someone to actually use the damn thing. :-)
-    Abstract schema into SQL::Translator scripts
-
-WHAT HANDEL IS
-    Simple cart and order record maintenance.
-    Plugin based checkout pipeline processing framework.
-
-WHAT HANDEL ISN'T
-    Intershop, Cart32, WebGUI, CMS, complete web commerce package(1). Handel
-    is a simple framework to load/upload cart/order data and shove that data
-    through a plugin based pipeline.
-    (1) While it is not a complete web based commerce system, I do plan on
-    having feature complete working demos sites so people can still
-    quick-start their own projects.
-
-FEATURES
-    Add/Update/Delete/Save/Restore Cart Contents
-    Full AxKit XSP Taglib Support
-    Template Toolkit 2 Plugin Support
-    Currency Conversion
-    Currency Formatting
-    Basic Localization Support
-    Multiple Database Support
-
-REQUIREMENTS
-  Prerequisites
-    The following modules are required for Handel to work properly. Older
-    versions may work fine, but these are the versions I have installed and
-    verified to work correctly. If you have older versions and all tests
-    pass, send me an email and I'll lower the version requirements.
-
-    Class::DBI
-        &quot;Class::DBI&quot; version 0.96 or greater.
-
-    DBI &quot;DBI&quot; version 1.36 or greater.
-
-    Error
-        &quot;Error&quot; version 0.14 or greater.
-
-    Locale::Maketext
-        &quot;Locale::Maketext&quot; version 1.06 or greater.
-
-    Data::UUID
-        At least one of the following modules are required to create uuids:
-        &quot;UUID&quot; 0.02, &quot;Win32::Guidgen&quot; 0.04, &quot;Win32API::GUID&quot; 0.02, or
-        &quot;Data::UUID&quot; 0.10.
-
-  Optional Modules
-    The following modules are not required for Handel to run, although some
-    features may be unavailable without them.
-
-    AxKit
-        &quot;AxKit&quot; version 1.61 or greater.
-
-        &quot;AxKit&quot; is only required if you plan on using &quot;Handel&quot; within XSP
-        using the supplied taglibs.
+SYNOPSIS
+        use Handel;
+        Handel-&gt;config_class('My::ConfigReader');
+    
+        my $config = Handel-&gt;config;
+        # $config-&gt;isa('My::ConfigReader')
 
-    Locale::Currency::Format
-        &quot;Locale::Currency::Format&quot; version 1.22 or greater.
-
-        When present, this module allows all prices to be formatted to
-        specific currency codes and formats.
-
-    Finance::Currency::Convert::WebserviceX
-        &quot;Finance::Currency::Convert::WebserviceX&quot; version 0.03 or greater.
-
-        When present, this module allows all prices to be converted from one
-        currency to another.
-
-    Locale::Currency
-        &quot;Locale::Currency&quot; version 2.07 or greater.
-
-        When present, this module allows all conversion and currency codes
-        to be verified as real 3 letter ISO currency codes.
-
-    Template
-        &quot;Template&quot; version 2.07 or greater.
-
-        &quot;Template&quot; (TT2/Template ToolKit) is only required if you plan on
-        using Handel within TT2 based websites.
-
-  Build/Test Modules
-    The following modules are only required for the test suite when running
-    &quot;make test&quot;.
-
-    Test::More
-        &quot;Test::More&quot; version 0.48 or greater.
-
-        The &quot;Test::More&quot; included with perl 5.8.4 and &quot;Test::More&quot; &lt;= 0.48
-        have issues with ithreads that usually cause crashes in tests that
-        use &quot;Class::DBI&quot; or &quot;DBIx:ContextualFetch&quot;. The errors usual mention
-        &quot;attempt to free unreferenced scalar&quot;. If you receive these during
-        &quot;make test&quot;, try upgrading &quot;Test::More&quot;.
-
-    Pod::Coverage
-        &quot;Pod::Coverage&quot; version 0.14 or greater.
-
-        The pod coverage tests may fail complaining about missing pod for
-        methods if Pod::Coverage &lt; 0.14 is installed. This is due to certain
-        syntax variations of the pod with escaped gt/lt. I may just alter
-        the pod and bump this version down if there is enough feedback to do
-        so.
-
-    Test::Pod
-        &quot;Test::Pod&quot; version 1.00 or greater.
-
-        &quot;Test::Pod&quot; 1.00 added the &quot;all_pod_files_ok()&quot; method which makes
-        my life easier. :-)
-
-    Test::Pod::Coverage
-        &quot;Test::Pod::Coverage&quot; version 1.04 or greater.
+DESCRIPTION
+    This is a generic class containing the default configuration used by
+    other Handel classes.
 
-        &quot;Test::Pod::Coverage&quot; 1.04 was made taint safe, and we run the tests
-        with -wT like good girls and boys.
+    To learn more about what Handel is and how it works, take a look at the
+    manual.
 
-    Test:Strict
-        &quot;Test::Strict&quot; version 0.01 or greater.
+METHODS
+  config_class
+    Arguments: $config_class
 
-        This keeps me honest and makes sure I always &quot;use strict&quot;.
+    Gets/sets the name of the configuration class to use. The default
+    configuration class is Handel::ConfigReader.
 
-CAVEATS
-    When using item_class to specify the item class returned from add/items
-    in your subclass under Class::DBI &lt; 3.0.8, the item_class specified will
-    be returned from all cart classes, including Handel::Cart itself. In
-    most cases, people are only using one subclass of Handel::Cart so this
-    won't effect them.
+    A Handel::Exception exception will be thrown if the specified class can
+    not be loaded.
 
-    If you plan on using multiple subclasses of Handel::Cart that may or may
-    not return custom items, upgrade your Class::DBI to version 3.0.8 or
-    greater.
+  config
+    Returns an instance of the specified configuration class.
 
 SEE ALSO
-    Handel::Cart
+    Handel::Cart, Handel::Order, Handel::Checkout
 
 AUTHOR
         Christopher H. Laco</diff>
      <filename>README</filename>
    </modified>
    <modified>
      <diff>@@ -1,12 +1,13 @@
 TODO list for Perl module Handel (in no particular order):
 
-    - create sql from SQL::Translator schema scripts
+    - Handel::Checkout new/add_handler needs opto/memoization
+    - Handel::Order needs to set updated field automagically
+    - Update create_accessors to take an accessor_map/ro/wo/rw
+    - AxKit Tablibs need reworked for subclassing
+    - TT plugins need reworked for subclassing
     - add taglib test to check for bogus filter names
-    - add sql schema and conversions using SQL::Translator
     - enhance demo sites to use full feature set
     - slim taglib code to remove repeated code blocks left for clarity
     - find translation volunteer other than Google translate
     - clean up cart test variable names
     - add additional cart restore w/filter tests for multiple saved carts
-    - devise method for overriding constraints
-    - abstract DBI layer to use Class::DBI, DBIx::CDBICompat, or DBIx::Class</diff>
      <filename>Todo</filename>
    </modified>
    <modified>
      <diff>@@ -19,3 +19,6 @@ in your existing httpd.conf file like so:
 
 Don't forget to change DocumentRoot, ErrorLog, db_name and 'use lib' to
 match your system configuration and the installation of Handel.
+
+NOTE: This is for demo purposes only. THe preferred way to use Handel in a
+web application is using Catalyst.</diff>
      <filename>demo/tt2/README</filename>
    </modified>
    <modified>
      <diff>@@ -11,13 +11,13 @@
 		[% CGI.header('-cookie', cookie) %]
 	[% END %]
 
-	[% UNLESS Handel.Cart.fetch({shopper =&gt; shopper, type =&gt; 0}) %]
+	[% UNLESS Handel.Cart.search({shopper =&gt; shopper, type =&gt; 0}).count %]
 		[% UNLESS Handel.Cart.create({shopper =&gt; shopper}) %]
 			&lt;p class=&quot;error&quot;&gt;Could not create new shopping cart.&lt;/p&gt;
 		[% END %]
 	[% END %]
 
-	[% FOREACH cart IN Handel.Cart.fetch({shopper =&gt; shopper, type =&gt; 0}) %]
+	[% FOREACH cart IN Handel.Cart.search({shopper =&gt; shopper, type =&gt; 0}).first %]
 		[% IF CGI.param('action') == 'add' %]
 			[% CALL cart.add(
 				sku=CGI.param('sku'),
@@ -28,7 +28,7 @@
 		[% ELSIF CGI.param('action') == 'delete' %]
 			[% CALL cart.delete(id=CGI.param('id')) %]
 		[% ELSIF CGI.param('action') == 'update' %]
-			[% item = cart.items(id=CGI.param('id')) %]
+			[% item = cart.items(id=CGI.param('id')).first %]
 			[% IF item %]
 				[% CALL item.quantity(CGI.param('quantity')) %]
 				[% CALL item.update %]
@@ -45,7 +45,8 @@
 					&lt;th&gt;Total&lt;/th&gt;
 					&lt;th&gt;&lt;/th&gt;
 				&lt;/tr&gt;
-				[% FOREACH item = cart.items %]
+				[% items = cart.items %]
+				[% WHILE (item = items.next) %]
 					&lt;tr&gt;
 						&lt;td&gt;
 							&lt;a href=&quot;products.tt2#[% item.sku %]&quot; title=&quot;Read</diff>
      <filename>demo/tt2/cart.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -17,8 +17,7 @@ Listen 9002
 
 	TT2Trim			On
 	TT2IncludePath	C:\Development\CPAN\Handel\demo\tt2\includes
-	PerlSetVar		HandelDBIName	C:\Development\CPAN\Handel\demo\handel.db
-	PerlSetVar		HandelDBIDriver	&quot;SQLite&quot;
+	PerlSetVar		HandelDBIDSN	dbi:SQLite:dbname=C:\Development\CPAN\Handel\t\var\handel.db
 
 	&lt;Files *.tt2&gt;
         SetHandler	perl-script</diff>
      <filename>demo/tt2/httpd.conf.include</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,5 @@
 # $Id$
+## no critic
 package AxKit::XSP::Handel::Cart;
 use strict;
 use warnings;
@@ -148,7 +149,7 @@ BEGIN {
 my @context = 'root';
 
 sub start_document {
-    return &quot;use Handel::Cart;\n&quot;;
+    return &quot;use Handel::Cart;\nuse Handel::Compat::Currency;use Handel::Currency;\n&quot;;
 };
 
 sub quoted_text {
@@ -171,7 +172,7 @@ sub uuid_start {
     my ($e, $tag, %attr) = @_;
 
     $e-&gt;start_expr($tag);
-    $e-&gt;append_to_script(&quot;Handel::Cart-&gt;uuid&quot;);
+    $e-&gt;append_to_script(&quot;Handel::Cart-&gt;storage-&gt;new_uuid&quot;);
     $e-&gt;end_expr($tag);
 
     return;
@@ -181,8 +182,8 @@ sub new_start {
     my ($e, $tag, %attr) = @_;
 
     throw Handel::Exception::Taglib(
-        -text =&gt; translate(&quot;Tag '[_1]' not valid inside of other Handel tags&quot;, $tag)
-    ) if ($context[$#context] ne 'root');
+        -text =&gt; translate('TAG_NOT_ALLOWED_IN_OTHERS', $tag)
+    ) if ($context[-1] ne 'root');
 
     push @context, $tag;
 
@@ -234,14 +235,14 @@ sub new_results_start {
     my ($e, $tag, %attr) = @_;
 
     throw Handel::Exception::Taglib(
-        -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-    ) if ($context[$#context] !~ /^(new|add|cart(s?)|item(s?))$/);
+        -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+    ) if ($context[-1] !~ /^(new|add|cart(s?)|item(s?))$/);
 
     push @context, $tag;
 
     return '
         if (!$_xsp_handel_cart_called_new &amp;&amp; scalar keys %_xsp_handel_cart_new_filter) {
-            $_xsp_handel_cart_cart = Handel::Cart-&gt;new(\%_xsp_handel_cart_new_filter);
+            $_xsp_handel_cart_cart = Handel::Cart-&gt;create(\%_xsp_handel_cart_new_filter);
             $_xsp_handel_cart_called_new = 1;
         };
         if ($_xsp_handel_cart_cart) {
@@ -365,14 +366,14 @@ sub new_results_shopper_start {
         ## cart:uuid
         if ($tag =~ /^(g|u)uid$/) {
             $e-&gt;start_expr($tag);
-            $e-&gt;append_to_script(&quot;Handel::Cart-&gt;uuid&quot;);
+            $e-&gt;append_to_script(&quot;Handel::Cart-&gt;storage-&gt;new_uuid&quot;);
             $e-&gt;end_expr($tag);
 
         ## cart:new
         } elsif ($tag eq 'new') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of other Handel tags&quot;, $tag)
-            ) if ($context[$#context] ne 'root');
+                -text =&gt; translate('TAG_NOT_ALLOWED_IN_OTHERS', $tag)
+            ) if ($context[-1] ne 'root');
 
             push @context, $tag;
 
@@ -387,8 +388,8 @@ sub new_results_shopper_start {
         ## cart:restore
         } elsif ($tag eq 'restore') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of tag '&quot; . $context[$#context] . &quot;'&quot;, $tag)
-            ) if ($context[$#context] =~ /^(cart(s?))$/);
+                -text =&gt; translate('Tag [_1] not valid inside of tag [_2]', $tag, $context[-1])
+            ) if ($context[-1] =~ /^(cart(s?))$/);
 
             push @context, $tag;
 
@@ -404,8 +405,8 @@ sub new_results_shopper_start {
         ## cart:cart
         } elsif ($tag eq 'cart') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of other Handel tags&quot;, $tag)
-            ) if ($context[$#context] ne 'root');
+                -text =&gt; translate('TAG_NOT_ALLOWED_IN_OTHERS', $tag)
+            ) if ($context[-1] ne 'root');
 
             push @context, $tag;
 
@@ -420,8 +421,8 @@ sub new_results_shopper_start {
         ## cart:carts
         } elsif ($tag eq 'carts') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of other Handel tags&quot;, $tag)
-            ) if ($context[$#context] ne 'root');
+                -text =&gt; translate('TAG_NOT_ALLOWED_IN_OTHERS', $tag)
+            ) if ($context[-1] ne 'root');
 
             push @context, $tag;
 
@@ -436,8 +437,8 @@ sub new_results_shopper_start {
         ## cart:item
         } elsif ($tag eq 'item') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of tag '&quot; . $context[$#context] . &quot;'&quot;, $tag)
-            ) if ($context[$#context] =~ /^(cart(s?))$/);
+                -text =&gt; translate('Tag [_1] not valid inside of tag [_2]', $tag, $context[-1])
+            ) if ($context[-1] =~ /^(cart(s?))$/);
 
             push @context, $tag;
 
@@ -452,8 +453,8 @@ sub new_results_shopper_start {
         ## cart:items
         } elsif ($tag eq 'items') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of tag '&quot; . $context[$#context] . &quot;'&quot;, $tag)
-            ) if ($context[$#context] =~ /^(cart(s?))$/);
+                -text =&gt; translate('Tag [_1] not valid inside of tag [_2]', $tag, $context[-1])
+            ) if ($context[-1] =~ /^(cart(s?))$/);
 
             push @context, $tag;
 
@@ -468,8 +469,8 @@ sub new_results_shopper_start {
         ## cart:clear
         } elsif ($tag eq 'clear') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] ne 'results' || $context[$#context-1] !~ /^(cart(s?))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] ne 'results' || $context[-2] !~ /^(cart(s?))$/);
 
            return &quot;\n\$_xsp_handel_cart_cart-&gt;clear;\n&quot;;
 
@@ -477,8 +478,8 @@ sub new_results_shopper_start {
         ## cart:add
         } elsif ($tag eq 'add') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] ne 'results' || $context[$#context-1] !~ /^(new|cart(s?))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] ne 'results' || $context[-2] !~ /^(new|cart(s?))$/);
 
             push @context, $tag;
 
@@ -493,14 +494,14 @@ sub new_results_shopper_start {
         ## cart:update
         } elsif ($tag eq 'update') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] ne 'results' || $context[$#context-1] !~ /^((cart(s?)|item(s?)))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] ne 'results' || $context[-2] !~ /^((cart(s?)|item(s?)))$/);
 
             push @context, $tag;
 
-            if ($context[$#context-2] =~ /^(cart(s?))$/) {
+            if ($context[-3] =~ /^(cart(s?))$/) {
                 return &quot;\n\$_xsp_handel_cart_cart-&gt;autoupdate(0);\n&quot;;
-            } elsif ($context[$#context-2] =~ /^(item(s?))$/) {
+            } elsif ($context[-3] =~ /^(item(s?))$/) {
                 return &quot;\n\$_xsp_handel_cart_item-&gt;autoupdate(0);\n&quot;;
             };
 
@@ -509,8 +510,8 @@ sub new_results_shopper_start {
 
         } elsif ($tag eq 'save') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context-1] !~ /^(cart(s?))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-2] !~ /^(cart(s?))$/);
 
             return '
                 $_xsp_handel_cart_cart-&gt;save;
@@ -520,8 +521,8 @@ sub new_results_shopper_start {
         ## cart:delete
         } elsif ($tag eq 'delete') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] ne 'results' || $context[$#context-1] !~ /^(cart(s?))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] ne 'results' || $context[-2] !~ /^(cart(s?))$/);
 
             push @context, $tag;
 
@@ -535,11 +536,11 @@ sub new_results_shopper_start {
         ## cart property tags
         ## cart:description, id, name, shopper, type, count, subtotal
         } elsif ($tag =~ /^(description|id|name|shopper|type|count|subtotal)$/) {
-            if ($context[$#context] eq 'new' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
+            if ($context[-1] eq 'new' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
                 return &quot;\n\$_xsp_handel_cart_new_filter{$tag} = ''&quot;;
-            } elsif ($context[$#context] eq 'add' &amp;&amp; $tag =~ /^(id|description)$/) {
+            } elsif ($context[-1] eq 'add' &amp;&amp; $tag =~ /^(id|description)$/) {
                 return &quot;\n\$_xsp_handel_cart_add_filter{$tag} = ''&quot;;
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] =~ /^(new|cart(s?))$/) {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] =~ /^(new|cart(s?))$/) {
                 $e-&gt;start_expr($tag);
 
                 if ($tag eq 'subtotal' &amp;&amp; ($attr{'format'} || $attr{'convert'})) {
@@ -552,32 +553,34 @@ sub new_results_shopper_start {
                     AxKit::Debug(5, &quot;[Handel] [Cart] [$tag] code=$code, format=$format, from=$from, to=$to&quot;);
 
                     if ($attr{'convert'}) {
-                        $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_cart-&gt;$tag-&gt;convert('$from', '$to', '&quot;.($attr{'format'}||'').&quot;', '$format');\n&quot;);
+                        $e-&gt;append_to_script(&quot;Handel::Compat::Currency::convert(Handel::Compat::Currency-&gt;new(\$_xsp_handel_cart_cart-&gt;$tag-&gt;value), '$from', '$to', '&quot;.($attr{'format'}||'').&quot;', '$format');\n&quot;);
                     } elsif ($attr{'format'}) {
-                        $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_cart-&gt;$tag-&gt;format('$code', '$format');\n&quot;);
+                        $e-&gt;append_to_script(&quot;Handel::Compat::Currency::format(Handel::Compat::Currency-&gt;new(\$_xsp_handel_cart_cart-&gt;$tag-&gt;value), '$code', '$format');\n&quot;);
                     };
+                } elsif ($tag eq 'subtotal') {
+                    $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_cart-&gt;$tag-&gt;value;\n&quot;);
                 } else {
                     $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_cart-&gt;$tag;\n&quot;);
                 };
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'item') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'item') {
                 $e-&gt;start_expr($tag);
                 $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_item-&gt;$tag;\n&quot;);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'items') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'items') {
                 $e-&gt;start_expr($tag);
                 $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_item-&gt;$tag;\n&quot;);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'add') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'add') {
                 $e-&gt;start_expr($tag);
                 $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_item-&gt;$tag;\n&quot;);
-            } elsif ($context[$#context] eq 'delete' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
+            } elsif ($context[-1] eq 'delete' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
                 return &quot;\n\$_xsp_handel_cart_delete_filter{$tag} = ''&quot;;
-            } elsif ($context[$#context] eq 'update') {
+            } elsif ($context[-1] eq 'update') {
                 throw Handel::Exception::Taglib(
-                    -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
+                    -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
                 ) if ($tag eq 'id');
 
-                if ($context[$#context-2] =~ /^(cart(s?))$/) {
+                if ($context[-3] =~ /^(cart(s?))$/) {
                     return &quot;\n\$_xsp_handel_cart_cart-&gt;$tag(''&quot;;
-                } elsif ($context[$#context-2] =~ /^(item(s?))$/) {
+                } elsif ($context[-3] =~ /^(item(s?))$/) {
                     return &quot;\n\$_xsp_handel_cart_item-&gt;$tag(''&quot;;
                 };
             };
@@ -586,12 +589,12 @@ sub new_results_shopper_start {
         ## cart item property tags
         ## cart:sku, price, quantity, total
         } elsif ($tag =~ /^(sku|price|quantity|total)$/) {
-            if ($context[$#context] eq 'add' &amp;&amp; $tag ne 'total') {
+            if ($context[-1] eq 'add' &amp;&amp; $tag ne 'total') {
                 return &quot;\n\$_xsp_handel_cart_add_filter{$tag} = ''&quot;;
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'add') {
-                $e-&gt;start_expr($tag);
-                $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_item-&gt;$tag;\n&quot;);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] =~ /^item(s?)$/) {
+            #} elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'add') {
+            #    $e-&gt;start_expr($tag);
+            #    $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_item-&gt;$tag;\n&quot;);
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] =~ /^(item(s?)|add)$/) {
                 $e-&gt;start_expr($tag);
 
                 if ($tag =~ /^(price|total)$/ &amp;&amp; ($attr{'format'} || $attr{'convert'})) {
@@ -604,19 +607,21 @@ sub new_results_shopper_start {
                     AxKit::Debug(5, &quot;[Handel] [Cart] [$tag] code=$code, format=$format, from=$from, to=$to&quot;);
 
                     if ($attr{'convert'}) {
-                        $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_item-&gt;$tag-&gt;convert('$from', '$to', '&quot;.($attr{'format'}||'').&quot;', '$format');\n&quot;);
+                        $e-&gt;append_to_script(&quot;Handel::Compat::Currency::convert(Handel::Compat::Currency-&gt;new(\$_xsp_handel_cart_item-&gt;$tag-&gt;value), '$from', '$to', '&quot;.($attr{'format'}||'').&quot;', '$format');\n&quot;);
                     } elsif ($attr{'format'}) {
-                        $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_item-&gt;$tag-&gt;format('$code', '$format');\n&quot;);
+                        $e-&gt;append_to_script(&quot;Handel::Compat::Currency::format(Handel::Compat::Currency-&gt;new(\$_xsp_handel_cart_item-&gt;$tag-&gt;value), '$code', '$format');\n&quot;);
                     };
+                } elsif ($tag =~ /^(price|total)$/) {
+                    $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_item-&gt;$tag-&gt;value;\n&quot;);
                 } else {
                     $e-&gt;append_to_script(&quot;\$_xsp_handel_cart_item-&gt;$tag;\n&quot;);
                 };
-            } elsif ($context[$#context] eq 'delete') {
+            } elsif ($context[-1] eq 'delete') {
                 return &quot;\n\$_xsp_handel_cart_delete_filter{$tag} = ''&quot;;
-            } elsif ($context[$#context] eq 'update') {
-                if ($context[$#context-2] =~ /^(cart(s?))$/) {
+            } elsif ($context[-1] eq 'update') {
+                if ($context[-3] =~ /^(cart(s?))$/) {
                     return &quot;\n\$_xsp_handel_cart_cart-&gt;$tag(''&quot;;
-                } elsif ($context[$#context-2] =~ /^(item(s?))$/) {
+                } elsif ($context[-3] =~ /^(item(s?))$/) {
                     return &quot;\n\$_xsp_handel_cart_item-&gt;$tag(''&quot;;
                 };
             };
@@ -626,15 +631,15 @@ sub new_results_shopper_start {
         } elsif ($tag eq 'filter') {
             my $key = $attr{'name'} || 'id';
 
-            if ($context[$#context] eq 'cart') {
+            if ($context[-1] eq 'cart') {
                 return &quot;\n\$_xsp_handel_cart_load_filter{'$key'} = ''&quot;;
-            } elsif ($context[$#context] eq 'carts') {
+            } elsif ($context[-1] eq 'carts') {
                 return &quot;\n\$_xsp_handel_carts_load_filter{'$key'} = ''&quot;;
-            } elsif ($context[$#context] eq 'item') {
+            } elsif ($context[-1] eq 'item') {
                 return &quot;\n\$_xsp_handel_cart_item_filter{'$key'} = ''&quot;;
-            } elsif ($context[$#context] eq 'items') {
+            } elsif ($context[-1] eq 'items') {
                 return &quot;\n\$_xsp_handel_cart_items_filter{'$key'} = ''&quot;;
-            } elsif ($context[$#context] eq 'restore') {
+            } elsif ($context[-1] eq 'restore') {
                 return &quot;\n\$_xsp_handel_cart_restore_filter{'$key'} = ''&quot;;
             };
 
@@ -642,65 +647,65 @@ sub new_results_shopper_start {
         ## cart:results
         } elsif ($tag =~ /^result(s?)$/) {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] !~ /^(new|add|cart(s?)|item(s?))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] !~ /^(new|add|cart(s?)|item(s?))$/);
 
             push @context, $tag;
 
-            if ($context[$#context-1] eq 'new') {
+            if ($context[-2] eq 'new') {
                 return '
                     if (!$_xsp_handel_cart_called_new &amp;&amp; scalar keys %_xsp_handel_cart_new_filter) {
-                        $_xsp_handel_cart_cart = Handel::Cart-&gt;new(\%_xsp_handel_cart_new_filter);
+                        $_xsp_handel_cart_cart = Handel::Cart-&gt;create(\%_xsp_handel_cart_new_filter);
                         $_xsp_handel_cart_called_new = 1;
                     };
                     if ($_xsp_handel_cart_cart) {
 
                 ';
-            } elsif ($context[$#context-1] eq 'cart') {
+            } elsif ($context[-2] eq 'cart') {
                 return '
                     if (!$_xsp_handel_cart_called_load) {
                         $_xsp_handel_cart_cart = (scalar keys %_xsp_handel_cart_load_filter) ?
-                            Handel::Cart-&gt;load(\%_xsp_handel_cart_load_filter, 1)-&gt;next :
-                            Handel::Cart-&gt;load(undef, 1)-&gt;next;
+                            Handel::Cart-&gt;search(\%_xsp_handel_cart_load_filter)-&gt;next :
+                            Handel::Cart-&gt;search-&gt;next;
                             $_xsp_handel_cart_called_load = 1;
                     };
                     if ($_xsp_handel_cart_cart) {
 
                 ';
-            } elsif ($context[$#context-1] eq 'carts') {
+            } elsif ($context[-2] eq 'carts') {
                 return '
                     if (!$_xsp_handel_carts_called_load) {
                         @_xsp_handel_cart_carts = (scalar keys %_xsp_handel_carts_load_filter) ?
-                            Handel::Cart-&gt;load(\%_xsp_handel_carts_load_filter) :
-                            Handel::Cart-&gt;load();
+                            Handel::Cart-&gt;search(\%_xsp_handel_carts_load_filter) :
+                            Handel::Cart-&gt;search;
                             $_xsp_handel_carts_called_load = 1;
                     };
                     foreach my $_xsp_handel_cart_cart (@_xsp_handel_cart_carts) {
 
                 ';
-            } elsif ($context[$#context-1] eq 'item') {
+            } elsif ($context[-2] eq 'item') {
                 return '
                     if (!$_xsp_handel_cart_called_item) {
                         $_xsp_handel_cart_item = (scalar keys %_xsp_handel_cart_item_filter) ?
-                            $_xsp_handel_cart_cart-&gt;items(\%_xsp_handel_cart_item_filter, 1)-&gt;next :
-                            $_xsp_handel_cart_cart-&gt;items(undef, 1)-&gt;next;
+                            $_xsp_handel_cart_cart-&gt;items(\%_xsp_handel_cart_item_filter)-&gt;next :
+                            $_xsp_handel_cart_cart-&gt;items-&gt;next;
                             $_xsp_handel_cart_called_item = 1;
                     };
                     if ($_xsp_handel_cart_item) {
 
                 ';
-            } elsif ($context[$#context-1] eq 'items') {
+            } elsif ($context[-2] eq 'items') {
                 return '
                     if (!$_xsp_handel_cart_called_items) {
                         @_xsp_handel_cart_items = (scalar keys %_xsp_handel_cart_items_filter) ?
                             $_xsp_handel_cart_cart-&gt;items(\%_xsp_handel_cart_items_filter) :
-                            $_xsp_handel_cart_cart-&gt;items();
+                            $_xsp_handel_cart_cart-&gt;items;
                             $_xsp_handel_cart_called_items = 1;
                     };
                     foreach my $_xsp_handel_cart_item (@_xsp_handel_cart_items) {
 
                 ';
-            } elsif ($context[$#context-1] eq 'add') {
+            } elsif ($context[-2] eq 'add') {
                 return '
                     if (!$_xsp_handel_cart_called_add &amp;&amp; scalar keys %_xsp_handel_cart_add_filter) {
                         $_xsp_handel_cart_item = $_xsp_handel_cart_cart-&gt;add(\%_xsp_handel_cart_add_filter);
@@ -715,60 +720,60 @@ sub new_results_shopper_start {
         ## cart:no-results
         } elsif ($tag =~ /^no-result(s?)$/) {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] !~ /^(new|add|cart(s?)|item(s?))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] !~ /^(new|add|cart(s?)|item(s?))$/);
 
             push @context, $tag;
 
-            if ($context[$#context-1] eq 'new') {
+            if ($context[-2] eq 'new') {
                 return '
                     if (!$_xsp_handel_cart_called_new &amp;&amp; scalar keys %_xsp_handel_cart_new_filter) {
-                        $_xsp_handel_cart_cart = Handel::Cart-&gt;new(\%_xsp_handel_cart_new_filter);
+                        $_xsp_handel_cart_cart = Handel::Cart-&gt;create(\%_xsp_handel_cart_new_filter);
                         $_xsp_handel_cart_called_new = 1;
                     };
                     if (!$_xsp_handel_cart_cart) {
                 ';
-            } elsif ($context[$#context-1] eq 'cart') {
+            } elsif ($context[-2] eq 'cart') {
                 return '
                     if (!$_xsp_handel_cart_called_load) {
                         $_xsp_handel_cart_cart = (scalar keys %_xsp_handel_cart_load_filter) ?
-                            Handel::Cart-&gt;load(\%_xsp_handel_cart_load_filter, 1)-&gt;next :
-                            Handel::Cart-&gt;load(undef, 1)-&gt;next;
+                            Handel::Cart-&gt;search(\%_xsp_handel_cart_load_filter)-&gt;next :
+                            Handel::Cart-&gt;search-&gt;next;
                             $_xsp_handel_cart_called_load = 1;
                     };
                     if (!$_xsp_handel_cart_cart) {
                 ';
-            } elsif ($context[$#context-1] eq 'carts') {
+            } elsif ($context[-2] eq 'carts') {
                 return '
                     if (!$_xsp_handel_carts_called_load) {
                         @_xsp_handel_cart_carts = (scalar keys %_xsp_handel_carts_load_filter) ?
-                            Handel::Cart-&gt;load(\%_xsp_handel_carts_load_filter) :
-                            Handel::Cart-&gt;load();
+                            Handel::Cart-&gt;search(\%_xsp_handel_carts_load_filter) :
+                            Handel::Cart-&gt;search;
                             $_xsp_handel_carts_called_load = 1;
                     };
                     if (!scalar @_xsp_handel_cart_carts) {
                 ';
-            } elsif ($context[$#context-1] eq 'item') {
+            } elsif ($context[-2] eq 'item') {
                 return '
                     if (!$_xsp_handel_cart_called_item) {
                         $_xsp_handel_cart_item = (scalar keys %_xsp_handel_cart_item_filter) ?
-                            $_xsp_handel_cart_cart-&gt;items(\%_xsp_handel_cart_item_filter, 1)-&gt;next :
-                            $_xsp_handel_cart_cart-&gt;items(undef, 1)-&gt;next;
+                            $_xsp_handel_cart_cart-&gt;items(\%_xsp_handel_cart_item_filter)-&gt;next :
+                            $_xsp_handel_cart_cart-&gt;items-&gt;next;
                             $_xsp_handel_cart_called_item = 1;
                     };
                     if (!$_xsp_handel_cart_item) {
                 ';
-            } elsif ($context[$#context-1] eq 'items') {
+            } elsif ($context[-2] eq 'items') {
                 return '
                     if (!$_xsp_handel_cart_called_items) {
                         @_xsp_handel_cart_items = (scalar keys %_xsp_handel_cart_items_filter) ?
                             $_xsp_handel_cart_cart-&gt;items(\%_xsp_handel_cart_items_filter) :
-                            $_xsp_handel_cart_cart-&gt;items();
+                            $_xsp_handel_cart_cart-&gt;items;
                             $_xsp_handel_cart_called_items = 1;
                     };
                     if (!scalar @_xsp_handel_cart_items) {
                 ';
-            } elsif ($context[$#context-1] eq 'add') {
+            } elsif ($context[-2] eq 'add') {
                 return '
                     if (!$_xsp_handel_cart_called_add &amp;&amp; scalar keys %_xsp_handel_cart_add_filter) {
                         $_xsp_handel_cart_item = $_xsp_handel_cart_cart-&gt;add(\%_xsp_handel_cart_add_filter);
@@ -793,7 +798,7 @@ sub new_results_shopper_start {
 
             return '
                 if (!$_xsp_handel_cart_called_new &amp;&amp; scalar keys %_xsp_handel_cart_new_filter) {
-                    $_xsp_handel_cart_cart = Handel::Cart-&gt;new(\%_xsp_handel_cart_new_filter);
+                    $_xsp_handel_cart_cart = Handel::Cart-&gt;create(\%_xsp_handel_cart_new_filter);
                     $_xsp_handel_cart_called_new = 1;
                 };
             };';
@@ -853,15 +858,17 @@ sub new_results_shopper_start {
 
         ## cart:update
         } elsif ($tag eq 'update') {
-            if ($context[$#context-2] =~ /^(cart(s?))$/) {
+            if ($context[-3] =~ /^(cart(s?))$/) {
                 pop @context;
                 return '
                     $_xsp_handel_cart_cart-&gt;update;
+                    $_xsp_handel_cart_cart-&gt;autoupdate(1);
                 ';
-            } elsif ($context[$#context-2] =~ /^(item(s?))$/) {
+            } elsif ($context[-3] =~ /^(item(s?))$/) {
                 pop @context;
                 return '
                     $_xsp_handel_cart_item-&gt;update;
+                    $_xsp_handel_cart_item-&gt;autoupdate(1);
                 ';
             };
 
@@ -882,18 +889,18 @@ sub new_results_shopper_start {
         ## cart propery tags
         ## cart:description, id, name, shopper, type, count, subtotal
         } elsif ($tag =~ /^(description|id|name|shopper|type|count|subtotal)$/) {
-            if ($context[$#context] eq 'new' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
+            if ($context[-1] eq 'new' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'add' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
+            } elsif ($context[-1] eq 'add' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'results') {
+            } elsif ($context[-1] eq 'results') {
                 $e-&gt;end_expr($tag);
-            } elsif ($context[$#context] eq 'delete' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
+            } elsif ($context[-1] eq 'delete' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'update') {
-                if ($context[$#context-2] =~ /^(cart(s?))$/) {
+            } elsif ($context[-1] eq 'update') {
+                if ($context[-3] =~ /^(cart(s?))$/) {
                     return &quot;);\n&quot;;
-                } elsif ($context[$#context-2] =~ /^(item(s?))$/) {
+                } elsif ($context[-3] =~ /^(item(s?))$/) {
                     return &quot;);\n&quot;;
                 };
             };
@@ -902,20 +909,20 @@ sub new_results_shopper_start {
         ## cart item property tags
         ## cart:sku, price, quantity
         } elsif ($tag =~ /^(sku|price|quantity|total)$/) {
-            if ($context[$#context] eq 'add' &amp;&amp; $tag ne 'total') {
+            if ($context[-1] eq 'add' &amp;&amp; $tag ne 'total') {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'add') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'add') {
                 $e-&gt;end_expr($tag);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'item') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'item') {
                 $e-&gt;end_expr($tag);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'items') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'items') {
                 $e-&gt;end_expr($tag);
-            } elsif ($context[$#context] eq 'delete' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
+            } elsif ($context[-1] eq 'delete' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'update') {
-                if ($context[$#context-2] =~ /^(cart(s?))$/) {
+            } elsif ($context[-1] eq 'update') {
+                if ($context[-3] =~ /^(cart(s?))$/) {
                     return &quot;);\n&quot;;
-                } elsif ($context[$#context-2] =~ /^(item(s?))$/) {
+                } elsif ($context[-3] =~ /^(item(s?))$/) {
                     return &quot;);\n&quot;;
                 };
             };
@@ -923,42 +930,42 @@ sub new_results_shopper_start {
 
         ## cart:filter
         } elsif ($tag eq 'filter') {
-            if ($context[$#context] eq 'cart') {
+            if ($context[-1] eq 'cart') {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'carts') {
+            } elsif ($context[-1] eq 'carts') {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'item') {
+            } elsif ($context[-1] eq 'item') {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'items') {
+            } elsif ($context[-1] eq 'items') {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'restore') {
+            } elsif ($context[-1] eq 'restore') {
                 return &quot;;\n&quot;;
             };
 
 
         ## cart:results
         } elsif ($tag =~ /^result(s?)$/) {
-            if ($context[$#context-1] eq 'new') {
+            if ($context[-2] eq 'new') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'cart') {
+            } elsif ($context[-2] eq 'cart') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'carts') {
+            } elsif ($context[-2] eq 'carts') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'item') {
+            } elsif ($context[-2] eq 'item') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'items') {
+            } elsif ($context[-2] eq 'items') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'add') {
+            } elsif ($context[-2] eq 'add') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
@@ -968,27 +975,27 @@ sub new_results_shopper_start {
 
         ## cart:no-results
         } elsif ($tag =~ /^no-result(s?)$/) {
-            if ($context[$#context-1] eq 'new') {
+            if ($context[-2] eq 'new') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'cart') {
+            } elsif ($context[-2] eq 'cart') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'carts') {
+            } elsif ($context[-2] eq 'carts') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'item') {
+            } elsif ($context[-2] eq 'item') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'items') {
+            } elsif ($context[-2] eq 'items') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'add') {
+            } elsif ($context[-2] eq 'add') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;</diff>
      <filename>lib/AxKit/XSP/Handel/Cart.pm</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,5 @@
 # $Id$
+## no critic
 package AxKit::XSP::Handel::Checkout;
 use strict;
 use warnings;
@@ -42,8 +43,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Checkout';
 
         if ($tag eq 'new') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of other Handel tags&quot;, $tag)
-            ) if ($context[$#context] ne 'root');
+                -text =&gt; translate('TAG_NOT_ALLOWED_IN_OTHERS', $tag)
+            ) if ($context[-1] ne 'root');
 
             push @context, $tag;
 
@@ -67,8 +68,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Checkout';
             return $code;
         } elsif ($tag eq 'plugin') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of tag '&quot; . $context[$#context] . &quot;'&quot;, $tag)
-            ) if ($context[$#context] ne 'plugins');
+                -text =&gt; translate('Tag [_1] not valid inside of tag [_2]', $tag, $context[-1])
+            ) if ($context[-1] ne 'plugins');
 
             push @context, $tag;
 
@@ -95,8 +96,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Checkout';
             undef $property if ($property eq 'checkout');
 
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of tag '&quot; . $context[$#context] . &quot;'&quot;, $tag)
-            ) if ($context[$#context] ne 'messages');
+                -text =&gt; translate('Tag [_1] not valid inside of tag [_2]', $tag, $context[-1])
+            ) if ($context[-1] ne 'messages');
 
             push @context, $tag;
 
@@ -134,8 +135,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Checkout';
             return $code;
         } elsif ($tag eq 'phase') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of tag '&quot; . $context[$#context] . &quot;'&quot;, $tag)
-            ) if ($context[$#context] ne 'phases');
+                -text =&gt; translate('Tag [_1] not valid inside of tag [_2]', $tag, $context[-1])
+            ) if ($context[-1] ne 'phases');
 
             push @context, $tag;
 </diff>
      <filename>lib/AxKit/XSP/Handel/Checkout.pm</filename>
    </modified>
    <modified>
      <diff>@@ -1,4 +1,5 @@
 # $Id$
+## no critic
 package AxKit::XSP::Handel::Order;
 use strict;
 use warnings;
@@ -28,7 +29,7 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
     };
 
     sub start_document {
-        return &quot;use Handel::Order;\n&quot;;
+        return &quot;use Handel::Order;\nuse Handel::Compat::Currency;\n&quot;;
     };
 
     sub parse_char {
@@ -50,21 +51,21 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         shiptocity|shiptostate|shiptozip|shiptocountry|
         shiptodayphone|shiptonightphone|shiptofax|shiptoemail|
         tax|subtotal|total||updated)$/x) {
-            if ($context[$#context] eq 'new') {
+            if ($context[-1] eq 'new') {
                 return &quot;.q|$text|&quot;;
-            } elsif ($context[$#context] eq 'add') {
+            } elsif ($context[-1] eq 'add') {
                 return &quot;.q|$text|&quot;;
-            } elsif ($context[$#context] eq 'delete') {
+            } elsif ($context[-1] eq 'delete') {
                 return &quot;.q|$text|&quot;;
-            } elsif ($context[$#context] eq 'update') {
+            } elsif ($context[-1] eq 'update') {
                 return &quot;.q|$text|&quot;;
             };
         } elsif ($tag =~ /^(sku|price|quantity)$/) {
-            if ($context[$#context] eq 'add') {
+            if ($context[-1] eq 'add') {
                 return &quot;.q|$text|&quot;;
-            } elsif ($context[$#context] eq 'delete') {
+            } elsif ($context[-1] eq 'delete') {
                 return &quot;.q|$text|&quot;;
-            } elsif ($context[$#context] eq 'update') {
+            } elsif ($context[-1] eq 'update') {
                 return &quot;.q|$text|&quot;;
             };
         } elsif ($tag eq 'filter') {
@@ -87,14 +88,14 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order:uuid
         if ($tag =~ /^(g|u)uid$/) {
             $e-&gt;start_expr($tag);
-            $e-&gt;append_to_script(&quot;Handel::Order-&gt;uuid&quot;);
+            $e-&gt;append_to_script(&quot;Handel::Order-&gt;storage-&gt;new_uuid&quot;);
             $e-&gt;end_expr($tag);
 
         ## order:new
         } elsif ($tag eq 'new') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of other Handel tags&quot;, $tag)
-            ) if ($context[$#context] ne 'root');
+                -text =&gt; translate('TAG_NOT_ALLOWED_IN_OTHERS', $tag)
+            ) if ($context[-1] ne 'root');
 
             push @context, $tag;
 
@@ -112,8 +113,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order:cart
         } elsif ($tag eq 'cart') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] ne 'new');
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] ne 'new');
 
             push @context, $tag;
 
@@ -127,8 +128,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order:order
         } elsif ($tag eq 'order') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of other Handel tags&quot;, $tag)
-            ) if ($context[$#context] ne 'root');
+                -text =&gt; translate('TAG_NOT_ALLOWED_IN_OTHERS', $tag)
+            ) if ($context[-1] ne 'root');
 
             push @context, $tag;
 
@@ -143,8 +144,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order:orders
         } elsif ($tag eq 'orders') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of other Handel tags&quot;, $tag)
-            ) if ($context[$#context] ne 'root');
+                -text =&gt; translate('TAG_NOT_ALLOWED_IN_OTHERS', $tag)
+            ) if ($context[-1] ne 'root');
 
             push @context, $tag;
 
@@ -159,8 +160,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order:item
         } elsif ($tag eq 'item') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of tag '&quot; . $context[$#context] . &quot;'&quot;, $tag)
-            ) if ($context[$#context] =~ /^(order(s?))$/);
+                -text =&gt; translate('Tag [_1] not valid inside of tag [_2]', $tag, $context[-1])
+            ) if ($context[-1] =~ /^(order(s?))$/);
 
             push @context, $tag;
 
@@ -175,8 +176,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order:items
         } elsif ($tag eq 'items') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid inside of tag '&quot; . $context[$#context] . &quot;'&quot;, $tag)
-            ) if ($context[$#context] =~ /^(order(s?))$/);
+                -text =&gt; translate('Tag [_1] not valid inside of tag [_2]', $tag, $context[-1])
+            ) if ($context[-1] =~ /^(order(s?))$/);
 
             push @context, $tag;
 
@@ -191,8 +192,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order:clear
         } elsif ($tag eq 'clear') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] ne 'results' || $context[$#context-1] !~ /^(order(s?))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] ne 'results' || $context[-2] !~ /^(order(s?))$/);
 
            return &quot;\n\$_xsp_handel_order_order-&gt;clear;\n&quot;;
 
@@ -200,8 +201,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order:add
         } elsif ($tag eq 'add') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] ne 'results' || $context[$#context-1] !~ /^(new|order(s?))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] ne 'results' || $context[-2] !~ /^(new|order(s?))$/);
 
             push @context, $tag;
 
@@ -216,14 +217,14 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order:update
         } elsif ($tag eq 'update') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] ne 'results' || $context[$#context-1] !~ /^((order(s?)|item(s?)))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] ne 'results' || $context[-2] !~ /^((order(s?)|item(s?)))$/);
 
             push @context, $tag;
 
-            if ($context[$#context-2] =~ /^(order(s?))$/) {
+            if ($context[-3] =~ /^(order(s?))$/) {
                 return &quot;\n\$_xsp_handel_order_order-&gt;autoupdate(0);\n&quot;;
-            } elsif ($context[$#context-2] =~ /^(item(s?))$/) {
+            } elsif ($context[-3] =~ /^(item(s?))$/) {
                 return &quot;\n\$_xsp_handel_order_item-&gt;autoupdate(0);\n&quot;;
             };
 
@@ -232,8 +233,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
 
         } elsif ($tag eq 'save') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context-1] !~ /^(order(s?))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-2] !~ /^(order(s?))$/);
 
             return '
                 $_xsp_handel_order_order-&gt;save;
@@ -243,8 +244,8 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order:delete
         } elsif ($tag eq 'delete') {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] ne 'results' || $context[$#context-1] !~ /^(order(s?))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] ne 'results' || $context[-2] !~ /^(order(s?))$/);
 
             push @context, $tag;
 
@@ -267,11 +268,11 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         shiptocity|shiptostate|shiptozip|shiptocountry|
         shiptodayphone|shiptonightphone|shiptofax|shiptoemail|
         tax|subtotal|updated)$/x) {
-            if ($context[$#context] eq 'new' &amp;&amp; $tag !~ /^(count)$/) {
+            if ($context[-1] eq 'new' &amp;&amp; $tag !~ /^(count)$/) {
                 return &quot;\n\$_xsp_handel_order_new_filter{$tag} = ''&quot;;
-            } elsif ($context[$#context] eq 'add' &amp;&amp; $tag =~ /^(id|description)$/) {
+            } elsif ($context[-1] eq 'add' &amp;&amp; $tag =~ /^(id|description)$/) {
                 return &quot;\n\$_xsp_handel_order_add_filter{$tag} = ''&quot;;
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] =~ /^(new|order(s?))$/) {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] =~ /^(new|order(s?))$/) {
                 $e-&gt;start_expr($tag);
 
                 if ($tag =~ /^(subtotal|tax|handling|shipping)$/ &amp;&amp; ($attr{'format'} || $attr{'convert'})) {
@@ -284,32 +285,34 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
                     AxKit::Debug(5, &quot;[Handel] [Order] [$tag] code=$code, format=$format, from=$from, to=$to&quot;);
 
                     if ($attr{'convert'}) {
-                        $e-&gt;append_to_script(&quot;\$_xsp_handel_order_order-&gt;$tag-&gt;convert('$from', '$to', '&quot;.($attr{'format'}||'').&quot;', '$format');\n&quot;);
+                        $e-&gt;append_to_script(&quot;Handel::Compat::Currency::convert(Handel::Compat::Currency-&gt;new(\$_xsp_handel_order_order-&gt;$tag-&gt;value), '$from', '$to', '&quot;.($attr{'format'}||'').&quot;', '$format');\n&quot;);
                     } elsif ($attr{'format'}) {
-                        $e-&gt;append_to_script(&quot;\$_xsp_handel_order_order-&gt;$tag-&gt;format('$code', '$format');\n&quot;);
+                        $e-&gt;append_to_script(&quot;Handel::Compat::Currency::format(Handel::Compat::Currency-&gt;new(\$_xsp_handel_order_order-&gt;$tag-&gt;value), '$code', '$format');\n&quot;);
                     };
+                } elsif ($tag =~ /^(subtotal|tax|handling|shipping)$/) {
+                    $e-&gt;append_to_script(&quot;\$_xsp_handel_order_order-&gt;$tag-&gt;value;\n&quot;);
                 } else {
                     $e-&gt;append_to_script(&quot;\$_xsp_handel_order_order-&gt;$tag;\n&quot;);
                 };
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'item') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'item') {
                 $e-&gt;start_expr($tag);
                 $e-&gt;append_to_script(&quot;\$_xsp_handel_order_item-&gt;$tag;\n&quot;);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'items') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'items') {
                 $e-&gt;start_expr($tag);
                 $e-&gt;append_to_script(&quot;\$_xsp_handel_order_item-&gt;$tag;\n&quot;);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'add') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'add') {
                 $e-&gt;start_expr($tag);
                 $e-&gt;append_to_script(&quot;\$_xsp_handel_order_item-&gt;$tag;\n&quot;);
-            } elsif ($context[$#context] eq 'delete' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
+            } elsif ($context[-1] eq 'delete' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
                 return &quot;\n\$_xsp_handel_order_delete_filter{$tag} = ''&quot;;
-            } elsif ($context[$#context] eq 'update') {
+            } elsif ($context[-1] eq 'update') {
                 throw Handel::Exception::Taglib(
-                    -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
+                    -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
                 ) if ($tag eq 'id');
 
-                if ($context[$#context-2] =~ /^(order(s?))$/) {
+                if ($context[-3] =~ /^(order(s?))$/) {
                     return &quot;\n\$_xsp_handel_order_order-&gt;$tag(''&quot;;
-                } elsif ($context[$#context-2] =~ /^(item(s?))$/) {
+                } elsif ($context[-3] =~ /^(item(s?))$/) {
                     return &quot;\n\$_xsp_handel_order_item-&gt;$tag(''&quot;;
                 };
             };
@@ -318,14 +321,14 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order item property tags
         ## order:sku, price, quantity, total
         } elsif ($tag =~ /^(sku|price|quantity|total)$/) {
-            if ($context[$#context] eq 'new') {
+            if ($context[-1] eq 'new') {
                 return &quot;\n\$_xsp_handel_order_new_filter{$tag} = ''&quot;;
-            } elsif ($context[$#context] eq 'add') {
+            } elsif ($context[-1] eq 'add') {
                 return &quot;\n\$_xsp_handel_order_add_filter{$tag} = ''&quot;;
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'add') {
-                $e-&gt;start_expr($tag);
-                $e-&gt;append_to_script(&quot;\$_xsp_handel_order_item-&gt;$tag;\n&quot;);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] =~ /^(new|order(s?)|item(s?))$/) {
+            #} elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'add') {
+            #    $e-&gt;start_expr($tag);
+            #    $e-&gt;append_to_script(&quot;\$_xsp_handel_order_item-&gt;$tag;\n&quot;);
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] =~ /^(add|new|order(s?)|item(s?))$/) {
                 $e-&gt;start_expr($tag);
 
                 if ($tag =~ /^(price|total)$/ &amp;&amp; ($attr{'format'} || $attr{'convert'})) {
@@ -338,31 +341,37 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
                     AxKit::Debug(5, &quot;[Handel] [Order] [$tag] code=$code, format=$format, from=$from, to=$to&quot;);
 
                     if ($attr{'convert'}) {
-                        if ($context[$#context-1] =~ /^(new|order(s?))$/) {
-                            $e-&gt;append_to_script(&quot;\$_xsp_handel_order_order-&gt;$tag-&gt;convert('$from', '$to', '&quot;.($attr{'format'}||'').&quot;', '$format');\n&quot;);
+                        if ($context[-2] =~ /^(new|order(s?))$/) {
+                            $e-&gt;append_to_script(&quot;Handel::Compat::Currency::convert(Handel::Compat::Currency-&gt;new(\$_xsp_handel_order_order-&gt;$tag-&gt;value), '$from', '$to', '&quot;.($attr{'format'}||'').&quot;', '$format');\n&quot;);
                         } else {
-                            $e-&gt;append_to_script(&quot;\$_xsp_handel_order_item-&gt;$tag-&gt;convert('$from', '$to', '&quot;.($attr{'format'}||'').&quot;', '$format');\n&quot;);
+                            $e-&gt;append_to_script(&quot;Handel::Compat::Currency::convert(Handel::Compat::Currency-&gt;new(\$_xsp_handel_order_item-&gt;$tag-&gt;value), '$from', '$to', '&quot;.($attr{'format'}||'').&quot;', '$format');\n&quot;);
                         };
                     } elsif ($attr{'format'}) {
-                        if ($context[$#context-1] =~ /^(new|order(s?))$/) {
-                            $e-&gt;append_to_script(&quot;\$_xsp_handel_order_order-&gt;$tag-&gt;format('$code', '$format');\n&quot;);
+                        if ($context[-2] =~ /^(new|order(s?))$/) {
+                            $e-&gt;append_to_script(&quot;Handel::Compat::Currency::format(Handel::Compat::Currency-&gt;new(\$_xsp_handel_order_order-&gt;$tag-&gt;value), '$code', '$format');\n&quot;);
                         } else {
-                            $e-&gt;append_to_script(&quot;\$_xsp_handel_order_item-&gt;$tag-&gt;format('$code', '$format');\n&quot;);
+                            $e-&gt;append_to_script(&quot;Handel::Compat::Currency::format(Handel::Compat::Currency-&gt;new(\$_xsp_handel_order_item-&gt;$tag-&gt;value), '$code', '$format');\n&quot;);
                         };
                     };
+                } elsif ($tag =~ /^(price|total)$/) {
+                    if ($context[-2] =~ /^(new|order(s?))$/) {
+                        $e-&gt;append_to_script(&quot;\$_xsp_handel_order_order-&gt;$tag-&gt;value;\n&quot;);
+                    } else {
+                        $e-&gt;append_to_script(&quot;\$_xsp_handel_order_item-&gt;$tag-&gt;value;\n&quot;);
+                    };
                 } else {
-                    if ($context[$#context-1] =~ /^(new|order(s?))$/) {
+                    if ($context[-2] =~ /^(new|order(s?))$/) {
                         $e-&gt;append_to_script(&quot;\$_xsp_handel_order_order-&gt;$tag;\n&quot;);
                     } else {
                         $e-&gt;append_to_script(&quot;\$_xsp_handel_order_item-&gt;$tag;\n&quot;);
                     };
                 };
-            } elsif ($context[$#context] eq 'delete') {
+            } elsif ($context[-1] eq 'delete') {
                 return &quot;\n\$_xsp_handel_order_delete_filter{$tag} = ''&quot;;
-            } elsif ($context[$#context] eq 'update') {
-                if ($context[$#context-2] =~ /^(order(s?))$/) {
+            } elsif ($context[-1] eq 'update') {
+                if ($context[-3] =~ /^(order(s?))$/) {
                     return &quot;\n\$_xsp_handel_order_order-&gt;$tag(''&quot;;
-                } elsif ($context[$#context-2] =~ /^(item(s?))$/) {
+                } elsif ($context[-3] =~ /^(item(s?))$/) {
                     return &quot;\n\$_xsp_handel_order_item-&gt;$tag(''&quot;;
                 };
             };
@@ -372,15 +381,15 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         } elsif ($tag eq 'filter') {
             my $key = $attr{'name'} || 'id';
 
-            if ($context[$#context] eq 'order') {
+            if ($context[-1] eq 'order') {
                 return &quot;\n\$_xsp_handel_order_load_filter{'$key'} = ''&quot;;
-            } elsif ($context[$#context] eq 'orders') {
+            } elsif ($context[-1] eq 'orders') {
                 return &quot;\n\$_xsp_handel_orders_load_filter{'$key'} = ''&quot;;
-            } elsif ($context[$#context] eq 'item') {
+            } elsif ($context[-1] eq 'item') {
                 return &quot;\n\$_xsp_handel_order_item_filter{'$key'} = ''&quot;;
-            } elsif ($context[$#context] eq 'items') {
+            } elsif ($context[-1] eq 'items') {
                 return &quot;\n\$_xsp_handel_order_items_filter{'$key'} = ''&quot;;
-            } elsif ($context[$#context] eq 'cart') {
+            } elsif ($context[-1] eq 'cart') {
                 return &quot;\n\$_xsp_handel_order_new_cart_filter{'$key'} = ''&quot;;
             };
 
@@ -388,65 +397,65 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order:results
         } elsif ($tag =~ /^result(s?)$/) {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] !~ /^(new|add|order(s?)|item(s?))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] !~ /^(new|add|order(s?)|item(s?))$/);
 
             push @context, $tag;
 
-            if ($context[$#context-1] eq 'new') {
+            if ($context[-2] eq 'new') {
                 return '
                     if (!$_xsp_handel_order_called_new &amp;&amp; scalar keys %_xsp_handel_order_new_filter) {
-                        $_xsp_handel_order_order = Handel::Order-&gt;new(\%_xsp_handel_order_new_filter, $_xsp_handel_order_new_process);
+                        $_xsp_handel_order_order = Handel::Order-&gt;create(\%_xsp_handel_order_new_filter, $_xsp_handel_order_new_process);
                         $_xsp_handel_order_called_new = 1;
                     };
                     if ($_xsp_handel_order_order) {
 
                 ';
-            } elsif ($context[$#context-1] eq 'order') {
+            } elsif ($context[-2] eq 'order') {
                 return '
                     if (!$_xsp_handel_order_called_load) {
                         $_xsp_handel_order_order = (scalar keys %_xsp_handel_order_load_filter) ?
-                            Handel::Order-&gt;load(\%_xsp_handel_order_load_filter, 1)-&gt;next :
-                            Handel::Order-&gt;load(undef, 1)-&gt;next;
+                            Handel::Order-&gt;search(\%_xsp_handel_order_load_filter)-&gt;next :
+                            Handel::Order-&gt;search-&gt;next;
                             $_xsp_handel_order_called_load = 1;
                     };
                     if ($_xsp_handel_order_order) {
 
                 ';
-            } elsif ($context[$#context-1] eq 'orders') {
+            } elsif ($context[-2] eq 'orders') {
                 return '
                     if (!$_xsp_handel_orders_called_load) {
                         @_xsp_handel_order_orders = (scalar keys %_xsp_handel_orders_load_filter) ?
-                            Handel::Order-&gt;load(\%_xsp_handel_orders_load_filter) :
-                            Handel::Order-&gt;load();
+                            Handel::Order-&gt;search(\%_xsp_handel_orders_load_filter) :
+                            Handel::Order-&gt;search;
                             $_xsp_handel_orders_called_load = 1;
                     };
                     foreach my $_xsp_handel_order_order (@_xsp_handel_order_orders) {
 
                 ';
-            } elsif ($context[$#context-1] eq 'item') {
+            } elsif ($context[-2] eq 'item') {
                 return '
                     if (!$_xsp_handel_order_called_item) {
                         $_xsp_handel_order_item = (scalar keys %_xsp_handel_order_item_filter) ?
-                            $_xsp_handel_order_order-&gt;items(\%_xsp_handel_order_item_filter, 1)-&gt;next :
-                            $_xsp_handel_order_order-&gt;items(undef, 1)-&gt;next;
+                            $_xsp_handel_order_order-&gt;items(\%_xsp_handel_order_item_filter)-&gt;next :
+                            $_xsp_handel_order_order-&gt;items-&gt;next;
                             $_xsp_handel_order_called_item = 1;
                     };
                     if ($_xsp_handel_order_item) {
 
                 ';
-            } elsif ($context[$#context-1] eq 'items') {
+            } elsif ($context[-2] eq 'items') {
                 return '
                     if (!$_xsp_handel_order_called_items) {
                         @_xsp_handel_order_items = (scalar keys %_xsp_handel_order_items_filter) ?
                             $_xsp_handel_order_order-&gt;items(\%_xsp_handel_order_items_filter) :
-                            $_xsp_handel_order_order-&gt;items();
+                            $_xsp_handel_order_order-&gt;items;
                             $_xsp_handel_order_called_items = 1;
                     };
                     foreach my $_xsp_handel_order_item (@_xsp_handel_order_items) {
 
                 ';
-            } elsif ($context[$#context-1] eq 'add') {
+            } elsif ($context[-2] eq 'add') {
                 return '
                     if (!$_xsp_handel_order_called_add &amp;&amp; scalar keys %_xsp_handel_order_add_filter) {
                         $_xsp_handel_order_item = $_xsp_handel_order_order-&gt;add(\%_xsp_handel_order_add_filter);
@@ -461,60 +470,60 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order:no-results
         } elsif ($tag =~ /^no-result(s?)$/) {
             throw Handel::Exception::Taglib(
-                -text =&gt; translate(&quot;Tag '[_1]' not valid here&quot;, $tag)
-            ) if ($context[$#context] !~ /^(new|add|order(s?)|item(s?))$/);
+                -text =&gt; translate('TAG_NOT_ALLOWED_HERE', $tag)
+            ) if ($context[-1] !~ /^(new|add|order(s?)|item(s?))$/);
 
             push @context, $tag;
 
-            if ($context[$#context-1] eq 'new') {
+            if ($context[-2] eq 'new') {
                 return '
                     if (!$_xsp_handel_order_called_new &amp;&amp; scalar keys %_xsp_handel_order_new_filter) {
-                        $_xsp_handel_order_order = Handel::Order-&gt;new(\%_xsp_handel_order_new_filter, $_xsp_handel_order_new_process);
+                        $_xsp_handel_order_order = Handel::Order-&gt;create(\%_xsp_handel_order_new_filter, $_xsp_handel_order_new_process);
                         $_xsp_handel_order_called_new = 1;
                     };
                     if (!$_xsp_handel_order_order) {
                 ';
-            } elsif ($context[$#context-1] eq 'order') {
+            } elsif ($context[-2] eq 'order') {
                 return '
                     if (!$_xsp_handel_order_called_load) {
                         $_xsp_handel_order_order = (scalar keys %_xsp_handel_order_load_filter) ?
-                            Handel::Order-&gt;load(\%_xsp_handel_order_load_filter, 1)-&gt;next :
-                            Handel::Order-&gt;load(undef, 1)-&gt;next;
+                            Handel::Order-&gt;search(\%_xsp_handel_order_load_filter)-&gt;next :
+                            Handel::Order-&gt;search-&gt;next;
                             $_xsp_handel_order_called_load = 1;
                     };
                     if (!$_xsp_handel_order_order) {
                 ';
-            } elsif ($context[$#context-1] eq 'orders') {
+            } elsif ($context[-2] eq 'orders') {
                 return '
                     if (!$_xsp_handel_orders_called_load) {
                         @_xsp_handel_order_orders = (scalar keys %_xsp_handel_orders_load_filter) ?
-                            Handel::Order-&gt;load(\%_xsp_handel_orders_load_filter) :
-                            Handel::Order-&gt;load();
+                            Handel::Order-&gt;search(\%_xsp_handel_orders_load_filter) :
+                            Handel::Order-&gt;search;
                             $_xsp_handel_orders_called_load = 1;
                     };
                     if (!scalar @_xsp_handel_order_orders) {
                 ';
-            } elsif ($context[$#context-1] eq 'item') {
+            } elsif ($context[-2] eq 'item') {
                 return '
                     if (!$_xsp_handel_order_called_item) {
                         $_xsp_handel_order_item = (scalar keys %_xsp_handel_order_item_filter) ?
-                            $_xsp_handel_order_order-&gt;items(\%_xsp_handel_order_item_filter, 1)-&gt;next :
-                            $_xsp_handel_order_order-&gt;items(undef, 1)-&gt;next;
+                            $_xsp_handel_order_order-&gt;items(\%_xsp_handel_order_item_filter)-&gt;next :
+                            $_xsp_handel_order_order-&gt;items-&gt;next;
                             $_xsp_handel_order_called_item = 1;
                     };
                     if (!$_xsp_handel_order_item) {
                 ';
-            } elsif ($context[$#context-1] eq 'items') {
+            } elsif ($context[-2] eq 'items') {
                 return '
                     if (!$_xsp_handel_order_called_items) {
                         @_xsp_handel_order_items = (scalar keys %_xsp_handel_order_items_filter) ?
                             $_xsp_handel_order_order-&gt;items(\%_xsp_handel_order_items_filter) :
-                            $_xsp_handel_order_order-&gt;items();
+                            $_xsp_handel_order_order-&gt;items;
                             $_xsp_handel_order_called_items = 1;
                     };
                     if (!scalar @_xsp_handel_order_items) {
                 ';
-            } elsif ($context[$#context-1] eq 'add') {
+            } elsif ($context[-2] eq 'add') {
                 return '
                     if (!$_xsp_handel_order_called_add &amp;&amp; scalar keys %_xsp_handel_order_add_filter) {
                         $_xsp_handel_order_item = $_xsp_handel_order_order-&gt;add(\%_xsp_handel_order_add_filter);
@@ -539,7 +548,7 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
 
             return '
                 if (!$_xsp_handel_order_called_new &amp;&amp; scalar keys %_xsp_handel_order_new_filter) {
-                    $_xsp_handel_order_order = Handel::Order-&gt;new(\%_xsp_handel_order_new_filter);
+                    $_xsp_handel_order_order = Handel::Order-&gt;create(\%_xsp_handel_order_new_filter);
                     $_xsp_handel_order_called_new = 1;
                 };
             };';
@@ -599,15 +608,17 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
 
         ## order:update
         } elsif ($tag eq 'update') {
-            if ($context[$#context-2] =~ /^(order(s?))$/) {
+            if ($context[-3] =~ /^(order(s?))$/) {
                 pop @context;
                 return '
                     $_xsp_handel_order_order-&gt;update;
+                    $_xsp_handel_order_order-&gt;autoupdate(1);
                 ';
-            } elsif ($context[$#context-2] =~ /^(item(s?))$/) {
+            } elsif ($context[-3] =~ /^(item(s?))$/) {
                 pop @context;
                 return '
                     $_xsp_handel_order_item-&gt;update;
+                    $_xsp_handel_order_item-&gt;autoupdate(1);
                 ';
             };
 
@@ -636,18 +647,18 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         shiptocity|shiptostate|shiptozip|shiptocountry|
         shiptodayphone|shiptonightphone|shiptofax|shiptoemail|
         tax|subtotal|updated)$/x) {
-            if ($context[$#context] eq 'new' &amp;&amp; $tag !~ /^(count)$/) {
+            if ($context[-1] eq 'new' &amp;&amp; $tag !~ /^(count)$/) {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'add' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
+            } elsif ($context[-1] eq 'add' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'results') {
+            } elsif ($context[-1] eq 'results') {
                 $e-&gt;end_expr($tag);
-            } elsif ($context[$#context] eq 'delete' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
+            } elsif ($context[-1] eq 'delete' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'update') {
-                if ($context[$#context-2] =~ /^(order(s?))$/) {
+            } elsif ($context[-1] eq 'update') {
+                if ($context[-3] =~ /^(order(s?))$/) {
                     return &quot;);\n&quot;;
-                } elsif ($context[$#context-2] =~ /^(item(s?))$/) {
+                } elsif ($context[-3] =~ /^(item(s?))$/) {
                     return &quot;);\n&quot;;
                 };
             };
@@ -656,28 +667,28 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
         ## order item property tags
         ## order:sku, price, quantity
         } elsif ($tag =~ /^(sku|price|quantity|total)$/) {
-            if ($context[$#context] eq 'add') {
+            if ($context[-1] eq 'add') {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'new') {
+            } elsif ($context[-1] eq 'new') {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'new') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'new') {
                 $e-&gt;end_expr($tag);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'add') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'add') {
                 $e-&gt;end_expr($tag);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'item') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'item') {
                 $e-&gt;end_expr($tag);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'items') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'items') {
                 $e-&gt;end_expr($tag);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'order') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'order') {
                 $e-&gt;end_expr($tag);
-            } elsif ($context[$#context] eq 'results' &amp;&amp; $context[$#context-1] eq 'orders') {
+            } elsif ($context[-1] eq 'results' &amp;&amp; $context[-2] eq 'orders') {
                 $e-&gt;end_expr($tag);
-            } elsif ($context[$#context] eq 'delete' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
+            } elsif ($context[-1] eq 'delete' &amp;&amp; $tag !~ /^(count|subtotal)$/) {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'update') {
-                if ($context[$#context-2] =~ /^(order(s?))$/) {
+            } elsif ($context[-1] eq 'update') {
+                if ($context[-3] =~ /^(order(s?))$/) {
                     return &quot;);\n&quot;;
-                } elsif ($context[$#context-2] =~ /^(item(s?))$/) {
+                } elsif ($context[-3] =~ /^(item(s?))$/) {
                     return &quot;);\n&quot;;
                 };
             };
@@ -685,44 +696,44 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
 
         ## order:filter
         } elsif ($tag eq 'filter') {
-            if ($context[$#context] eq 'order') {
+            if ($context[-1] eq 'order') {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'orders') {
+            } elsif ($context[-1] eq 'orders') {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'item') {
+            } elsif ($context[-1] eq 'item') {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'items') {
+            } elsif ($context[-1] eq 'items') {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'restore') {
+            } elsif ($context[-1] eq 'restore') {
                 return &quot;;\n&quot;;
-            } elsif ($context[$#context] eq 'cart') {
+            } elsif ($context[-1] eq 'cart') {
                 return &quot;;\n&quot;;
             };
 
 
         ## order:results
         } elsif ($tag =~ /^result(s?)$/) {
-            if ($context[$#context-1] eq 'new') {
+            if ($context[-2] eq 'new') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'order') {
+            } elsif ($context[-2] eq 'order') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'orders') {
+            } elsif ($context[-2] eq 'orders') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'item') {
+            } elsif ($context[-2] eq 'item') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'items') {
+            } elsif ($context[-2] eq 'items') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'add') {
+            } elsif ($context[-2] eq 'add') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
@@ -732,27 +743,27 @@ $NS  = 'http://today.icantfocus.com/CPAN/AxKit/XSP/Handel/Order';
 
         ## order:no-results
         } elsif ($tag =~ /^no-result(s?)$/) {
-            if ($context[$#context-1] eq 'new') {
+            if ($context[-2] eq 'new') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'order') {
+            } elsif ($context[-2] eq 'order') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'orders') {
+            } elsif ($context[-2] eq 'orders') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'item') {
+            } elsif ($context[-2] eq 'item') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'items') {
+            } elsif ($context[-2] eq 'items') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;
-            } elsif ($context[$#context-1] eq 'add') {
+            } elsif ($context[-2] eq 'add') {
                 pop @context;
 
                 return &quot;\n};\n&quot;;</diff>
      <filename>lib/AxKit/XSP/Handel/Order.pm</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,51 @@
 # $Id$
+## no critic (ProhibitCaptureWithoutTest)
 package Catalyst::Helper::Controller::Handel::Cart;
 use strict;
 use warnings;
-use Path::Class;
-use Catalyst 5.56;
+
+BEGIN {
+    use Catalyst 5.7001;
+    use Catalyst::Utils;
+    use Path::Class;
+};
+
+=head1 NAME
+
+Catalyst::Helper::Controller::Handel::Cart - Helper for Handel::Cart Controllers
+
+=head1 SYNOPSIS
+
+    script/create.pl controller &lt;newclass&gt; Handel::Cart [&lt;modelclass&gt; &lt;checkoutcontroller&gt;]
+    script/create.pl controller Cart       Handel::Cart Cart Checkout
+
+=head1 DESCRIPTION
+
+A Helper for creating controllers based on Handel::Cart objects. If no modelclass
+is specified, ::M::Cart is assumed.
+
+Both the modelclass and checkoutcontroller arguments try to do the right thing with the
+names given to them.
+
+For example, you can pass the shortened class name without the MyApp::M/C, or pass the fully
+qualified package name:
+
+    MyApp::M::CartModel
+    MyApp::Model::CartModel
+    CartModel
+
+In all three cases everything before M{odel)|C(ontroller) will be stripped and the class CartModel
+will be used.
+
+B&lt;The code generated by this helper requires FormValidator::Simple and YAML to be installed to operate.&gt;
+
+=head1 METHODS
+
+=head2 mk_compclass
+
+Makes a Handel::Cart Controller class and template files for you.
+
+=cut
 
 sub mk_compclass {
     my ($self, $helper, $model, $checkout) = @_;
@@ -13,586 +55,492 @@ sub mk_compclass {
     $model     ||= 'Cart';
     $checkout  ||= 'Checkout';
 
-    $model = $model =~ /^(.*::M(odel)?::)?(.*)$/i ? $3 : 'Cart';
+    $model =~ /^(.*::M(odel)?::)?(.*)$/i;
+    $model = $3 ? $3 : 'Cart';
     $helper-&gt;{'model'} = $model;
 
-    my $couri = $checkout =~ /^(.*::C(ontroller)?::)?(.*)$/i ? lc($3) : 'checkout';
+    $checkout =~ /^(.*::C(ontroller)?::)?(.*)$/i;
+    my $couri = $3 ? lc($3) : 'checkout';
     $couri =~ s/::/\//g;
     $helper-&gt;{'couri'} = $couri;
 
+
+    $helper-&gt;{'action'} = Catalyst::Utils::class2prefix($helper-&gt;{'class'});
+
     $helper-&gt;mk_dir($dir);
     $helper-&gt;render_file('controller', $file);
-    $helper-&gt;render_file('view', file($dir, 'view.tt'));
-    $helper-&gt;render_file('list', file($dir, 'list.tt'));
+
+    $helper-&gt;render_file('default', file($dir, 'default'));
+    $helper-&gt;render_file('list', file($dir, 'list'));
+    $helper-&gt;render_file('errors', file($dir, 'errors'));
+    $helper-&gt;render_file('profiles', file($dir, 'profiles.yml'));
+    $helper-&gt;render_file('messages', file($dir, 'messages.yml'));
+
+    $helper-&gt;render_file('products', file($helper-&gt;{'base'}, 'root', 'static', 'products.htm'));
+
+    return 1;
 };
 
+=head2 mk_comptest
+
+Makes a Handel::Cart Controller test for you.
+
+=cut
+
 sub mk_comptest {
     my ($self, $helper) = @_;
     my $test = $helper-&gt;{'test'};
 
     $helper-&gt;render_file('test', $test);
+
+    return 1;
 };
 
+=head1 SEE ALSO
+
+L&lt;Catalyst::Manual&gt;, L&lt;Catalyst::Helper&gt;, L&lt;Handel::Cart&gt;
+
+=head1 AUTHOR
+
+    Christopher H. Laco
+    CPAN ID: CLACO
+    claco@chrislaco.com
+    http://today.icantfocus.com/blog/
+
+=cut
+
 1;
 __DATA__
+
+=begin pod_to_ignore
+
 __controller__
 package [% class %];
 use strict;
 use warnings;
-use Handel::Constants qw(:returnas :cart);
-use Data::FormValidator 4.00;
-use base 'Catalyst::Base';
-
-our $DFV;
-
-# Until this patch [hopefully] get's dumped into DFV 4.03, I've inlined the msgs
-# method below with the following path applied to it:
-#
-#--- Results.pm.orig Wed Aug 31 22:27:27 2005
-#+++ Results.pm  Wed Sep 14 17:40:28 2005
-#@@ -584,7 +584,9 @@
-#    if ($self-&gt;has_missing) {
-#        my $missing = $self-&gt;missing;
-#        for my $m (@$missing) {
-#-           $msgs{$m} = _error_msg_fmt($profile{format},$profile{missing});
-#+            $msgs{$m} = _error_msg_fmt($profile{format},
-#+                (ref $profile{missing} eq 'HASH' ?
-#+                    ($profile{missing}-&gt;{$m} || $profile{missing}-&gt;{default} || 'Missing') : $profile{missing}));
-#        }
-#    }
 
 BEGIN {
-    eval 'use Data::FormValidator 4.00';
-    if (!$@) {
-        #############################################################
-        # This is here until the patch makes it to release
-        #############################################################
-        no warnings 'redefine';
-        sub Data::FormValidator::Results::msgs {
-            my $self = shift;
-            my $controls = shift || {};
-            if (defined $controls and ref $controls ne 'HASH') {
-                die &quot;$0: parameter passed to msgs must be a hash ref&quot;;
-            }
-
-
-            # Allow msgs to be called more than one to accumulate error messages
-            $self-&gt;{msgs} ||= {};
-            $self-&gt;{profile}{msgs} ||= {};
-            $self-&gt;{msgs} = { %{ $self-&gt;{msgs} }, %$controls };
-
-            # Legacy typo support.
-            for my $href ($self-&gt;{msgs}, $self-&gt;{profile}{msgs}) {
-                if (
-                     (not defined $href-&gt;{invalid_separator})
-                     &amp;&amp;  (defined $href-&gt;{invalid_seperator})
-                 ) {
-                    $href-&gt;{invalid_separator} = $href-&gt;{invalid_seperator};
-                }
-            }
-
-            my %profile = (
-                prefix  =&gt; '',
-                missing =&gt; 'Missing',
-                invalid =&gt; 'Invalid',
-                invalid_separator =&gt; ' ',
-
-                format  =&gt; '&lt;span style=&quot;color:red;font-weight:bold&quot;&gt;&lt;span class=&quot;dfv_errors&quot;&gt;* %s&lt;/span&gt;&lt;/span&gt;',
-                %{ $self-&gt;{msgs} },
-                %{ $self-&gt;{profile}{msgs} },
-            );
-
-
-            my %msgs = ();
-
-            # Add invalid messages to hash
-                #  look at all the constraints, look up their messages (or provide a default)
-                #  add field + formatted constraint message to hash
-            if ($self-&gt;has_invalid) {
-                my $invalid = $self-&gt;invalid;
-                for my $i ( keys %$invalid ) {
-                    $msgs{$i} = join $profile{invalid_separator}, map {
-                        Data::FormValidator::Results::_error_msg_fmt($profile{format},($profile{constraints}{$_} || $profile{invalid}))
-                        } @{ $invalid-&gt;{$i} };
-                }
-            }
-
-            # Add missing messages, if any
-            if ($self-&gt;has_missing) {
-                my $missing = $self-&gt;missing;
-                for my $m (@$missing) {
-                    $msgs{$m} = Data::FormValidator::Results::_error_msg_fmt($profile{format},
-                      (ref $profile{missing} eq 'HASH' ?
-                          ($profile{missing}-&gt;{$m} || $profile{missing}-&gt;{default} || 'Missing') : $profile{missing}));
-                }
-            }
-
-            my $msgs_ref = Data::FormValidator::Results::prefix_hash($profile{prefix},\%msgs);
-
-            $msgs_ref-&gt;{ $profile{any_errors} } = 1 if defined $profile{any_errors};
-
-            return $msgs_ref;
-        }
-        #############################################################
-
-        $DFV = Data::FormValidator-&gt;new({
-            cart_add =&gt; {
-                required =&gt; [qw/sku quantity/],
-                optional =&gt; [qw/price description/],
-                field_filters =&gt; {
-                    sku         =&gt; ['trim'],
-                    quantity    =&gt; ['pos_integer'],
-                    price       =&gt; ['pos_decimal'],
-                    description =&gt; ['trim']
-                },
-                msgs =&gt; {
-                    missing =&gt; {
-                        default  =&gt; 'Field is blank!',
-                        sku      =&gt; 'The SKU field is required',
-                        quantity =&gt; 'The quantity field is required and must be a positive number'
-                    },
-                    format =&gt; '%s'
-                }
-            },
-            cart_update =&gt; {
-                required      =&gt; [qw/id quantity/],
-                field_filters =&gt; {
-                    id       =&gt; ['trim'],
-                    quantity =&gt; ['pos_integer']
-                },
-                msgs =&gt; {
-                    missing =&gt; {
-                        default  =&gt; 'Field is blank!',
-                        id       =&gt; 'The Id field is required for updating a cart item',
-                        quantity =&gt; 'The quantity field is required and must be a positive number'
-                    },
-                    format =&gt; '%s'
-                }
-            },
-            cart_delete =&gt; {
-                required =&gt; ['id'],
-                field_filters =&gt; {
-                    id =&gt; ['trim']
-                },
-                msgs =&gt; {
-                    missing =&gt; {
-                        id =&gt; 'The Id field is required for delete a cart item'
-                    },
-                    format =&gt; '%s'
-                }
-            },
-            cart_save =&gt; {
-                required =&gt; [qw/name/],
-                field_filters =&gt; {
-                    name =&gt; ['trim']
-                },
-                msgs =&gt; {
-                    missing =&gt; {
-                        default =&gt; 'Field is blank',
-                        name    =&gt; 'The Name field is required to save a cart'
-                    },
-                    format =&gt; '%s'
-                }
-            },
-            cart_restore =&gt; {
-                required =&gt; [qw/id mode/],
-                field_filters =&gt; {
-                    id   =&gt; ['trim'],
-                    mode =&gt; ['digit']
-                },
-                msgs =&gt; {
-                    missing =&gt; {
-                        default =&gt; 'Field is blank',
-                        id      =&gt; 'The id field is required for restoring saved cartds',
-                        mode    =&gt; 'The mode field is required for restoring saved carts'
-                    },
-                    format =&gt; '%s'
-                }
-            },
-            cart_destroy =&gt; {
-                required =&gt; ['id'],
-                field_filters =&gt; {
-                    id =&gt; ['trim']
-                },
-                msgs =&gt; {
-                    missing =&gt; {
-                        id =&gt; 'The Id field is required for deleting saved carts'
-                    },
-                    format =&gt; '%s'
-                }
-            },
-        });
-    };
+    use base qw/Catalyst::Controller/;
+    use Handel::Constants qw/:cart/;
+    use FormValidator::Simple 0.17;
+    use YAML;
 };
 
-sub begin : Private {
-    my ($self, $c) = @_;
+=head1 NAME
 
-    if (!$c-&gt;req-&gt;cookie('shopperid')) {
-        $c-&gt;stash-&gt;{'shopperid'} = $c-&gt;model('[% model %]')-&gt;uuid;
-        $c-&gt;res-&gt;cookies-&gt;{'shopperid'} = {value =&gt; $c-&gt;stash-&gt;{'shopperid'}, path =&gt; '/'};
+[% class %] - Catalyst Controller
 
-        $c-&gt;stash-&gt;{'cart'} = $c-&gt;model('[% model %]')-&gt;new({
-            shopper =&gt; $c-&gt;stash-&gt;{'shopperid'},
-            type    =&gt; CART_TYPE_TEMP
-        });
-    } else {
-        $c-&gt;stash-&gt;{'shopperid'} = $c-&gt;req-&gt;cookie('shopperid')-&gt;value;
+=head1 DESCRIPTION
 
-        $c-&gt;stash-&gt;{'cart'} = $c-&gt;model('[% model %]')-&gt;load({
-            shopper =&gt; $c-&gt;stash-&gt;{'shopperid'},
-            type    =&gt; CART_TYPE_TEMP
-        }, RETURNAS_ITERATOR)-&gt;first;
+Catalyst Controller.
 
-        if (!$c-&gt;stash-&gt;{'cart'}) {
-            $c-&gt;stash-&gt;{'cart'} = $c-&gt;model('[% model %]')-&gt;new({
-                shopper =&gt; $c-&gt;stash-&gt;{'shopperid'},
-                type    =&gt; CART_TYPE_TEMP
-            });
-        };
-    };
-};
+=head1 METHODS
 
-sub end : Private {
-    my ($self, $c) = @_;
+=head2 COMPONENT
 
-    $c-&gt;forward($c-&gt;view('TT'))
-        unless ( $c-&gt;res-&gt;output || $c-&gt;res-&gt;body || ! $c-&gt;stash-&gt;{template} );
-};
+=cut
 
-sub default : Private {
-    my ($self, $c) = @_;
+sub COMPONENT {
+    my $self = shift-&gt;NEXT::COMPONENT(@_);
 
-    $c-&gt;forward('view');
-};
+    $self-&gt;{'validator'} = FormValidator::Simple-&gt;new;
+    $self-&gt;{'validator'}-&gt;set_messages(
+        $_[0]-&gt;path_to('root', '[% action %]', 'messages.yml')
+    );
 
-sub view : Local {
-    my ($self, $c) = @_;
+    $self-&gt;{'profiles'} = YAML::LoadFile($_[0]-&gt;path_to('root', '[% action %]', 'profiles.yml'));
 
-    $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/view.tt';
+    return $self;
 };
 
-sub add : Local {
-    my ($self, $c) = @_;
-    my @messages;
-    my $sku         = $c-&gt;request-&gt;param('sku');
-    my $quantity    = $c-&gt;request-&gt;param('quantity');
-    my $price       = $c-&gt;request-&gt;param('price');
-    my $description = $c-&gt;request-&gt;param('description');
+=head2 default 
 
-    if ($c-&gt;req-&gt;method eq 'POST') {
-        my $results;
+Default action when browsing to [% uri %]/. If no session exists, or the shopper
+id isn't set, no cart will be loaded. This keeps non-shoppers like Google
+and others from wasting sessions and cart records for no good reason.
 
-        if ($DFV) {
-            $results = $DFV-&gt;check($c-&gt;req-&gt;parameters, 'cart_add');
-        };
+=cut
 
-        if ($results || !$DFV) {
-            if ($results) {
-                $sku         = $results-&gt;valid('sku');
-                $quantity    = $results-&gt;valid('quantity');
-                $price       = $results-&gt;valid('price');
-                $description = $results-&gt;valid('description');
-            };
-
-            $quantity ||= 1;
+sub default : Private {
+    my ($self, $c) = @_;
+    $c-&gt;stash-&gt;{'template'} = '[% action %]/default';
 
-            eval {
-                $c-&gt;stash-&gt;{'cart'}-&gt;add({
-                    sku         =&gt; $sku,
-                    quantity    =&gt; $quantity,
-                    price       =&gt; $price,
-                    description =&gt; $description
-                });
-            };
-            if ($@) {
-                push @messages, $@;
-            };
-        } else {
-            push @messages, map {$_} values %{$results-&gt;msgs};
+    if ($c-&gt;sessionid &amp;&amp; $c-&gt;session-&gt;{'shopper'}) {
+        if (my $cart = $c-&gt;forward('load')) {
+            $c-&gt;stash-&gt;{'cart'} = $cart;
+            $c-&gt;stash-&gt;{'items'} = $cart-&gt;items;
         };
     };
 
-    if (scalar @messages) {
-        $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/view.tt';
-        $c-&gt;stash-&gt;{'messages'} = \@messages;
-    } else {
-        $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% uri.replace('^/', '') %]/');
-    };
+    return;
 };
 
-sub update : Local {
-    my ($self, $c) = @_;
-    my @messages;
-    my $id       = $c-&gt;request-&gt;param('id');
-    my $quantity = $c-&gt;request-&gt;param('quantity');
+=head2 add
 
-    if ($c-&gt;req-&gt;method eq 'POST') {
-        my $results;
+=over
 
-        if ($DFV) {
-            $results = $DFV-&gt;check($c-&gt;req-&gt;parameters, 'cart_update');
-        };
+=item Parameters: (See L&lt;Handel::Cart/add&gt;)
 
-        if ($results || !$DFV) {
-            if ($results) {
-                $id       = $results-&gt;valid('id');
-                $quantity = $results-&gt;valid('quantity');
-            };
+=back
 
-            $quantity ||= 1;
+Adds an item to the current cart during POST.
 
-            my $item = $c-&gt;stash-&gt;{'cart'}-&gt;items({
-                id =&gt; $id
-            });
+    [% uri %]/add/
 
-            eval {
-                if ($item) {
-                    $item-&gt;quantity($quantity);
-                };
-            };
-            if ($@) {
-                push @messages, $@;
-            };
+=cut
 
-            undef $item;
-        } else {
-            push @messages, map {$_} values %{$results-&gt;msgs};
-        };
+sub add : Local {
+    my ($self, $c) = @_;
+    
+    if ($c-&gt;req-&gt;method eq 'POST') {
+        my $cart = $c-&gt;forward('create');
+        $cart-&gt;add($c-&gt;req-&gt;params);
     };
 
-    if (scalar @messages) {
-        $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/view.tt';
-        $c-&gt;stash-&gt;{'messages'} = \@messages;
-    } else {
-        $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% uri.replace('^/', '') %]/');
-    };
+    $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
 };
 
+=head2 clear
+
+Clears all items form the current shopping cart during POST.
+
+    [% uri %]/clear/
+
+=cut
+
 sub clear : Local {
     my ($self, $c) = @_;
-    my @messages;
 
     if ($c-&gt;req-&gt;method eq 'POST') {
-        eval {
-            $c-&gt;stash-&gt;{'cart'}-&gt;clear;
-        };
-        if ($@) {
-            push @messages, $@;
+        if (my $cart = $c-&gt;forward('load')) {
+            $cart-&gt;clear;
         };
     };
 
-    if (scalar @messages) {
-        $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/view.tt';
-        $c-&gt;stash-&gt;{'messages'} = \@messages;
+    $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
+};
+
+=head2 create
+
+Creats a new temporary shopping cart or returns the existing cart, creating a
+new session shopper id if necessary.
+
+    my $cart = $c-&gt;forward('create');
+
+=cut
+
+sub create : Private {
+    my ($self, $c) = @_;
+
+    if (!$c-&gt;session-&gt;{'shopper'}) {
+        $c-&gt;session-&gt;{'shopper'} = $c-&gt;model('[% model %]')-&gt;storage-&gt;new_uuid;
+    };
+
+    if (my $cart = $c-&gt;forward('load')) {
+        return $cart;
     } else {
-        $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% uri.replace('^/', '') %]/');
+        return $c-&gt;model('[% model %]')-&gt;create({
+            shopper =&gt; $c-&gt;session-&gt;{'shopper'},
+            type    =&gt; CART_TYPE_TEMP
+        });
     };
+
+    return;
 };
 
+=head2 delete
+
+=over
+
+=item Parameters: id
+
+=back
+
+Deletes an item from the current shopping cart during a POST.
+
+    [% uri %]/delete/
+
+=cut
+
 sub delete : Local {
     my ($self, $c) = @_;
-    my @messages;
-    my $id = $c-&gt;request-&gt;param('id');
 
     if ($c-&gt;req-&gt;method eq 'POST') {
-        my $results;
+        if ($c-&gt;forward('validate')) {
+            if (my $cart = $c-&gt;forward('load')) {
+                $cart-&gt;delete({
+                    id =&gt; $c-&gt;req-&gt;params-&gt;{'id'}
+                });
 
-        if ($DFV) {
-            $results = $DFV-&gt;check($c-&gt;req-&gt;parameters, 'cart_delete');
+                $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
+            };
+        } else {
+            $c-&gt;forward('default');
         };
+    } else {
+        $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
+    };
 
-        if ($results || !$DFV) {
-            if ($results) {
-                $id       = $results-&gt;valid('id');
-            };
+    return;
+};
 
-            eval {
-                $c-&gt;stash-&gt;{'cart'}-&gt;delete({
-                    id =&gt; $id
-                });
-            };
-            if ($@) {
-                push @messages, $@;
+=head2 destroy
+
+=over
+
+=item Parameters: id
+
+=back
+
+Deletes the specified saved cart and all of its items during a POST.
+
+    [% uri %]/destroy/
+
+=cut
+
+sub destroy : Local {
+    my ($self, $c) = @_;
+
+    if ($c-&gt;req-&gt;method eq 'POST') {
+        if ($c-&gt;forward('validate')) {
+            my $cart = $c-&gt;model('[% model %]')-&gt;search({
+                id      =&gt; $c-&gt;req-&gt;params-&gt;{'id'},
+                shopper =&gt; $c-&gt;session-&gt;{'shopper'},
+                type    =&gt; CART_TYPE_SAVED
+            })-&gt;first;
+
+            if ($cart) {
+                $cart-&gt;destroy;
+            } else {
+                warn &quot;not cart&quot;;
             };
+
+            $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/list/'));
         } else {
-            push @messages, map {$_} values %{$results-&gt;msgs};
+            $c-&gt;forward('list');
         };
-    };
-
-    if (scalar @messages) {
-        $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/view.tt';
-        $c-&gt;stash-&gt;{'messages'} = \@messages;
     } else {
-        $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% uri.replace('^/', '') %]/');
+        $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
     };
+
+    return;
 };
 
-sub empty : Local {
-    my ($self, $c) = @_;
+=head2 list
 
-    $c-&gt;forward('clear');
-};
+Displays a list of the current shoppers saved carts/wishlists.
+
+    [% uri %]/list/
+
+=cut
 
 sub list : Local {
     my ($self, $c) = @_;
-    my @messages;
+    $c-&gt;stash-&gt;{'template'} = '[% action %]/list';
 
-    eval {
-        $c-&gt;stash-&gt;{'carts'} = $c-&gt;model('[% model %]')-&gt;load({
-            shopper =&gt; $c-&gt;stash-&gt;{'shopperid'},
+    if ($c-&gt;sessionid &amp;&amp; $c-&gt;session-&gt;{'shopper'}) {
+        my $carts = $c-&gt;model('[% model %]')-&gt;search({
+            shopper =&gt; $c-&gt;session-&gt;{'shopper'},
             type    =&gt; CART_TYPE_SAVED
-        }, RETURNAS_ITERATOR);
-    };
-    if ($@) {
-        push @messages, $@;
+        });
 
-        $c-&gt;stash-&gt;{'messages'} = \@messages;
+        $c-&gt;stash-&gt;{'carts'} = $carts;
     };
 
-    $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/list.tt';
+    return;
 };
 
-sub save : Local {
-    my ($self, $c) = @_;
-    my @messages;
-    my $name = $c-&gt;req-&gt;param('name');
+=head2 load
 
-    if ($c-&gt;req-&gt;method eq 'POST') {
-        my $results;
+Loads the shoppers current cart.
 
-        if ($DFV) {
-            $results = $DFV-&gt;check($c-&gt;req-&gt;parameters, 'cart_save');
-        };
+    my $cart = $c-&gt;forward('load');
 
-        if ($results || !$DFV) {
-            if ($results) {
-                $name = $results-&gt;valid('name');
-            };
+=cut
 
-            eval {
-                $c-&gt;stash-&gt;{'cart'}-&gt;name($name);
-                $c-&gt;stash-&gt;{'cart'}-&gt;save;
-            };
-            if ($@) {
-                push @messages, $@;
-            };
+sub load : Private {
+    my ($self, $c) = @_;
 
-        } else {
-            push @messages, map {$_} values %{$results-&gt;msgs};
-        };
+    if ($c-&gt;sessionid &amp;&amp; $c-&gt;session-&gt;{'shopper'}) {
+        return $c-&gt;model('[% model %]')-&gt;search({
+            shopper =&gt; $c-&gt;session-&gt;{'shopper'},
+            type    =&gt; CART_TYPE_TEMP
+        })-&gt;first;
     };
 
-    if (scalar @messages) {
-        $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/view.tt';
-        $c-&gt;stash-&gt;{'messages'} = \@messages;
-    } else {
-        $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% uri.replace('^/', '') %]/');
-    };
+    return;
 };
 
+=head2 restore
+
+=over
+
+=item Parameters: id
+
+=back
+
+Restores a saved shopping cart into the shoppers current cart during a POST.
+
+    [% uri %]/restore/
+
+=cut
+
 sub restore : Local {
     my ($self, $c) = @_;
-    my @messages;
-    my $id   = $c-&gt;req-&gt;param('id');
-    my $mode = $c-&gt;req-&gt;param('mode') || CART_MODE_APPEND;
 
     if ($c-&gt;req-&gt;method eq 'POST') {
-        my $results;
-
-        if ($DFV) {
-            $results = $DFV-&gt;check($c-&gt;req-&gt;parameters, 'cart_restore');
+        if ($c-&gt;forward('validate')) {
+            if (my $cart = $c-&gt;forward('create')) {
+                $cart-&gt;restore({
+                    id      =&gt; $c-&gt;req-&gt;param('id'),
+                    shopper =&gt; $c-&gt;session-&gt;{'shopper'},
+                    type    =&gt; CART_TYPE_SAVED
+                }, $c-&gt;req-&gt;param('mode') || CART_MODE_APPEND);
+
+                $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
+            };
+        } else {
+            $c-&gt;forward('list');
         };
+    } else {
+        $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
+    };
 
-        if ($results || !$DFV) {
-            if ($results) {
-                $id   = $results-&gt;valid('id');
-                $mode = $results-&gt;valid('mode');
-            };
+    return;
+};
 
-            eval {
-                $c-&gt;stash-&gt;{'cart'}-&gt;restore({id =&gt; $id}, $mode);
-            };
-            if ($@) {
-                push @messages, $@;
-            };
+=head2 save
+
+=over
+
+=item Parameters: name
+
+=back
 
-            $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% uri.replace('^/', '') %]/');
+Saves the current cart with the name specified.
+
+    [% uri %]/save/
+
+=cut
+
+sub save : Local {
+    my ($self, $c) = @_;
+
+    if ($c-&gt;req-&gt;method eq 'POST') {
+        if ($c-&gt;forward('validate')) {
+            if (my $cart = $c-&gt;forward('load')) {
+                $cart-&gt;name($c-&gt;req-&gt;param('name') || 'My Cart');
+                $cart-&gt;save;
+
+                $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/list/'));
+            };
         } else {
-            push @messages, map {$_} values %{$results-&gt;msgs};
+            $c-&gt;forward('default');
         };
-    };
-
-    if (scalar @messages) {
-        $c-&gt;stash-&gt;{'messages'} = \@messages;
-        $c-&gt;forward('list');
     } else {
-        $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% uri.replace('^/', '') %]/');
+        $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
     };
+
+    return;
 };
 
-sub destroy : Local {
+=head2 update
+
+=over
+
+=item Parameters: quantity
+
+=back
+
+Updates the specified cart item qith the quantity given.
+
+    [% uri %]/update/
+
+=cut
+
+sub update : Local {
     my ($self, $c) = @_;
-    my @messages;
-    my $id = $c-&gt;req-&gt;param('id');
 
     if ($c-&gt;req-&gt;method eq 'POST') {
-        my $results;
+        if ($c-&gt;forward('validate')) {
+            if (my $cart = $c-&gt;forward('load')) {
+                my $item = $cart-&gt;items({
+                    id =&gt; $c-&gt;req-&gt;param('id')
+                })-&gt;first;
 
-        if ($DFV) {
-            $results = $DFV-&gt;check($c-&gt;req-&gt;parameters, 'cart_destroy');
-        };
-
-        if ($results || !$DFV) {
-            if ($results) {
-                $id   = $results-&gt;valid('id');
-            };
+                if ($item) {
+                    $item-&gt;quantity($c-&gt;req-&gt;param('quantity'));
+                };
 
-            eval {
-                $c-&gt;model('[% model %]')-&gt;destroy({
-                    id =&gt; $id
-                });
-            };
-            if ($@) {
-                push @messages, $@;
+                $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
             };
         } else {
-            push @messages, map {$_} values %{$results-&gt;msgs};
+            $c-&gt;forward('default');
         };
+    } else {
+        $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
+    };
+
+    return;
+};
+
+=head2 validate
+
+Validates the current form parameters using the profile in profiles.yml that
+matches the current action.
+
+    if ($c-&gt;forward('validate')) {
+    
     };
 
-    if (scalar @messages) {
-        $c-&gt;stash-&gt;{'messages'} = \@messages;
-        $c-&gt;forward('list');
+=cut
+
+sub validate : Private {
+    my ($self, $c) = @_;
+
+    $self-&gt;{'validator'}-&gt;results-&gt;clear;
+
+    my $results = $self-&gt;{'validator'}-&gt;check(
+        $c-&gt;req,
+        $self-&gt;{'profiles'}-&gt;{$c-&gt;action}
+    );
+
+    if ($results-&gt;success) {
+        return $results;
     } else {
-        $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% uri.replace('^/', '') %]/list/');
+        $c-&gt;stash-&gt;{'errors'} = $results-&gt;messages($c-&gt;action);
     };
+
+    return;
 };
 
+=head1 AUTHOR
+
+A clever guy
+
+=head1 LICENSE
+
+This library is free software, you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
 1;
 __test__
-use Test::More tests =&gt; 2;
+use Test::More tests =&gt; 3;
 use strict;
 use warnings;
 
 use_ok('Catalyst::Test', '[% app %]');
 use_ok('[% class %]');
-__view__
-[% TAGS [- -] %]
+
+ok(request('[% uri %]')-&gt;is_success, 'Request should succeed');
+__default__
+[% TAGS [- -] -%]
 [% USE HTML %]
 &lt;h1&gt;Your Shopping Cart&lt;/h1&gt;
-&lt;p&gt;
-    &lt;a href=&quot;[% base _ '[- uri.replace('^/', '') -]/' %]&quot;&gt;View Cart&lt;/a&gt; |
-    &lt;a href=&quot;[% base _ '[- uri.replace('^/', '') -]/list/' %]&quot;&gt;View Saved Carts&lt;/a&gt;
-&lt;/p&gt;
-[% IF messages %]
-    &lt;ul&gt;
-        [% FOREACH message IN messages %]
-            &lt;li&gt;[% message %]&lt;/li&gt;
-        [% END %]
-    &lt;/ul&gt;
-[% END %]
-[% IF cart.count %]
+[% INCLUDE [- action -]/errors %]
+[% IF items.count %]
     &lt;table border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;5&quot;&gt;
         &lt;tr&gt;
             &lt;th align=&quot;left&quot;&gt;SKU&lt;/th&gt;
@@ -602,9 +550,9 @@ __view__
             &lt;th align=&quot;right&quot;&gt;Total&lt;/th&gt;
             &lt;th colspan=&quot;2&quot;&gt;&lt;/th&gt;
         &lt;/tr&gt;
-    [% FOREACH item = cart.items %]
+	[% WHILE (item = items.next) %]
         &lt;tr&gt;
-            &lt;form action=&quot;[% base _ '[- uri.replace('^/', '') -]/update/' %]&quot; method=&quot;post&quot;&gt;
+            &lt;form action=&quot;[% c.uri_for('[- uri -]/update/') %]&quot; method=&quot;post&quot;&gt;
                 &lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;[% HTML.escape(item.id) %]&quot;&gt;
                 &lt;td align=&quot;left&quot;&gt;[% HTML.escape(item.sku) %]&lt;/td&gt;
                 &lt;td align=&quot;left&quot;&gt;[% HTML.escape(item.description) %]&lt;/td&gt;
@@ -613,14 +561,14 @@ __view__
                 &lt;td align=&quot;right&quot;&gt;[% HTML.escape(item.total.format(undef, 'FMT_SYMBOL')) %]&lt;/td&gt;
                 &lt;td&gt;&lt;input type=&quot;submit&quot; value=&quot;Update&quot;&gt;&lt;/td&gt;
             &lt;/form&gt;
-            &lt;form action=&quot;[% base _ '[- uri.replace('^/', '') -]/delete/' %]&quot; method=&quot;post&quot;&gt;
+            &lt;form action=&quot;[% c.uri_for('[- uri -]/delete/') %]&quot; method=&quot;POST&quot;&gt;
                 &lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;[% HTML.escape(item.id) %]&quot;&gt;
                 &lt;td&gt;
                     &lt;input type=&quot;submit&quot; value=&quot;Delete&quot;&gt;
                 &lt;/td&gt;
             &lt;/form&gt;
         &lt;/tr&gt;
-    [% END %]
+	[% END %]
         &lt;tr&gt;
             &lt;td colspan=&quot;7&quot; height=&quot;20&quot;&gt;&lt;/td&gt;
         &lt;/tr&gt;
@@ -631,16 +579,16 @@ __view__
         &lt;/tr&gt;
         &lt;tr&gt;
             &lt;td colspan=&quot;7&quot; align=&quot;right&quot;&gt;
-                &lt;form action=&quot;[% base _ '[- uri.replace('^/', '') -]/empty/' %]&quot; method=&quot;post&quot;&gt;
+                &lt;form action=&quot;[% c.uri_for('[- uri -]/clear/') %]&quot; method=&quot;POST&quot;&gt;
                     &lt;input type=&quot;submit&quot; value=&quot;Empty Cart&quot;&gt;
                 &lt;/form&gt;
-                &lt;form action=&quot;[% base  _ '[- couri.replace('^/', '') -]/' %]&quot; method=&quot;get&quot;&gt;
+                &lt;form action=&quot;[% c.uri_for('/[- couri -]/') %]&quot; method=&quot;POST&quot;&gt;
                     &lt;input type=&quot;submit&quot; value=&quot;Checkout&quot;&gt;
                 &lt;/form&gt;
             &lt;/td&gt;
         &lt;/tr&gt;
     &lt;/table&gt;
-    &lt;form action=&quot;[% base _ '[- uri.replace('^/', '') -]/save/' %]&quot; method=&quot;post&quot;&gt;
+    &lt;form action=&quot;[% c.uri_for('[- uri -]/save/') %]&quot; method=&quot;POST&quot;&gt;
         &lt;input type=&quot;text&quot; name=&quot;name&quot;&gt;
         &lt;input type=&quot;submit&quot; value=&quot;Save Cart&quot;&gt;
     &lt;/form&gt;
@@ -648,20 +596,10 @@ __view__
     &lt;p&gt;Your shopping cart is empty.&lt;/p&gt;
 [% END %]
 __list__
-[% TAGS [- -] %]
+[% TAGS [- -] -%]
 [% USE HTML %]
 &lt;h1&gt;Your Saved Shopping Carts&lt;/h1&gt;
-&lt;p&gt;
-    &lt;a href=&quot;[% base _ '[- uri.replace('^/', '') -]/' %]&quot;&gt;View Cart&lt;/a&gt; |
-    &lt;a href=&quot;[% base _ '[- uri.replace('^/', '') -]/list/' %]&quot;&gt;View Saved Carts&lt;/a&gt;
-&lt;/p&gt;
-[% IF messages %]
-    &lt;ul&gt;
-        [% FOREACH message IN messages %]
-            &lt;li&gt;[% message %]&lt;/li&gt;
-        [% END %]
-    &lt;/ul&gt;
-[% END %]
+[% INCLUDE [- action -]/errors %]
 [% IF carts.count %]
     &lt;table border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;5&quot;&gt;
         &lt;tr&gt;
@@ -673,7 +611,7 @@ __list__
         &lt;tr&gt;
             &lt;td align=&quot;left&quot; valign=&quot;top&quot;&gt;[% HTML.escape(cart.name) %]&lt;/td&gt;
             &lt;td&gt;
-                &lt;form action=&quot;[% base _ '[- uri.replace('^/', '') -]/restore/' %]&quot; method=&quot;POST&quot;&gt;
+                &lt;form action=&quot;[% c.uri_for('[- uri -]/restore/') %]&quot; method=&quot;POST&quot;&gt;
                     &lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;[% HTML.escape(cart.id) %]&quot;&gt;
                     &lt;select name=&quot;mode&quot;&gt;
                         [% USE hc = Handel.Constants %]
@@ -685,7 +623,7 @@ __list__
                 &lt;/form&gt;
             &lt;/td&gt;
             &lt;td&gt;
-                &lt;form action=&quot;[% base _ '[- uri.replace('^/', '') -]/destroy/' %]&quot; method=&quot;POST&quot;&gt;
+                &lt;form action=&quot;[% c.uri_for('[- uri -]/destroy/') %]&quot; method=&quot;POST&quot;&gt;
                     &lt;input type=&quot;hidden&quot; name=&quot;id&quot; value=&quot;[% HTML.escape(cart.id) %]&quot;&gt;
                     &lt;input type=&quot;submit&quot; value=&quot;Delete&quot;&gt;
                 &lt;/form&gt;
@@ -696,60 +634,117 @@ __list__
 [% ELSE %]
     &lt;p&gt;You have no saved shopping carts.&lt;/p&gt;
 [% END %]
+__errors__
+[% TAGS [- -] -%]
+[% IF errors %]
+	&lt;ul class=&quot;errors&quot;&gt;
+	[% FOREACH error IN errors %]
+		&lt;li&gt;[% HTML.escape(error) %]&lt;/li&gt;
+	[% END %]
+	&lt;/ul&gt;
+[% END %]
+__messages__
+[% action %]/save:
+  name:
+    NOT_BLANK: The name field cannot be empty.
+    LENGTH: The name field must be between 1 and 50 characters.
+[% action %]/update:
+  id:
+    REGEX: The id field is in the wrong format.
+  quantity:
+    NOT_BLANK: The quantity field cannot be empty.
+    UINT: The quantity field must be a positive number.
+[% action %]/delete:
+  id:
+    REGEX: The id field is in the wrong format.
+[% action %]/destroy:
+  id:
+    REGEX: The id field is in the wrong format.
+[% action %]/restore:
+  id:
+    REGEX: The id field is in the wrong format.
+  mode:
+    BETWEEN: The mode field must be between 1 and 3.
+__profiles__
+[% action %]/save:
+  - name
+  - [ [NOT_BLANK], [LENGTH, 1, 50] ]
+[% action %]/delete:
+  - id
+  -
+    -
+      - REGEX
+      - !perl/regexp:
+        REGEXP: '^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$'
+        MODIFIERS: i
+[% action %]/destroy:
+  - id
+  -
+    -
+      - REGEX
+      - !perl/regexp:
+        REGEXP: '^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$'
+        MODIFIERS: i
+[% action %]/update:
+  - id
+  -
+    -
+      - REGEX
+      - !perl/regexp:
+        REGEXP: '^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$'
+        MODIFIERS: i
+  - quantity
+  - [ [NOT_BLANK], [UINT] ]
+[% action %]/restore:
+  - id
+  -
+    -
+      - REGEX
+      - !perl/regexp:
+        REGEXP: '^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$'
+        MODIFIERS: i
+  - mode
+  - [ [BETWEEN, 1, 3] ]
+__products__
+&lt;!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Strict//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd&quot;&gt;
+&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xml:lang=&quot;en&quot; lang=&quot;en&quot;&gt;
+	&lt;head&gt;
+		&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=utf-8&quot; /&gt;
+		&lt;title&gt;Nifty New Products&lt;/title&gt;
+		&lt;base href=&quot;http://localhost:3000/&quot; /&gt;
+	&lt;/head&gt;
+	&lt;body&gt;
+		&lt;h1&gt;Nifty New Products&lt;/h1&gt;
+		&lt;p&gt;
+			&lt;a href=&quot;[% uri %]/&quot;&gt;View Cart&lt;/a&gt; |
+		&lt;/p&gt;
+		&lt;h2&gt;Mendlefarg 3000&lt;/h2&gt;
+		&lt;p&gt;
+			It slices. It dices. It MVCs!
+		&lt;/p&gt;
+		&lt;form action=&quot;[% uri %]/add/&quot; method=&quot;POST&quot;&gt;
+		  &lt;p&gt;
+    			&lt;input type=&quot;hidden&quot; name=&quot;sku&quot; value=&quot;MFG3000&quot; /&gt;
+    			&lt;input type=&quot;hidden&quot; name=&quot;description&quot; value=&quot;Mendlefarg 3000&quot; /&gt;
+    			&lt;input type=&quot;hidden&quot; name=&quot;price&quot; value=&quot;19.95&quot; /&gt;
+    			&lt;input type=&quot;text&quot; name=&quot;quantity&quot; value=&quot;1&quot; size=&quot;3&quot; /&gt;
+    			&lt;input type=&quot;submit&quot; value=&quot;Add To Cart&quot; /&gt;
+          &lt;/p&gt;
+         &lt;/form&gt;
+
+		&lt;h2&gt;Flimblebot 98&lt;/h2&gt;
+		&lt;p&gt;
+			The most advanced flimble-based bot response software ever!
+		&lt;/p&gt;
+		&lt;form action=&quot;[% uri %]/add/&quot; method=&quot;POST&quot;&gt;
+		  &lt;p&gt;
+			&lt;input type=&quot;hidden&quot; name=&quot;sku&quot; value=&quot;FB98&quot; /&gt;
+			&lt;input type=&quot;hidden&quot; name=&quot;description&quot; value=&quot;Flimblebot 98 Single-User&quot; /&gt;
+			&lt;input type=&quot;hidden&quot; name=&quot;price&quot; value=&quot;12.34&quot; /&gt;
+			&lt;input type=&quot;text&quot; name=&quot;quantity&quot; value=&quot;1&quot; size=&quot;3&quot; /&gt;
+			&lt;input type=&quot;submit&quot; value=&quot;Add To Cart&quot; /&gt;
+          &lt;/p&gt;
+		&lt;/form&gt;
+	&lt;/body&gt;
+&lt;/html&gt;
 __END__
-
-=head1 NAME
-
-Catalyst::Helper::Controller::Handel::Cart - Helper for Handel::Cart Controllers
-
-=head1 SYNOPSIS
-
-    script/create.pl controller &lt;newclass&gt; Handel::Cart [&lt;modelclass&gt; &lt;checkoutcontroller&gt;]
-    script/create.pl controller Cart       Handel::Cart Cart Checkout
-
-=head1 DESCRIPTION
-
-A Helper for creating controllers based on Handel::Cart objects. If no modelclass
-is specified, ::M::Cart is assumed.
-
-Both the modelclass and checkoutcontroller arguments try to do the right thing with the
-names given to them.
-
-For example, you can pass the shortened class name without the MyApp::M/C, or pass the fully
-qualified package name:
-
-    MyApp::M::CartModel
-    MyApp::Model::CartModel
-    CartModel
-
-In all three cases everything before M{odel)|C(ontroller) will be stripped and the class CartModel
-will be used.
-
-By default, the code generated by this helper requires Data::FormValidator 4.00 or greater
-to be installed for it's form validation. If you don't want to install Data::FormValidator,
-simply comment out this line in the generated controller class:
-
-    use Data::FormValidator 4.00;
-
-The code is designed to work without Data::FormValidator 4.00 installed.
-
-=head1 METHODS
-
-=head2 mk_compclass
-
-Makes a Handel::Cart Controller class and template files for you.
-
-=head2 mk_comptest
-
-Makes a Handel::Cart Controller test for you.
-
-=head1 SEE ALSO
-
-L&lt;Catalyst::Manual&gt;, L&lt;Catalyst::Helper&gt;, L&lt;Handel::Cart&gt;
-
-=head1 AUTHOR
-
-    Christopher H. Laco
-    CPAN ID: CLACO
-    claco@chrislaco.com
-    http://today.icantfocus.com/blog/</diff>
      <filename>lib/Catalyst/Helper/Controller/Handel/Cart.pm</filename>
    </modified>
    <modified>
      <diff>@@ -1,9 +1,52 @@
 # $Id$
+## no critic (ProhibitCaptureWithoutTest)
 package Catalyst::Helper::Controller::Handel::Checkout;
 use strict;
 use warnings;
-use Path::Class;
-use Catalyst 5.56;
+
+BEGIN {
+    use Catalyst 5.7001;
+    use Catalyst::Utils;
+    use Path::Class;
+};
+
+=head1 NAME
+
+Catalyst::Helper::Controller::Handel::Checkout - Helper for Handel::Checkout Controllers
+
+=head1 SYNOPSIS
+
+    script/create.pl controller &lt;newclass&gt; Handel::Checkout [&lt;cartmodel&gt; &lt;ordermodel&gt; &lt;cartcontroller&gt; &lt;ordercontroller&gt;]
+    script/create.pl controller Checkout Handel::Checkout
+
+=head1 DESCRIPTION
+
+A Helper for creating controllers based on Handel::Checkout objects. IF no cartmodel or
+ordermodel was specified, ::M::Cart and ::M::Orders is assumed.
+
+The cartmode, ordermodel, cartcontroller and ordercontroller arguments try to do the
+right thing with the names given to them.
+
+For example, you can pass the shortened class name without the MyApp::M/C, or pass the fully
+qualified package name:
+
+    MyApp::M::CartModel
+    MyApp::Model::CartModel
+    CartModel
+
+In all three cases everything before M{odel)|C(ontroller) will be stripped and the class CartModel
+will be used.
+
+B&lt;The code generated by this helper requires FormValidator::Simple, HTML::FIllInForm and YAML to be
+installed to operate.&gt;
+
+=head1 METHODS
+
+=head2 mk_compclass
+
+Makes a Handel::Checkout Controller class and template files for you.
+
+=cut
 
 sub mk_compclass {
     my ($self, $helper, $cmodel, $omodel, $ccontroller, $ocontroller) = @_;
@@ -11,474 +54,400 @@ sub mk_compclass {
     my $dir  = dir($helper-&gt;{'base'}, 'root', $helper-&gt;{'uri'});
 
     $cmodel      ||= 'Cart';
-    $omodel      ||= 'Orders';
+    $omodel      ||= 'Order';
     $ccontroller ||= 'Cart';
-    $ocontroller ||= 'Orders';
+    $ocontroller ||= 'Order';
+
+    $ccontroller =~ /^(.*::C(ontroller)?::)?(.*)$/i;
+    $ccontroller = $3 ? $3 : 'Cart';
+    $helper-&gt;{'ccontroller'} = $ccontroller;
+
+    $ocontroller =~ /^(.*::C(ontroller)?::)?(.*)$/i;
+    $ocontroller = $3 ? $3 : 'Order';
+    $helper-&gt;{'ocontroller'} = $ocontroller;
 
-    $cmodel = $cmodel =~ /^(.*::M(odel)?::)?(.*)$/i ? $3 : 'Cart';
+    $cmodel =~ /^(.*::M(odel)?::)?(.*)$/i;
+    $cmodel = $3 ? $3 : 'Cart';
     $helper-&gt;{'cmodel'} = $cmodel;
 
-    $omodel = $omodel =~ /^(.*::M(odel)?::)?(.*)$/i ? $3 : 'Orders';
+    $omodel =~ /^(.*::M(odel)?::)?(.*)$/i;
+    $omodel = $3 ? $3 : 'Order';
     $helper-&gt;{'omodel'} = $omodel;
 
-    my $curi = $ccontroller =~ /^(.*::C(ontroller)?::)?(.*)$/i ? lc($3) : 'cart';
+    #$ccontroller =~ /^(.*::C(ontroller)?::)?(.*)$/i;
+    my $curi = $ccontroller;
     $curi =~ s/::/\//g;
     $helper-&gt;{'curi'} = $curi;
 
-    my $ouri = $ocontroller =~ /^(.*::C(ontroller)?::)?(.*)$/i ? lc($3) : 'orders';
+    #$ocontroller =~ /^(.*::C(ontroller)?::)?(.*)$/i;
+    my $ouri = $ocontroller;
     $ouri =~ s/::/\//g;
     $helper-&gt;{'ouri'} = $ouri;
 
+    $helper-&gt;{'action'} = Catalyst::Utils::class2prefix($helper-&gt;{'class'});
+
     $helper-&gt;mk_dir($dir);
     $helper-&gt;render_file('controller', $file);
-    $helper-&gt;render_file('edit', file($dir, 'edit.tt'));
-    $helper-&gt;render_file('preview', file($dir, 'preview.tt'));
-    $helper-&gt;render_file('payment', file($dir, 'payment.tt'));
-    $helper-&gt;render_file('complete', file($dir, 'complete.tt'));
+
+    $helper-&gt;render_file('default', file($dir, 'default'));
+    $helper-&gt;render_file('billing', file($dir, 'billing'));
+    $helper-&gt;render_file('billing', file($dir, 'billing'));
+    $helper-&gt;render_file('preview', file($dir, 'preview'));
+    $helper-&gt;render_file('payment', file($dir, 'payment'));
+    $helper-&gt;render_file('complete', file($dir, 'complete'));
+
+    $helper-&gt;render_file('errors', file($dir, 'errors'));
+    $helper-&gt;render_file('profiles', file($dir, 'profiles.yml'));
+    $helper-&gt;render_file('messages', file($dir, 'messages.yml'));
+
+    return 1;
 };
 
+=head2 mk_comptest
+
+Makes a Handel::Checkout Controller test for you.
+
+=cut
+
 sub mk_comptest {
     my ($self, $helper) = @_;
     my $test = $helper-&gt;{'test'};
 
     $helper-&gt;render_file('test', $test);
+
+    return 1;
 };
 
+=head1 SEE ALSO
+
+L&lt;Catalyst::Manual&gt;, L&lt;Catalyst::Helper&gt;, L&lt;Handel::Checkout&gt;
+
+=head1 AUTHOR
+
+    Christopher H. Laco
+    CPAN ID: CLACO
+    claco@chrislaco.com
+    http://today.icantfocus.com/blog/
+
+=cut
+
 1;
 __DATA__
+
+=begin pod_to_ignore
+
 __controller__
 package [% class %];
 use strict;
 use warnings;
-use Handel::Checkout;
-use Handel::Constants qw(:returnas :order :cart :checkout);
-use Data::FormValidator 4.00;
-use HTML::FillInForm 1.04;
-use base 'Catalyst::Base';
-
-our $DFV;
-our $FIF;
-
-# Until this patch [hopefully] get's dumped into DFV 4.03, I've inlined the msgs
-# method below with the following path applied to it:
-#
-#--- Results.pm.orig Wed Aug 31 22:27:27 2005
-#+++ Results.pm  Wed Sep 14 17:40:28 2005
-#@@ -584,7 +584,9 @@
-#    if ($self-&gt;has_missing) {
-#        my $missing = $self-&gt;missing;
-#        for my $m (@$missing) {
-#-           $msgs{$m} = _error_msg_fmt($profile{format},$profile{missing});
-#+            $msgs{$m} = _error_msg_fmt($profile{format},
-#+                (ref $profile{missing} eq 'HASH' ?
-#+                    ($profile{missing}-&gt;{$m} || $profile{missing}-&gt;{default} || 'Missing') : $profile{missing}));
-#        }
-#    }
 
 BEGIN {
-    eval 'use HTML::FillInForm 1.04';
-    if (!$@) {
-        $FIF = HTML::FillInForm-&gt;new;
-    };
+    use base qw/Catalyst::Controller/;
+    use Handel::Checkout;
+    use Handel::Constants qw/:cart :order :checkout/;
+    use FormValidator::Simple 0.17;
+    use HTML::FillInForm;
+    use YAML;
+};
 
-    eval 'use Data::FormValidator 4.00';
-    if (!$@) {
-        #############################################################
-        # This is here until the patch makes it to release
-        #############################################################
-        no warnings 'redefine';
-        sub Data::FormValidator::Results::msgs {
-            my $self = shift;
-            my $controls = shift || {};
-            if (defined $controls and ref $controls ne 'HASH') {
-                die &quot;$0: parameter passed to msgs must be a hash ref&quot;;
-            }
-
-
-            # Allow msgs to be called more than one to accumulate error messages
-            $self-&gt;{msgs} ||= {};
-            $self-&gt;{profile}{msgs} ||= {};
-            $self-&gt;{msgs} = { %{ $self-&gt;{msgs} }, %$controls };
-
-            # Legacy typo support.
-            for my $href ($self-&gt;{msgs}, $self-&gt;{profile}{msgs}) {
-                if (
-                     (not defined $href-&gt;{invalid_separator})
-                     &amp;&amp;  (defined $href-&gt;{invalid_seperator})
-                 ) {
-                    $href-&gt;{invalid_separator} = $href-&gt;{invalid_seperator};
-                }
-            }
-
-            my %profile = (
-                prefix  =&gt; '',
-                missing =&gt; 'Missing',
-                invalid =&gt; 'Invalid',
-                invalid_separator =&gt; ' ',
-
-                format  =&gt; '&lt;span style=&quot;color:red;font-weight:bold&quot;&gt;&lt;span class=&quot;dfv_errors&quot;&gt;* %s&lt;/span&gt;&lt;/span&gt;',
-                %{ $self-&gt;{msgs} },
-                %{ $self-&gt;{profile}{msgs} },
-            );
+=head1 NAME
+
+[% class %] - Catalyst Controller
+
+=head1 DESCRIPTION
+
+Catalyst Controller.
+
+=head1 METHODS
+
+=head2 COMPONENT
+
+=cut
+
+sub COMPONENT {
+    my $self = shift-&gt;NEXT::COMPONENT(@_);
+
+    $self-&gt;{'validator'} = FormValidator::Simple-&gt;new;
+    $self-&gt;{'validator'}-&gt;set_messages(
+        $_[0]-&gt;path_to('root', '[% action %]', 'messages.yml')
+    );
+
+    $self-&gt;{'fif'} = HTML::FillInForm-&gt;new;
+
+    $self-&gt;{'profiles'} = YAML::LoadFile($_[0]-&gt;path_to('root', '[% action %]', 'profiles.yml'));
 
+    return $self;
+};
+
+=head2 default 
+
+Default action when browsing to [% uri %]/ that loads the checkout process for
+the current shopper. If no session exists, or the shopper id isn't set, or there
+os no temporary order record, nothing will be loaded. This keeps non-shoppers 
+like Google and others from wasting sessions and order records for no good
+reason.
+
+=cut
 
-            my %msgs = ();
-
-            # Add invalid messages to hash
-                #  look at all the constraints, look up their messages (or provide a default)
-                #  add field + formatted constraint message to hash
-            if ($self-&gt;has_invalid) {
-                my $invalid = $self-&gt;invalid;
-                for my $i ( keys %$invalid ) {
-                    $msgs{$i} = join $profile{invalid_separator}, map {
-                        Data::FormValidator::Results::_error_msg_fmt($profile{format},($profile{constraints}{$_} || $profile{invalid}))
-                        } @{ $invalid-&gt;{$i} };
-                }
-            }
-
-            # Add missing messages, if any
-            if ($self-&gt;has_missing) {
-                my $missing = $self-&gt;missing;
-                for my $m (@$missing) {
-                    $msgs{$m} = Data::FormValidator::Results::_error_msg_fmt($profile{format},
-                      (ref $profile{missing} eq 'HASH' ?
-                          ($profile{missing}-&gt;{$m} || $profile{missing}-&gt;{default} || 'Missing') : $profile{missing}));
-                }
-            }
-
-            my $msgs_ref = Data::FormValidator::Results::prefix_hash($profile{prefix},\%msgs);
-
-            $msgs_ref-&gt;{ $profile{any_errors} } = 1 if defined $profile{any_errors};
-
-            return $msgs_ref;
-        }
-        #############################################################
-
-        $DFV = Data::FormValidator-&gt;new({
-            checkout_update =&gt; {
-                required =&gt; [qw/billtofirstname
-                                billtolastname
-                                billtoaddress1
-                                billtocity
-                                billtostate
-                                billtozip
-                                billtocountry
-                                billtoemail
-                                shiptofirstname
-                                shiptolastname
-                                shiptoaddress1
-                                shiptocity
-                                shiptostate
-                                shiptozip
-                                shiptocountry
-                                shiptoemail/],
-                field_filters =&gt; {
-                    billtofirstname =&gt; ['trim'],
-                    billtolastname  =&gt; ['trim'],
-                    billtoaddress1  =&gt; ['trim'],
-                    billtocity      =&gt; ['trim'],
-                    billtostate     =&gt; ['trim'],
-                    billtozip       =&gt; ['trim'],
-                    billtocountry   =&gt; ['trim'],
-                    billtoemail     =&gt; ['trim'],
-                    shiptofirstname =&gt; ['trim'],
-                    shiptolastname  =&gt; ['trim'],
-                    shiptoaddress1  =&gt; ['trim'],
-                    shiptocity      =&gt; ['trim'],
-                    shiptostate     =&gt; ['trim'],
-                    shiptozip       =&gt; ['trim'],
-                    shiptocountry   =&gt; ['trim'],
-                    shiptoemail     =&gt; ['trim'],
-                },
-                msgs =&gt; {
-                    missing =&gt; {
-                        default =&gt; 'Field is blank!',
-                        billtofirstname =&gt; 'The bill to first name field is required',
-                        billtolastname  =&gt; 'The bill to last name field is required',
-                        billtoaddress1  =&gt; 'The bill to address line 1 field is required',
-                        billtocity      =&gt; 'The bill to city field is required',
-                        billtostate     =&gt; 'The bill to state field is required',
-                        billtozip       =&gt; 'The bill to zip field is required',
-                        billtocountry   =&gt; 'The bill to country field is required',
-                        billtoemail     =&gt; 'The bill to email field is required',
-                        shiptofirstname =&gt; 'The ship to first name field is required',
-                        shiptolastname  =&gt; 'The ship to last name field is required',
-                        shiptoaddress1  =&gt; 'The ship to address line field is required',
-                        shiptocity      =&gt; 'The ship to city field is required',
-                        shiptostate     =&gt; 'The ship to state field is required',
-                        shiptozip       =&gt; 'The ship to zip field is required',
-                        shiptocountry   =&gt; 'The ship to country field is required',
-                        shiptoemail     =&gt; 'The ship to email field is required',
-                    },
-                    format =&gt; '%s'
-                }
-            },
-            checkout_payment =&gt; {
-                required =&gt; [qw/ccname cctype ccn ccm ccy/],
-                field_filters =&gt; {
-                    ccname =&gt; ['trim'],
-                    cctype =&gt; ['trim'],
-                    ccn    =&gt; ['trim'],
-                    ccm    =&gt; ['digit'],
-                    ccy    =&gt; ['digit'],
-                    ccvn   =&gt; ['digit'],
-                },
-                msgs =&gt; {
-                    missing =&gt; {
-                        default =&gt; 'Field is blank!',
-                        ccname  =&gt; 'The credit card name field is required',
-                        cctype  =&gt; 'The credit card type field is required',
-                        ccn     =&gt; 'The credit card number is required',
-                        ccm     =&gt; 'The credit card expiration month field is required',
-                        ccy     =&gt; 'The credit card expiration year is required',
-                        ccvn    =&gt; 'THe credit card verification number is required'
-                    },
-                    format =&gt; '%s'
-                }
-            }
-        });
+sub default : Private {
+    my ($self, $c) = @_;
+    $c-&gt;stash-&gt;{'template'} = '[% action %]/default';
+
+    if ($c-&gt;forward('load')) {
+        $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/billing/'));
     };
+
+    return;
 };
 
-sub begin : Private {
+=head2 billing
+
+Loads/saves the billing and shipping information during GET/POST.
+
+    [% uri %]/billing/
+
+=cut
+
+sub billing : Local {
     my ($self, $c) = @_;
-    my $shopperid = $c-&gt;req-&gt;cookie('shopperid');
+    $c-&gt;stash-&gt;{'template'} = '[% action %]/billing';
 
-    if (!$shopperid || !$shopperid-&gt;value) {
-        $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% curi %]/');
-    } else {
-        $shopperid = $shopperid-&gt;value;
-
-        $c-&gt;stash-&gt;{'shopperid'} = $shopperid;
-
-        my $cart = $c-&gt;model('[% cmodel %]')-&gt;load({
-            shopper =&gt; $shopperid,
-            type    =&gt; CART_TYPE_TEMP
-        }, RETURNAS_ITERATOR)-&gt;first;
-
-        if (!$cart || !$cart-&gt;count) {
-            $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% curi %]/');
-        } else {
-            my $order = $c-&gt;model('[% omodel %]')-&gt;load({
-                shopper =&gt; $shopperid,
-                type    =&gt; ORDER_TYPE_TEMP
-            }, RETURNAS_ITERATOR)-&gt;first;
-
-            if (!$order) {
-                $order = $c-&gt;model('[% omodel %]')-&gt;new({
-                    shopper =&gt; $shopperid,
-                    cart    =&gt; $cart
-                });
+    if (my $order = $c-&gt;forward('load')) {
+        $c-&gt;stash-&gt;{'order'} = $order;
 
+        if ($c-&gt;req-&gt;method eq 'POST') {
+            if ($c-&gt;forward('validate')) {
                 my $checkout = Handel::Checkout-&gt;new({
-                    order   =&gt; $order,
-                    phases =&gt; 'CHECKOUT_PHASE_INITIALIZE'
+                    order  =&gt; $order,
+                    phases =&gt; 'CHECKOUT_PHASE_VALIDATE'
                 });
 
-                $c-&gt;stash-&gt;{'order'} = $checkout-&gt;order;
-
                 if ($checkout-&gt;process == CHECKOUT_STATUS_OK) {
-
+                    if ($checkout-&gt;order-&gt;update($c-&gt;req-&gt;params)) {
+                        $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/preview/'));
+                    };
                 } else {
-                    $c-&gt;stash-&gt;{'messages'} = $checkout-&gt;messages;
+                    $c-&gt;stash-&gt;{'errors'} = $checkout-&gt;messages;
                 };
-            } else {
-                $order-&gt;reconcile($cart);
-                $c-&gt;stash-&gt;{'order'} = $order;
             };
         };
+    } else {
+        $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
     };
-};
-
-sub end : Private {
-    my ($self, $c) = @_;
 
-    $c-&gt;forward($c-&gt;view('TT'))
-        unless ( $c-&gt;res-&gt;output || $c-&gt;res-&gt;body || ! $c-&gt;stash-&gt;{template} );
-
-    if ($c-&gt;req-&gt;method eq 'POST' &amp;&amp; $c-&gt;stash-&gt;{'messages'} &amp;&amp; $FIF) {
-        ## Merge (erase) DFV Missing/Invalid fields from params before formfill
-        my %missing = ();
-        my %invalid = ();
-        my $results = $c-&gt;stash-&gt;{'_dfv_results'};
-        if (ref $results) {
-            %missing = map {$_ =&gt; ''} ($results-&gt;missing);
-            %invalid = map {$_ =&gt; ''} ($results-&gt;invalid);
-        };
-
-        my %parameters = (%{$c-&gt;req-&gt;parameters}, %missing, %invalid);
-
-        $c-&gt;res-&gt;output(
-            $FIF-&gt;fill(
-                scalarref =&gt; \$c-&gt;response-&gt;{body},
-                fdat =&gt; \%parameters
-            )
-        );
-    };
+    return;
 };
 
-sub default : Local {
-    my ($self, $c) = @_;
+=head2 load
 
-    $c-&gt;forward('edit');
-};
+Loads the current temporary order for the current shopper.
 
-sub edit : Local {
-    my ($self, $c) = @_;
+    my $order = $c-&gt;forward('load');
 
-    $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/edit.tt';
-};
+=cut
 
-sub update : Local {
+sub load : Private {
     my ($self, $c) = @_;
-    my @messages;
 
-    if ($c-&gt;req-&gt;method eq 'POST') {
-        my $results;
-
-        if ($DFV) {
-            $results = $DFV-&gt;check($c-&gt;req-&gt;parameters, 'checkout_update');
-        };
-
-        if ($results || !$DFV) {
-            eval {
-                my $order = $c-&gt;stash-&gt;{'order'};
-                if (!$order) {
-                    $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% curi %]/');
-                } else {
-                    foreach my $param ($c-&gt;req-&gt;param) {
-                        $order-&gt;autoupdate(0);
-                        if ($order-&gt;can($param)) {
-                            if (($order-&gt;$param || '') ne ($c-&gt;req-&gt;param($param || ''))) {
-                                $order-&gt;$param($c-&gt;req-&gt;param($param));
-                            };
-                        };
-                        $order-&gt;autoupdate(1);
-                        $order-&gt;update;
-                    };
+    if ($c-&gt;sessionid &amp;&amp; $c-&gt;session-&gt;{'shopper'}) {
+        if (my $order = $c-&gt;forward($c-&gt;controller('[% ocontroller %]'), 'load')) {
+            $order-&gt;reconcile(
+                $c-&gt;forward($c-&gt;controller('[% ccontroller %]'), 'load')
+            );
 
+            return $order;
+        } elsif (my $cart = $c-&gt;forward($c-&gt;controller('[% ccontroller %]'), 'load')) {
+            if ($cart-&gt;count) {
+                if (my $order = $c-&gt;forward($c-&gt;controller('[% ocontroller %]'), 'create', [$cart])) {
+                    
                     my $checkout = Handel::Checkout-&gt;new({
-                        order  =&gt; $order,
-                        phases =&gt; 'CHECKOUT_PHASE_VALIDATE'
+                        order   =&gt; $order,
+                        phases =&gt; 'CHECKOUT_PHASE_INITIALIZE'
                     });
 
-                    if ($checkout-&gt;process == CHECKOUT_STATUS_OK) {
-
-                    } else {
-                        push @messages, 'Failed to update your bill to/ship to address!';
-                        push @messages, @{$checkout-&gt;messages};
-                    };
+                    if ($checkout-&gt;process != CHECKOUT_STATUS_OK) {
+                        $c-&gt;stash-&gt;{'errors'} = $checkout-&gt;messages;
+                    };                    
+                    
+                    return $checkout-&gt;order;
                 };
             };
-            if ($@) {
-                push @messages, $@;
-            };
-        } else {
-            $c-&gt;stash-&gt;{'_dfv_results'} = $results;
-            push @messages, map {$_} values %{$results-&gt;msgs};
-        };
-        if (scalar @messages) {
-            $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/edit.tt';
-            $c-&gt;stash-&gt;{'messages'} = \@messages;
-        } else {
-            $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% uri.replace('^/', '') %]/preview/');
         };
     };
-};
-
-sub preview : Local {
-    my ($self, $c) = @_;
 
-    $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/preview.tt';
+    return;
 };
 
-sub payment : Local {
-    my ($self, $c) = @_;
-    my @messages;
+=head2 payment
 
-    $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/payment.tt';
+Loads/Saves the payment information during GET/POST.
 
-    if ($c-&gt;req-&gt;method eq 'POST') {
-        my $results;
+    [% uri %]/payment/
 
-        if ($DFV) {
-            $results = $DFV-&gt;check($c-&gt;req-&gt;parameters, 'checkout_payment');
-        };
+=cut
 
-        if ($results || !$DFV) {
-            eval {
-                my $order = $c-&gt;stash-&gt;{'order'};
-                if (!$order) {
-                    $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . '[% curi %]/');
-                } else {
-                    foreach my $param ($c-&gt;req-&gt;param) {
-                        if ($order-&gt;can($param)) {
-                            if (($order-&gt;$param || '') ne ($c-&gt;req-&gt;param($param || ''))) {
-                                $order-&gt;$param($c-&gt;req-&gt;param($param));
-                            };
-                        };
-                    };
+sub payment : Local {
+    my ($self, $c) = @_;
+    $c-&gt;stash-&gt;{'template'} = '[% action %]/payment';
 
-                    my $checkout = Handel::Checkout-&gt;new({
-                        order  =&gt; $order,
-                        phases =&gt; 'CHECKOUT_PHASE_AUTHORIZE, CHECKOUT_PHASE_FINALIZE, CHECKOUT_PHASE_DELIVERY'
-                    });
+    if (my $order = $c-&gt;forward('load')) {
+        $c-&gt;stash-&gt;{'order'} = $order;
+
+        if ($c-&gt;req-&gt;method eq 'POST') {
+            if ($c-&gt;forward('validate')) {
+                my $checkout = Handel::Checkout-&gt;new({
+                    order  =&gt; $order,
+                    phases =&gt; 'CHECKOUT_PHASE_AUTHORIZE, CHECKOUT_PHASE_FINALIZE, CHECKOUT_PHASE_DELIVER'
+                });
 
-                    if ($checkout-&gt;process == CHECKOUT_STATUS_OK) {
+                if ($checkout-&gt;process == CHECKOUT_STATUS_OK) {
+                    if ($checkout-&gt;order-&gt;update) {
                         eval {
                             $c-&gt;model('[% cmodel %]')-&gt;destroy({
-                                shopper =&gt; $c-&gt;stash-&gt;{'shopperid'},
-                                type      =&gt; CART_TYPE_TEMP
+                                shopper =&gt; $c-&gt;session-&gt;{'shopper'},
+                                type    =&gt; CART_TYPE_TEMP
                             });
                         };
+                        $c-&gt;stash-&gt;{'order'} = $checkout-&gt;order;
                         $c-&gt;forward('complete');
-                    } else {
-                        push @messages, @{$checkout-&gt;messages};
                     };
+                } else {
+                    $c-&gt;stash-&gt;{'errors'} = $checkout-&gt;messages;
                 };
             };
-            if ($@) {
-                push @messages, $@;
-            };
-        } else {
-            $c-&gt;stash-&gt;{'_dfv_results'} = $results;
-            push @messages, map {$_} values %{$results-&gt;msgs};
         };
+    } else {
+        $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
     };
-    if (scalar @messages) {
-        $c-&gt;stash-&gt;{'messages'} = \@messages;
+
+    return;
+};
+
+=head2 preview
+
+Displays a preview of the current order.
+
+    [% uri %]/preview/
+
+=cut
+
+sub preview : Local {
+    my ($self, $c) = @_;
+    $c-&gt;stash-&gt;{'template'} = '[% action %]/preview';
+
+    if (my $order = $c-&gt;forward('load')) {
+        $c-&gt;stash-&gt;{'order'} = $order;
+    } else {
+        $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
     };
+
+    return;
 };
 
+=head2 complete
+
+Displays the order complete page.
+
+=cut
+
 sub complete : Local {
     my ($self, $c) = @_;
+    $c-&gt;stash-&gt;{'template'} = '[% action %]/complete';
+
+    if (!$c-&gt;stash-&gt;{'order'}) {
+        $c-&gt;res-&gt;redirect($c-&gt;uri_for('[% uri %]/'));
+    };
+};
+
+=head2 render
+
+Local render method to attach the load end method and HTML::FIllInForm to.
+
+=cut
+
+sub render : ActionClass('RenderView') {};
+
+=head2 end
+
+Runs HTML::FillInForm on the curret request before sending the output to the
+browser.
+
+=cut
+
+sub end : Private { 
+    my ($self, $c) = @_;
+    $c-&gt;forward('render');
+
+    if ($c-&gt;req-&gt;method eq 'POST') {
+        $c-&gt;res-&gt;output(
+            $self-&gt;{'fif'}-&gt;fill(
+                scalarref =&gt; \$c-&gt;response-&gt;{body},
+                fdat =&gt; $c-&gt;req-&gt;params
+            )
+        );
+    };
+};
+
+=head2 validate
+
+Validates the current form parameters using the profile in profiles.yml that
+matches the current action.
+
+    if ($c-&gt;forward('validate')) {
+    
+    };
+
+=cut
+
+sub validate : Private {
+    my ($self, $c) = @_;
+
+    $self-&gt;{'validator'}-&gt;results-&gt;clear;
+
+    my $results = $self-&gt;{'validator'}-&gt;check(
+        $c-&gt;req,
+        $self-&gt;{'profiles'}-&gt;{$c-&gt;action}
+    );
+
+    if ($results-&gt;success) {
+        return $results;
+    } else {
+        $c-&gt;stash-&gt;{'errors'} = $results-&gt;messages($c-&gt;action);
+    };
 
-    $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/complete.tt';
+    return;
 };
 
+=head1 AUTHOR
+
+A clever guy
+
+=head1 LICENSE
+
+This library is free software, you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
 1;
 __test__
-use Test::More tests =&gt; 2;
+use Test::More tests =&gt; 3;
 use strict;
 use warnings;
 
 use_ok('Catalyst::Test', '[% app %]');
 use_ok('[% class %]');
-__edit__
-[% TAGS [- -] %]
+
+ok(request('[% uri %]')-&gt;is_success, 'Request should succeed');
+__default__
+&lt;h1&gt;Checkout&lt;/h1&gt;
+&lt;p&gt;Your shopping cart is empty.&lt;/p&gt;
+__billing__
+[% TAGS [- -] -%]
 [% USE HTML %]
 &lt;h1&gt;Billing/Shipping Information&lt;/h1&gt;
-&lt;p&gt;
-    &lt;a href=&quot;[% base _ '[- curi.replace('^/', '') -]/' %]&quot;&gt;View Cart&lt;/a&gt;
-&lt;/p&gt;
-[% IF messages %]
-    &lt;ul&gt;
-        [% FOREACH message IN messages %]
-            &lt;li&gt;[% message %]&lt;/li&gt;
-        [% END %]
-    &lt;/ul&gt;
-[% END %]
-&lt;form action=&quot;[% base _ '[- uri.replace('^/', '') -]/update/' %]&quot; method=&quot;post&quot;&gt;
+[% INCLUDE [- action -]/errors %]
+&lt;form action=&quot;[% c.uri_for('[- uri -]/billing/') %]&quot; method=&quot;POST&quot;&gt;
     &lt;table border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;5&quot;&gt;
         &lt;tr&gt;
             &lt;th colspan=&quot;2&quot; align=&quot;left&quot;&gt;Billing&lt;/th&gt;
@@ -600,20 +569,9 @@ __edit__
     &lt;/table&gt;
 &lt;/form&gt;
 __preview__
-[% TAGS [- -] %]
+[% TAGS [- -] -%]
 [% USE HTML %]
 &lt;h1&gt;Order Preview&lt;/h1&gt;
-&lt;p&gt;
-    &lt;a href=&quot;[% base _ '[- curi.replace('^/', '') -]/' %]&quot;&gt;View Cart&lt;/a&gt; |
-    &lt;a href=&quot;[% base _ '[- uri.replace('^/', '') -]/edit/' %]&quot;&gt;Edit Billing/Shipping&lt;/a&gt;
-&lt;/p&gt;
-[% IF messages %]
-    &lt;ul&gt;
-        [% FOREACH message IN messages %]
-            &lt;li&gt;[% message %]&lt;/li&gt;
-        [% END %]
-    &lt;/ul&gt;
-[% END %]
 &lt;table border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;5&quot;&gt;
     &lt;tr&gt;
         &lt;th colspan=&quot;2&quot; align=&quot;left&quot;&gt;Billing&lt;/th&gt;
@@ -771,7 +729,7 @@ __preview__
                 &lt;/tr&gt;
                 &lt;tr&gt;
                     &lt;td colspan=&quot;5&quot; align=&quot;right&quot;&gt;
-                        &lt;form action=&quot;[% base _ '[- uri.replace('^/', '') -]/payment/' %]&quot; method=&quot;get&quot;&gt;
+                        &lt;form action=&quot;[% c.uri_for('[- uri -]/payment/') %]&quot; method=&quot;GET&quot;&gt;
                             &lt;input type=&quot;submit&quot; value=&quot;Continue&quot;&gt;
                         &lt;/form&gt;
                     &lt;/td&gt;
@@ -781,21 +739,11 @@ __preview__
     &lt;/td&gt;
 &lt;/table&gt;
 __payment__
-[% TAGS [- -] %]
+[% TAGS [- -] -%]
 [% USE HTML %]
 &lt;h1&gt;Payment Information&lt;/h1&gt;
-&lt;p&gt;
-    &lt;a href=&quot;[% base _ '[- curi.replace('^/', '') -]/' %]&quot;&gt;View Cart&lt;/a&gt; |
-    &lt;a href=&quot;[% base _ '[- uri.replace('^/', '') -]/preview/' %]&quot;&gt;Preview&lt;/a&gt;
-&lt;/p&gt;
-[% IF messages %]
-    &lt;ul&gt;
-        [% FOREACH message IN messages %]
-            &lt;li&gt;[% message %]&lt;/li&gt;
-        [% END %]
-    &lt;/ul&gt;
-[% END %]
-&lt;form action=&quot;[% base _ '[- uri.replace('^/', '') -]/payment/' %]&quot; method=&quot;post&quot;&gt;
+[% INCLUDE [- action -]/errors %]
+&lt;form action=&quot;[% c.uri_for('[- uri -]/payment/') %]&quot; method=&quot;POST&quot;&gt;
     &lt;table border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;5&quot;&gt;
         &lt;tr&gt;
             &lt;td align=&quot;right&quot;&gt;Name On Card:&lt;/td&gt;
@@ -830,19 +778,9 @@ __payment__
     &lt;/table&gt;
 &lt;/form&gt;
 __complete__
-[% TAGS [- -] %]
+[% TAGS [- -] -%]
 [% USE HTML %]
 &lt;h1&gt;Order Complete!&lt;/h1&gt;
-&lt;p&gt;
-    &lt;a href=&quot;[% base _ '[- ouri.replace('^/', '') -]/list/' %]&quot;&gt;View Orders&lt;/a&gt;
-&lt;/p&gt;
-[% IF messages %]
-    &lt;ul&gt;
-        [% FOREACH message IN messages %]
-            &lt;li&gt;[% message %]&lt;/li&gt;
-        [% END %]
-    &lt;/ul&gt;
-[% END %]
 &lt;table border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;5&quot;&gt;
     &lt;tr&gt;
         &lt;th colspan=&quot;2&quot; align=&quot;left&quot;&gt;Billing&lt;/th&gt;
@@ -1012,62 +950,125 @@ __complete__
         &lt;/td&gt;
     &lt;/td&gt;
 &lt;/table&gt;
+__errors__
+[% TAGS [- -] -%]
+[% IF errors %]
+	&lt;ul class=&quot;errors&quot;&gt;
+	[% FOREACH error IN errors %]
+		&lt;li&gt;[% HTML.escape(error) %]&lt;/li&gt;
+	[% END %]
+	&lt;/ul&gt;
+[% END %]
+__messages__
+[% action %]/view:
+  id:
+    REGEX: The id field is in the wrong format.
+[% action %]/billing:
+  billtofirstname:
+    NOT_BLANK: The bill to first name field cannot be blank.
+  billtolastname:
+    NOT_BLANK: The bill to last name field cannot be blank.
+  billtoaddress1:
+    NOT_BLANK: The bill to address line 1 field cannot be blank.
+  billtocity:
+    NOT_BLANK: The bill to city field cannot be blank.
+  billtostate:
+    NOT_BLANK: The bill to state field cannot be blank.
+  billtozip:
+    NOT_BLANK: The bill to zip/postal code field cannot be blank.
+  billtocountry:
+    NOT_BLANK: The bill to country field cannot be blank.
+  billtoemail:
+    NOT_BLANK: The bill to email address field cannot be blank.
+  shiptofirstname:
+    NOT_BLANK: The ship to first name field cannot be blank.
+  shiptolastname:
+    NOT_BLANK: The ship to last name field cannot be blank.
+  shiptoaddress1:
+    NOT_BLANK: The ship to address line 1 field cannot be blank.
+  shiptocity:
+    NOT_BLANK: The ship to city field cannot be blank.
+  shiptostate:
+    NOT_BLANK: The ship to state field cannot be blank.
+  shiptozip:
+    NOT_BLANK: The ship to zip/postal code field cannot be blank.
+  shiptocountry:
+    NOT_BLANK: The ship to country field cannot be blank.
+  shiptoemail:
+    NOT_BLANK: The ship to email field cannot be blank.
+[% action %]/payment:
+  ccname:
+    NOT_BLANK: The credit card name field is required.
+  cctype:
+    NOT_BLANK: The credit card type field is required.
+  ccn:
+    NOT_BLANK: The credit card number is required.
+    LENGTH: The credit card number must be between 12 to 16 digits.
+    UINT: The credit cart number must contain numbers only.
+  ccm:
+    NOT_BLANK: The credit card expiration month field is required.
+    BETWEEN: The credot card month must be between 1 and 12.
+  ccy:
+    NOT_BLANK: The credit card expiration year is required.
+    LENGTH: The credit card expiration year must be 2 digits long.
+    UINT: The credit cart expiration year must contain numbers only.
+  ccvn:
+    NOT_BLANK: The credit card verification number is required.
+    LENGTH: The credit card verification number must be 3 to 4 digits long.
+    UINT: The credit cart verification number must contain numbers only.
+__profiles__
+[% action %]/view:
+  - id
+  -
+    -
+      - REGEX
+      - !perl/regexp:
+        REGEXP: '^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$'
+        MODIFIERS: i
+[% action %]/billing:
+  - billtofirstname
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 25] ]
+  - billtolastname
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 25] ]
+  - billtoaddress1
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 50] ]
+  - billtocity
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 25] ]
+  - billtostate
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 25] ]
+  - billtozip
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 10] ]
+  - billtocountry
+  -  [ ['NOT_BLANK'], ['LENGTH', 1, 25] ]
+  - billtoemail
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 50] ]
+  - shiptofirstname
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 25] ]
+  - shiptolastname
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 25] ]
+  - shiptoaddress1
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 50] ]
+  - shiptocity
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 25] ]
+  - shiptostate
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 25] ]
+  - shiptozip
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 10] ]
+  - shiptocountry
+  -  [ ['NOT_BLANK'], ['LENGTH', 1, 25] ]
+  - shiptoemail
+  - [ ['NOT_BLANK'], ['LENGTH', 1, 50] ]
+[% action %]/payment:
+  - ccname
+  - [ ['NOT_BLANK'] ]
+  - cctype
+  - [ ['NOT_BLANK'] ]
+  - ccn
+  - [ ['NOT_BLANK'], ['LENGTH', 12, 16], ['UINT'] ]
+  - ccm
+  - [ ['NOT_BLANK'], ['BETWEEN', 1, 12] ]
+  - ccy
+  - [ ['NOT_BLANK'], ['LENGTH', 2], ['UINT'] ]
+  - ccvn
+  - [ ['NOT_BLANK'], ['LENGTH', 3, 4], ['UINT'] ]
 __END__
-
-=head1 NAME
-
-Catalyst::Helper::Controller::Handel::Checkout - Helper for Handel::Checkout Controllers
-
-=head1 SYNOPSIS
-
-    script/create.pl controller &lt;newclass&gt; Handel::Checkout [&lt;cartmodel&gt; &lt;ordermodel&gt; &lt;cartcontroller&gt; &lt;ordercontroller&gt;]
-    script/create.pl controller Checkout Handel::Checkout
-
-=head1 DESCRIPTION
-
-A Helper for creating controllers based on Handel::Checkout objects. IF no cartmodel or
-ordermodel was specified, ::M::Cart and ::M::Orders is assumed.
-
-The cartmode, ordermodel, cartcontroller and ordercontroller arguments try to do the
-right thing with the names given to them.
-
-For example, you can pass the shortened class name without the MyApp::M/C, or pass the fully
-qualified package name:
-
-    MyApp::M::CartModel
-    MyApp::Model::CartModel
-    CartModel
-
-In all three cases everything before M{odel)|C(ontroller) will be stripped and the class CartModel
-will be used.
-
-By default, the code generated by this helper requires Data::FormValidator 4.00 or greater
-and HTML::FillInForm 1.04 or greater to be installed for it's form validation. If you don't
-want to install Data::FormValidator or HTML::FillInForm, simply comment out this line in
-the generated controller class:
-
-    use Data::FormValidator 4.00;
-    use HTML::FillInForm 1.04;
-
-The code is designed to work without Data::FormValidator 4.00 and/or HTML::FillInForm 1.04 installed.
-
-=head1 METHODS
-
-=head2 mk_compclass
-
-Makes a Handel::Checkout Controller class and template files for you.
-
-=head2 mk_comptest
-
-Makes a Handel::Checkout Controller test for you.
-
-=head1 SEE ALSO
-
-L&lt;Catalyst::Manual&gt;, L&lt;Catalyst::Helper&gt;, L&lt;Handel::Checkout&gt;
-
-=head1 AUTHOR
-
-    Christopher H. Laco
-    CPAN ID: CLACO
-    claco@chrislaco.com
-    http://today.icantfocus.com/blog/</diff>
      <filename>lib/Catalyst/Helper/Controller/Handel/Checkout.pm</filename>
    </modified>
    <modified>
      <diff>@@ -1,245 +1,308 @@
 # $Id$
+## no critic (ProhibitCaptureWithoutTest)
 package Catalyst::Helper::Controller::Handel::Order;
 use strict;
 use warnings;
-use Path::Class;
-use Catalyst 5.56;
+
+BEGIN {
+    use Catalyst 5.7001;
+    use Catalyst::Utils;
+    use Path::Class;
+};
+
+=head1 NAME
+
+Catalyst::Helper::Controller::Handel::Order - Helper for Handel::Order Controllers
+
+=head1 SYNOPSIS
+
+    script/create.pl controller &lt;newclass&gt; Handel::Order [&lt;modelclass&gt;]
+    script/create.pl controller Orders Handel::Order OrderModel
+
+=head1 DESCRIPTION
+
+A Helper for creating controllers based on Handel::Order objects. If no modelclass
+is specified, ::M::Orders is assumed.
+
+The modelclass argument tries to do the right thing with the names given to it.
+
+For example, you can pass the shortened class name without the MyApp::M/C, or pass the fully
+qualified package name:
+
+    MyApp::M::OrderModel
+    MyApp::Model::OrderModel
+    OrderModel
+
+In all three cases everything before M{odel)|C(ontroller) will be stripped and the class OrderModel
+will be used.
+
+B&lt;The code generated by this helper requires FormValidator::Simple and YAML to be installed to operate.&gt;
+
+=head1 METHODS
+
+=head2 mk_compclass
+
+Makes a Handel::Order Controller class and template files for you.
+
+=cut
 
 sub mk_compclass {
     my ($self, $helper, $model) = @_;
     my $file = $helper-&gt;{'file'};
     my $dir  = dir($helper-&gt;{'base'}, 'root', $helper-&gt;{'uri'});
 
-    $model ||= 'Orders';
-    $model = $model =~ /^(.*::M(odel)?::)?(.*)$/i ? $3 : 'Orders';
+    $model ||= 'Order';
+    $model =~ /^(.*::M(odel)?::)?(.*)$/i;
+    $model = $3 ? $3 : 'Order';
     $helper-&gt;{'model'} = $model;
 
+    $helper-&gt;{'action'} = Catalyst::Utils::class2prefix($helper-&gt;{'class'});
+
     $helper-&gt;mk_dir($dir);
     $helper-&gt;render_file('controller', $file);
-    $helper-&gt;render_file('list', file($dir, 'list.tt'));
-    $helper-&gt;render_file('view', file($dir, 'view.tt'));
+
+    $helper-&gt;render_file('default', file($dir, 'default'));
+    $helper-&gt;render_file('view', file($dir, 'view'));
+    $helper-&gt;render_file('errors', file($dir, 'errors'));
+    $helper-&gt;render_file('profiles', file($dir, 'profiles.yml'));
+    $helper-&gt;render_file('messages', file($dir, 'messages.yml'));
+
+    return 1;
 };
 
+=head2 mk_comptest
+
+Makes a Handel::Order Controller test for you.
+
+=cut
+
 sub mk_comptest {
     my ($self, $helper) = @_;
     my $test = $helper-&gt;{'test'};
 
     $helper-&gt;render_file('test', $test);
+
+    return 1;
 };
 
+=head1 SEE ALSO
+
+L&lt;Catalyst::Manual&gt;, L&lt;Catalyst::Helper&gt;, L&lt;Handel::Order&gt;
+
+=head1 AUTHOR
+
+    Christopher H. Laco
+    CPAN ID: CLACO
+    claco@chrislaco.com
+    http://today.icantfocus.com/blog/
+
+=cut
+
 1;
 __DATA__
+
+=begin pod_to_ignore
+
 __controller__
 package [% class %];
 use strict;
 use warnings;
-use Handel::Constants qw(:returnas :order);
-use Data::FormValidator 4.00;
-use base 'Catalyst::Base';
-
-our $DFV;
-
-# Until this patch [hopefully] get's dumped into DFV 4.03, I've inlined the msgs
-# method below with the following path applied to it:
-#
-#--- Results.pm.orig Wed Aug 31 22:27:27 2005
-#+++ Results.pm  Wed Sep 14 17:40:28 2005
-#@@ -584,7 +584,9 @@
-#    if ($self-&gt;has_missing) {
-#        my $missing = $self-&gt;missing;
-#        for my $m (@$missing) {
-#-           $msgs{$m} = _error_msg_fmt($profile{format},$profile{missing});
-#+            $msgs{$m} = _error_msg_fmt($profile{format},
-#+                (ref $profile{missing} eq 'HASH' ?
-#+                    ($profile{missing}-&gt;{$m} || $profile{missing}-&gt;{default} || 'Missing') : $profile{missing}));
-#        }
-#    }
 
 BEGIN {
-    eval 'use Data::FormValidator 4.00';
-    if (!$@) {
-        #############################################################
-        # This is here until the patch makes it to release
-        #############################################################
-        no warnings 'redefine';
-        sub Data::FormValidator::Results::msgs {
-            my $self = shift;
-            my $controls = shift || {};
-            if (defined $controls and ref $controls ne 'HASH') {
-                die &quot;$0: parameter passed to msgs must be a hash ref&quot;;
-            }
-
-
-            # Allow msgs to be called more than one to accumulate error messages
-            $self-&gt;{msgs} ||= {};
-            $self-&gt;{profile}{msgs} ||= {};
-            $self-&gt;{msgs} = { %{ $self-&gt;{msgs} }, %$controls };
-
-            # Legacy typo support.
-            for my $href ($self-&gt;{msgs}, $self-&gt;{profile}{msgs}) {
-                if (
-                     (not defined $href-&gt;{invalid_separator})
-                     &amp;&amp;  (defined $href-&gt;{invalid_seperator})
-                 ) {
-                    $href-&gt;{invalid_separator} = $href-&gt;{invalid_seperator};
-                }
-            }
-
-            my %profile = (
-                prefix  =&gt; '',
-                missing =&gt; 'Missing',
-                invalid =&gt; 'Invalid',
-                invalid_separator =&gt; ' ',
-
-                format  =&gt; '&lt;span style=&quot;color:red;font-weight:bold&quot;&gt;&lt;span class=&quot;dfv_errors&quot;&gt;* %s&lt;/span&gt;&lt;/span&gt;',
-                %{ $self-&gt;{msgs} },
-                %{ $self-&gt;{profile}{msgs} },
-            );
-
-
-            my %msgs = ();
-
-            # Add invalid messages to hash
-                #  look at all the constraints, look up their messages (or provide a default)
-                #  add field + formatted constraint message to hash
-            if ($self-&gt;has_invalid) {
-                my $invalid = $self-&gt;invalid;
-                for my $i ( keys %$invalid ) {
-                    $msgs{$i} = join $profile{invalid_separator}, map {
-                        Data::FormValidator::Results::_error_msg_fmt($profile{format},($profile{constraints}{$_} || $profile{invalid}))
-                        } @{ $invalid-&gt;{$i} };
-                }
-            }
-
-            # Add missing messages, if any
-            if ($self-&gt;has_missing) {
-                my $missing = $self-&gt;missing;
-                for my $m (@$missing) {
-                    $msgs{$m} = Data::FormValidator::Results::_error_msg_fmt($profile{format},
-                      (ref $profile{missing} eq 'HASH' ?
-                          ($profile{missing}-&gt;{$m} || $profile{missing}-&gt;{default} || 'Missing') : $profile{missing}));
-                }
-            }
-
-            my $msgs_ref = Data::FormValidator::Results::prefix_hash($profile{prefix},\%msgs);
-
-            $msgs_ref-&gt;{ $profile{any_errors} } = 1 if defined $profile{any_errors};
-
-            return $msgs_ref;
-        }
-        #############################################################
-
-        $DFV = Data::FormValidator-&gt;new({
-            orders_view    =&gt; {
-                required =&gt; [qw/id/],
-                field_filters =&gt; {
-                    id =&gt; ['trim']
-                },
-                msgs =&gt; {
-                    missing =&gt; {
-                        default =&gt; 'Field is blank!',
-                        id      =&gt; 'The order id is required to view an order'
-                    },
-                    format =&gt; '%s'
-                }
-            }
-        });
-    };
+    use base qw/Catalyst::Controller/;
+    use Handel::Constants qw/:order/;
+    use FormValidator::Simple 0.17;
+    use YAML;
 };
 
-sub begin : Private {
+=head1 NAME
+
+[% class %] - Catalyst Controller
+
+=head1 DESCRIPTION
+
+Catalyst Controller.
+
+=head1 METHODS
+
+=head2 COMPONENT
+
+=cut
+
+sub COMPONENT {
+    my $self = shift-&gt;NEXT::COMPONENT(@_);
+
+    $self-&gt;{'validator'} = FormValidator::Simple-&gt;new;
+    $self-&gt;{'validator'}-&gt;set_messages(
+        $_[0]-&gt;path_to('root', '[% action %]', 'messages.yml')
+    );
+
+    $self-&gt;{'profiles'} = YAML::LoadFile($_[0]-&gt;path_to('root', '[% action %]', 'profiles.yml'));
+
+    return $self;
+};
+
+=head2 default
+
+Default action when browsing to [% uri %]/ that lists the saved orders for the
+current shopper. If no session exists, or the shopper id isn't set, no orders
+will be loaded. This keeps non-shoppers like Google and others from wasting
+sessions and order records for no good reason.
+
+=cut
+
+sub default : Private {
     my ($self, $c) = @_;
-    my $shopperid = $c-&gt;req-&gt;cookie('shopperid');
+    $c-&gt;stash-&gt;{'template'} = '[% action %]/default';
 
-    if (!$shopperid || !$shopperid-&gt;value) {
-        $c-&gt;res-&gt;redirect($c-&gt;req-&gt;base . 'cart/');
-    } else {
-        $shopperid = $shopperid-&gt;value;
-        $c-&gt;stash-&gt;{'shopperid'} = $shopperid;
+    if ($c-&gt;sessionid &amp;&amp; $c-&gt;session-&gt;{'shopper'}) {
+        my $orders = $c-&gt;model('[% model %]')-&gt;search({
+            shopper =&gt; $c-&gt;session-&gt;{'shopper'},
+            type    =&gt; ORDER_TYPE_SAVED
+        });
+
+        $c-&gt;stash-&gt;{'orders'} = $orders;
     };
+
+    return;
 };
 
-sub end : Private {
-    my ($self, $c) = @_;
+=head2 create
+
+Creates a new order from the current shopping cart.
+
+    my $order = $c-&gt;forward('create');
+
+=cut
+
+sub create : Private {
+    my ($self, $c, $cart) = @_;
+
+    if ($c-&gt;sessionid &amp;&amp; $c-&gt;session-&gt;{'shopper'}) {
+        return $c-&gt;model('[% model %]')-&gt;create({
+            shopper =&gt; $c-&gt;session-&gt;{'shopper'},
+            type    =&gt; ORDER_TYPE_TEMP,
+            cart    =&gt; $cart
+        });
+    };
 
-    $c-&gt;forward($c-&gt;view('TT'))
-        unless ( $c-&gt;res-&gt;output || $c-&gt;res-&gt;body || ! $c-&gt;stash-&gt;{template} );
+    return;
 };
 
-sub default : Private {
+=head2 load
+
+Loads the current temporary order for the current shopper.
+
+    my $order = $c-&gt;forward('load');
+
+=cut
+
+sub load : Private {
     my ($self, $c) = @_;
 
-    $c-&gt;forward('list');
+    if ($c-&gt;sessionid &amp;&amp; $c-&gt;session-&gt;{'shopper'}) {
+        return $c-&gt;model('[% model %]')-&gt;search({
+            shopper =&gt; $c-&gt;session-&gt;{'shopper'},
+            type    =&gt; ORDER_TYPE_TEMP
+        })-&gt;first;
+    };
+
+    return;
 };
 
+=head2 view
+
+=over
+
+=item Parameters: id
+
+=back
+
+Loads the specified order and displays its details during a GET operation.
+
+    [% uri %]/view/$id
+
+=cut
+
 sub view : Local {
     my ($self, $c, $id) = @_;
-    my @messages;
-    my $results;
-
-    if ($DFV) {
-        $results = $DFV-&gt;check({id =&gt; $id}, 'orders_view');
+    $c-&gt;stash-&gt;{'template'} = '[% action %]/view';
+
+    if ($id &amp;&amp; $c-&gt;sessionid &amp;&amp; $c-&gt;session-&gt;{'shopper'}) {
+        if ($c-&gt;forward('validate', [{id =&gt; $id}])) {
+            my $order = $c-&gt;model('[% model %]')-&gt;search({
+                shopper =&gt; $c-&gt;session-&gt;{'shopper'},
+                id   =&gt; $id,
+                type    =&gt; ORDER_TYPE_SAVED
+            })-&gt;first;
+
+            if ($order) {
+                $c-&gt;stash-&gt;{'order'} = $order;
+                $c-&gt;stash-&gt;{'items'} = $order-&gt;items;
+            };
+        };
     };
 
-    if ($results || !$DFV) {
-        if ($results) {
-            $id = $results-&gt;valid('id');
-        };
+    return;
+};
 
-        eval {
-            $c-&gt;stash-&gt;{'order'} = $c-&gt;model('[% model %]')-&gt;load({
-                shopper =&gt; $c-&gt;stash-&gt;{'shopperid'},
-                type    =&gt; ORDER_TYPE_SAVED,
-                id      =&gt; $id
-            }, RETURNAS_ITERATOR)-&gt;first;
-        };
-        if ($@) {
-            push @messages, $@;
-        };
-    } else {
-        push @messages, map {$_} values %{$results-&gt;msgs};
+=head2 validate
+
+Validates the current form parameters using the profile in profiles.yml that
+matches the current action.
+
+    if ($c-&gt;forward('validate')) {
+    
     };
 
-    if (scalar @messages) {
-        $c-&gt;stash-&gt;{'messages'} = \@messages;
+=cut
+
+sub validate : Private {
+    my ($self, $c, $query) = @_;
+
+    $query ||= $c-&gt;req;
+
+    $self-&gt;{'validator'}-&gt;results-&gt;clear;
+
+    my $results = $self-&gt;{'validator'}-&gt;check(
+        $query,
+        $self-&gt;{'profiles'}-&gt;{$c-&gt;action}
+    );
+
+    if ($results-&gt;success) {
+        return $results;
+    } else {
+        $c-&gt;stash-&gt;{'errors'} = $results-&gt;messages($c-&gt;action);
     };
 
-    $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/view.tt';
+    return;
 };
 
-sub list : Local {
-    my ($self, $c) = @_;
+=head1 AUTHOR
 
-    $c-&gt;stash-&gt;{'orders'} = $c-&gt;model('[% model %]')-&gt;load({
-        shopper =&gt; $c-&gt;stash-&gt;{'shopperid'},
-        type    =&gt; ORDER_TYPE_SAVED
-    }, RETURNAS_ITERATOR);
+A clever guy
 
-    $c-&gt;stash-&gt;{'template'} = '[% uri.replace('^/', '') %]/list.tt';
-};
+=head1 LICENSE
+
+This library is free software, you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
 
 1;
 __test__
-use Test::More tests =&gt; 2;
+use Test::More tests =&gt; 3;
 use strict;
 use warnings;
 
 use_ok('Catalyst::Test', '[% app %]');
 use_ok('[% class %]');
-__list__
-[% TAGS [- -] %]
+
+ok(request('[% uri %]')-&gt;is_success, 'Request should succeed');
+__default__
+[% TAGS [- -] -%]
 [% USE HTML %]
-&lt;h1&gt;Your Previous Orders&lt;/h1&gt;
-&lt;p&gt;
-    &lt;a href=&quot;[% base _ '[- uri.replace('^/', '') -]/' %]&quot;&gt;View Order List&lt;/a&gt;
-&lt;/p&gt;
-[% IF messages %]
-    &lt;ul&gt;
-        [% FOREACH message IN messages %]
-            &lt;li&gt;[% message %]&lt;/li&gt;
-        [% END %]
-    &lt;/ul&gt;
-[% END %]
+&lt;h1&gt;Your Order History&lt;/h1&gt;
 [% IF orders.count %]
     &lt;table border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;5&quot;&gt;
         &lt;tr&gt;
@@ -249,7 +312,7 @@ __list__
     [% WHILE (order = orders.next) %]
         &lt;tr&gt;
             &lt;td align=&quot;left&quot;&gt;
-                &lt;a href=&quot;[% base _ '[- uri.replace('^/', '') -]/view/' _ order.id _ '/' %]&quot;&gt;[% HTML.escape(order.number) %]&lt;/a&gt;
+                &lt;a href=&quot;[% c.uri_for('[- uri -]/view', order.id, '') %]&quot;&gt;[% HTML.escape(order.number) %]&lt;/a&gt;
             &lt;/td&gt;
             &lt;td&gt;
                 [% HTML.escape(order.updated) %]
@@ -261,13 +324,11 @@ __list__
     &lt;p&gt;You have no orders.&lt;/p&gt;
 [% END %]
 __view__
-[% TAGS [- -] %]
+[% TAGS [- -] -%]
 [% USE HTML %]
+&lt;h1&gt;Order Details&lt;/h1&gt;
+[% INCLUDE [- action -]/errors %]
 [% IF order %]
-    &lt;h1&gt;Order# [% HTML.escape(order.number) %]&lt;/h1&gt;
-    &lt;p&gt;
-        &lt;a href=&quot;[% base _ '[- uri.replace('^/', '') -]/' %]&quot;&gt;View Order List&lt;/a&gt;
-    &lt;/p&gt;
     &lt;table border=&quot;0&quot; cellpadding=&quot;3&quot; cellspacing=&quot;5&quot;&gt;
         &lt;tr&gt;
             &lt;th colspan=&quot;2&quot; align=&quot;left&quot;&gt;Billing&lt;/th&gt;
@@ -404,7 +465,7 @@ __view__
                         &lt;th align=&quot;center&quot;&gt;Quantity&lt;/th&gt;
                         &lt;th align=&quot;right&quot;&gt;Total&lt;/th&gt;
                     &lt;/tr&gt;
-                [% FOREACH item = order.items %]
+                [% WHILE (item = items.next) %]
                     &lt;tr&gt;
                             &lt;td align=&quot;left&quot;&gt;[% HTML.escape(item.sku) %]&lt;/td&gt;
                             &lt;td align=&quot;left&quot;&gt;[% HTML.escape(item.description) %]&lt;/td&gt;
@@ -438,72 +499,31 @@ __view__
         &lt;/td&gt;
     &lt;/table&gt;
 [% ELSE %]
-    &lt;h1&gt;Order Not Found&lt;/h1&gt;
-    &lt;p&gt;
-        &lt;a href=&quot;[% base _ '[- uri.replace('^/', '') -]/' %]&quot;&gt;View Order List&lt;/a&gt;
-    &lt;/p&gt;
-    [% IF messages %]
-        &lt;ul&gt;
-            [% FOREACH message IN messages %]
-                &lt;li&gt;[% message %]&lt;/li&gt;
-            [% END %]
-        &lt;/ul&gt;
-    [% END %]
-    &lt;p&gt;The order requested could not be found.&lt;/p&gt;
+	&lt;p&gt;The order requested could not be found.&lt;/p&gt;
 [% END %]
-__END__
-
-=head1 NAME
-
-Catalyst::Helper::Controller::Handel::Order - Helper for Handel::Order Controllers
-
-=head1 SYNOPSIS
-
-    script/create.pl controller &lt;newclass&gt; Handel::Order [&lt;modelclass&gt;]
-    script/create.pl controller Orders Handel::Order OrderModel
-
-=head1 DESCRIPTION
-
-A Helper for creating controllers based on Handel::Order objects. If no modelclass
-is specified, ::M::Orders is assumed.
-
-The modelclass argument tries to do the right thing with the names given to it.
-
-For example, you can pass the shortened class name without the MyApp::M/C, or pass the fully
-qualified package name:
-
-    MyApp::M::OrderModel
-    MyApp::Model::OrderModel
-    OrderModel
-
-In all three cases everything before M{odel)|C(ontroller) will be stripped and the class OrderModel
-will be used.
-
-By default, the code generated by this helper requires Data::FormValidator 4.00 or greater
-to be installed for it's form validation. If you don't want to install Data::FormValidator,
-simply comment out this line in the generated controller class:
-
-    use Data::FormValidator 4.00;
-
-The code is designed to work without Data::FormValidator 4.00 installed.
-
-=head1 METHODS
-
-=head2 mk_compclass
-
-Makes a Handel::Order Controller class and template files for you.
-
-=head2 mk_comptest
-
-Makes a Handel::Order Controller test for you.
-
-=head1 SEE ALSO
-
-L&lt;Catalyst::Manual&gt;, L&lt;Catalyst::Helper&gt;, L&lt;Handel::Order&gt;
-
-=head1 AUTHOR
+[% TAGS [- -] -%]
+__errors__
+[% TAGS [- -] -%]
+[% IF errors %]
+	&lt;ul class=&quot;errors&quot;&gt;
+	[% FOREACH error IN errors %]
+		&lt;li&gt;[% HTML.escape(error) %]&lt;/li&gt;
+	[% END %]
+	&lt;/ul&gt;
+[% END %]
+__messages__
+[% action %]/view:
+  id:
+    REGEX: The id field is in the wrong format.
+
+__profiles__
+[% action %]/view:
+  - id
+  -
+    -
+      - REGEX
+      - !perl/regexp:
+        REGEXP: '^[a-f0-9]{8}-([a-f0-9]{4}-){3}[a-f0-9]{12}$'
+        MODIFIERS: i
 
-    Christopher H. Laco
-    CPAN ID: CLACO
-    claco@chrislaco.com
-    http://today.icantfocus.com/blog/
+__END__</diff>
      <filename>lib/Catalyst/Helper/Controller/Handel/Order.pm</filename>
    </modified>
    <modified>
      <diff>@@ -1,19 +1,28 @@
 # $Id$
+## no critic (ProhibitCaptureWithoutTest)
 package Catalyst::Helper::Handel::Scaffold;
 use strict;
 use warnings;
-use Path::Class;
+
+BEGIN {
+    use Catalyst 5.7001;
+    use Catalyst::Utils;
+    use Path::Class;
+};
 
 sub mk_stuff {
     my ($self, $helper, $dsn, $user, $pass, $cart, $order, $checkout) = @_;
 
     $cart     ||= 'Cart';
-    $order    ||= 'Orders';
+    $order    ||= 'Order';
     $checkout ||= 'Checkout';
 
-    $cart = $cart =~ /^(.*::(Model|M|C|Controller)?::)?(.*)$/i ? $3 : 'Cart';
-    $order = $order =~ /^(.*::(Model|M|C|Controller)?::)?(.*)$/i ? $3 : 'Orders';
-    $checkout = $checkout =~ /^(.*::(Model|M|C|Controller)?::)?(.*)$/i ? $3 : 'Checkout';
+    $cart =~ /^(.*::(Model|M|C|Controller)?::)?(.*)$/i;
+    $cart = $3 ? $3 : 'Cart';
+    $order =~ /^(.*::(Model|M|C|Controller)?::)?(.*)$/i;
+    $order = $3 ? $3 : 'Order';
+    $checkout =~ /^(.*::(Model|M|C|Controller)?::)?(.*)$/i;
+    $checkout = $3 ? $3 : 'Checkout';
 
     my $app = $helper-&gt;{'app'};
 
@@ -23,6 +32,8 @@ sub mk_stuff {
     $helper-&gt;mk_component($app, 'controller', $cart, 'Handel::Cart', $cart, $checkout);
     $helper-&gt;mk_component($app, 'controller', $order, 'Handel::Order', $order);
     $helper-&gt;mk_component($app, 'controller', $checkout, 'Handel::Checkout', $cart, $order, $cart, $order);
+
+    return;
 };
 
 1;
@@ -39,29 +50,31 @@ Catalyst::Helper::Handel::Scaffold - Helper for creating Handel framework scaffo
 
 =head1 DESCRIPTION
 
-A Helper for creating an entire cart/order/checkout framework scaffold.
+Handel::Scaffold is a meta Helper for creating the entire cart/order/checkout
+framework using the other helpers included in this dist.
+
 If cartname isn't specified, Cart is assumed. If ordername isn't specified,
 Orders is assumed. If no checkoutname is given, Checkout is assumed.
 
-The cartname, ordername, and checkoutname arguments try to do the right thing with the
-names given to them.
+The cartname, ordername, and checkoutname arguments try to do the right thing
+with the names given to them.
 
-For example, you can pass the shortened class name without the MyApp::M/C, or pass the fully
-qualified package name:
+For example, you can pass the shortened class name without the MyApp::M/C, or
+pass the fully qualified package name:
 
     MyApp::M::CartModel
     MyApp::Model::CartModel
     CartModel
 
-In all three cases everything before M{odel)|C(ontroller) will be stripped and the class CartModel
-will be used.
+In all three cases everything before M{odel)|C(ontroller) will be stripped and
+the class CartModel will be used.
 
 =head1 METHODS
 
 =head2 mk_stuff
 
-Makes Cart and Order models, Cart, Order and Checkout controllers, templates files
-and a TT view for you.
+Makes Cart and Order models, Cart, Order and Checkout controllers, templates
+files and a TT view for you.
 
 =head1 SEE ALSO
 
@@ -72,4 +85,4 @@ L&lt;Catalyst::Manual&gt;, L&lt;Catalyst::Helper&gt;, L&lt;Handel::Cart&gt;
     Christopher H. Laco
     CPAN ID: CLACO
     claco@chrislaco.com
-    http://today.icantfocus.com/blog/
\ No newline at end of file
+    http://today.icantfocus.com/blog/</diff>
      <filename>lib/Catalyst/Helper/Handel/Scaffold.pm</filename>
    </modified>
    <modified>
      <diff>@@ -3,76 +3,118 @@ package Catalyst::Helper::Model::Handel::Cart;
 use strict;
 use warnings;
 
+BEGIN {
+    use Catalyst 5.7001;
+};
+
+=head1 NAME
+
+Catalyst::Helper::Model::Handel::Cart - Helper for Handel::Cart Models
+
+=head1 SYNOPSIS
+
+    script/create.pl model &lt;newclass&gt; Handel::Cart &lt;dsn&gt; [&lt;username&gt; &lt;password&gt;]
+    script/create.pl model Cart Handel::Cart dbi:mysql:localhost myuser mysecret
+
+=head1 DESCRIPTION
+
+A Helper for creating models based on Handel::Cart objects.
+
+=head1 METHODS
+
+=head2 mk_compclass
+
+Makes a Handel::Cart Model class for you.
+
+=cut
+
 sub mk_compclass {
     my ($self, $helper, $dsn, $user, $pass) = @_;
     my $file = $helper-&gt;{file};
+    my $app  = $helper-&gt;{app};
+
     $helper-&gt;{'dsn'}  = $dsn  || '';
     $helper-&gt;{'user'} = $user || '';
     $helper-&gt;{'pass'} = $pass || '';
 
-    $helper-&gt;render_file('model', $file);
+    if ($helper-&gt;{'handel_auto_wire_models'}) {
+        $helper-&gt;{'handel_auto_wireup'} = &quot;cart_class =&gt; '$app\:\:Cart',\n    &quot;;
+    };
+
+    return $helper-&gt;render_file('model', $file);
 };
 
+
+=head2 mk_comptest
+
+Makes a Handel::Cart Model test for you.
+
+=cut
+
 sub mk_comptest {
     my ($self, $helper) = @_;
     my $test = $helper-&gt;{'test'};
 
-    $helper-&gt;render_file('test', $test);
+    return $helper-&gt;render_file('test', $test);
 };
 
+=head1 SEE ALSO
+
+L&lt;Catalyst::Manual&gt;, L&lt;Catalyst::Helper&gt;, L&lt;Catalyst::Model::Handel::Cart&gt;
+
+=head1 AUTHOR
+
+    Christopher H. Laco
+    CPAN ID: CLACO
+    claco@chrislaco.com
+    http://today.icantfocus.com/blog/
+
+=cut
+
 1;
 __DATA__
+
+=begin pod_to_ignore
+
 __model__
 package [% class %];
 use strict;
 use warnings;
-use base 'Handel::Cart';
 
-{
-    $^W = 0;
-    Handel::DBI-&gt;connection('[% dsn %]', '[% user %]', '[% pass %]');
+BEGIN {
+    use base qw/Catalyst::Model::Handel::Cart/;
 };
 
-1;
-__test__
-use Test::More tests =&gt; 2;
-use strict;
-use warnings;
-
-use_ok('Catalyst::Test', '[% app %]');
-use_ok('[% class %]');
-__END__
+__PACKAGE__-&gt;config(
+    [% handel_auto_wireup %]connection_info =&gt; ['[% dsn %]', '[% user %]', '[% pass %]']
+);
 
 =head1 NAME
 
-Catalyst::Helper::Model::Handel::Cart - Helper for Handel::Cart Models
+[% class %] - Catalyst cart model component.
 
 =head1 SYNOPSIS
 
-    script/create.pl model &lt;newclass&gt; Handel::Cart &lt;dsn&gt; [&lt;username&gt; &lt;password&gt;]
-    script/create.pl model Cart Handel::Cart dbi:mysql:dbname=handel.db myuser mysecret
+See L&lt;[% app %]&gt;.
 
 =head1 DESCRIPTION
 
-A Helper for creating models based on Handel::Cart objects.
+Catalyst cart model component.
 
-=head1 METHODS
-
-=head2 mk_compclass
-
-Makes a Handel::Cart Model class for you.
+=head1 AUTHOR
 
-=head2 mk_comptest
+[% author %]
 
-Makes a Handel::Cart Model test for you.
-
-=head1 SEE ALSO
+=cut
 
-L&lt;Catalyst::Manual&gt;, L&lt;Catalyst::Helper&gt;, L&lt;Handel::Cart&gt;
-
-=head1 AUTHOR
+1;
+__test__
+use Test::More tests =&gt; 2;
+use strict;
+use warnings;
 
-    Christopher H. Laco
-    CPAN ID: CLACO
-    claco@chrislaco.com
-    http://today.icantfocus.com/blog/
+BEGIN {
+    use_ok('Catalyst::Test', '[% app %]');
+    use_ok('[% class %]');
+};
+__END__</diff>
      <filename>lib/Catalyst/Helper/Model/Handel/Cart.pm</filename>
    </modified>
    <modified>
      <diff>@@ -3,76 +3,117 @@ package Catalyst::Helper::Model::Handel::Order;
 use strict;
 use warnings;
 
+BEGIN {
+    use Catalyst 5.7001;
+};
+
+=head1 NAME
+
+Catalyst::Helper::Model::Handel::Order - Helper for Handel::Order Models
+
+=head1 SYNOPSIS
+
+    script/create.pl model &lt;newclass&gt; Handel::Order &lt;dsn&gt; [&lt;username&gt; &lt;password&gt;]
+    script/create.pl model Order Handel::Order dbi:mysql:localhost myuser mysecret
+
+=head1 DESCRIPTION
+
+A Helper for creating models based on Handel::Order objects.
+
+=head1 METHODS
+
+=head2 mk_compclass
+
+Makes a Handel::Order Model class for you.
+
+=cut
+
 sub mk_compclass {
     my ($self, $helper, $dsn, $user, $pass) = @_;
     my $file = $helper-&gt;{file};
+    my $app  = $helper-&gt;{app};
+
     $helper-&gt;{'dsn'}  = $dsn  || '';
     $helper-&gt;{'user'} = $user || '';
     $helper-&gt;{'pass'} = $pass || '';
 
-    $helper-&gt;render_file('model', $file);
+    if ($helper-&gt;{'handel_auto_wire_models'}) {
+        $helper-&gt;{'handel_auto_wireup'} = &quot;order_class =&gt; '$app\:\:Order',\n    &quot;;
+    };
+
+    return $helper-&gt;render_file('model', $file);
 };
 
+=head2 mk_comptest
+
+Makes a Handel::Order Model test for you.
+
+=cut
+
 sub mk_comptest {
     my ($self, $helper) = @_;
     my $test = $helper-&gt;{'test'};
 
-    $helper-&gt;render_file('test', $test);
+    return $helper-&gt;render_file('test', $test);
 };
 
+=head1 SEE ALSO
+
+L&lt;Catalyst::Manual&gt;, L&lt;Catalyst::Helper&gt;, L&lt;Catalyst::Model::Handel::Order&gt;
+
+=head1 AUTHOR
+
+    Christopher H. Laco
+    CPAN ID: CLACO
+    claco@chrislaco.com
+    http://today.icantfocus.com/blog/
+
+=cut
+
 1;
 __DATA__
+
+=begin pod_to_ignore
+
 __model__
 package [% class %];
 use strict;
 use warnings;
-use base 'Handel::Order';
 
-{
-    $^W = 0;
-    Handel::DBI-&gt;connection('[% dsn %]', '[% user %]', '[% pass %]');
+BEGIN {
+    use base qw/Catalyst::Model::Handel::Order/;
 };
 
-1;
-__test__
-use Test::More tests =&gt; 2;
-use strict;
-use warnings;
-
-use_ok('Catalyst::Test', '[% app %]');
-use_ok('[% class %]');
-__END__
+__PACKAGE__-&gt;config(
+    [% handel_auto_wireup %]connection_info =&gt; ['[% dsn %]', '[% user %]', '[% pass %]']
+);
 
 =head1 NAME
 
-Catalyst::Helper::Model::Handel::Order - Helper for Handel::Order Models
+[% class %] - Catalyst cart model component.
 
 =head1 SYNOPSIS
 
-    script/create.pl model &lt;newclass&gt; Handel::Order &lt;dsn&gt; [&lt;username&gt; &lt;password&gt;]
-    script/create.pl model Order Handel::Order dbi:mysql:dbname=handel.db myuser mysecret
+See L&lt;[% app %]&gt;.
 
 =head1 DESCRIPTION
 
-A Helper for creating models based on Handel::Order objects.
+Catalyst cart model component.
 
-=head1 METHODS
-
-=head2 mk_compclass
-
-Makes a Handel::Order Model class for you.
+=head1 AUTHOR
 
-=head2 mk_comptest
+[% author %]
 
-Makes a Handel::Order Model test for you.
-
-=head1 SEE ALSO
+=cut
 
-L&lt;Catalyst::Manual&gt;, L&lt;Catalyst::Helper&gt;, L&lt;Handel::Order&gt;
-
-=head1 AUTHOR
+1;
+__test__
+use Test::More tests =&gt; 2;
+use strict;
+use warnings;
 
-    Christopher H. Laco
-    CPAN ID: CLACO
-    claco@chrislaco.com
-    http://today.icantfocus.com/blog/
+BEGIN {
+    use_ok('Catalyst::Test', '[% app %]');
+    use_ok('[% class %]');
+};
+__END__</diff>
      <filename>lib/Catalyst/Helper/Model/Handel/Order.pm</filename>
    </modified>
    <modified>
      <diff>@@ -2,56 +2,36 @@
 package Handel;
 use strict;
 use warnings;
-use vars qw($VERSION);
+use vars qw/$VERSION/;
 
-$VERSION = '0.33';
+$VERSION = '1.00000';
 
 BEGIN {
-    use Handel::ConfigReader;
-
-    $Handel::Cfg = Handel::ConfigReader-&gt;new;
+    use base qw/Class::Accessor::Grouped/;
+    use Handel::Exception qw/:try/;
+    use Handel::L10N qw/translate/;
+};
 
-    my $uuidsub;
+__PACKAGE__-&gt;config_class('Handel::ConfigReader');
 
-    if ($^O ne 'openbsd' &amp;&amp; eval{require APR::UUID}) {
-        $uuidsub = sub {
-            return APR::UUID-&gt;new-&gt;format;
-        };
-    } elsif (eval{require UUID}) {
-        $uuidsub = sub {
-            my ($uuid, $uuidstring);
-            UUID::generate($uuid);
-            UUID::unparse($uuid, $uuidstring);
+sub config_class {
+    my ($self, $config_class) = @_;
 
-            return $uuidstring;
-        };
-    } elsif (eval{require Data::UUID}) {
-        $uuidsub = sub {
-            my $ug = Data::UUID-&gt;new;
-            my $uuid = $ug-&gt;create;
+    if ($config_class) {
+        eval &quot;require $config_class&quot;; ## no critic
 
-            return $ug-&gt;to_string($uuid);
-        };
-    } elsif (eval{
-            # for some reason 'no warnings' won't squelch
-            # the 'too late for INIT' warning in Win32::API::Type
-            local $^W = 0;
-            require Win32::Guidgen;
-        }) {
-        $uuidsub = sub {
-            return Win32::Guidgen::create();
-        };
-    } elsif (eval{require Win32API::GUID}) {
-        $uuidsub = sub {
-            return Win32API::GUID::CreateGuid();
-        };
-    } else {
         throw Handel::Exception(
-            -text =&gt; 'Required modules not found',
-            -details =&gt; 'UUID/Data::UUID'
-        );
+            -details =&gt; translate('The config_class [_1] could not be loaded', $config_class)
+        ) if $@; ## no critic
+
+        $self-&gt;set_inherited('config_class', $config_class);
     };
-    *Handel::newuuid = $uuidsub;
+
+    return $self-&gt;get_inherited('config_class');
+};
+
+sub config {
+    return shift-&gt;config_class-&gt;instance;
 };
 
 1;
@@ -59,250 +39,47 @@ __END__
 
 =head1 NAME
 
-Handel - Simple commerce framework with AxKit/TT/Catalyst support
-
-=head1 DESCRIPTION
-
-Handel is a quick and not-so-dirty ecommerce framework with L&lt;AxKit&gt; taglib
-support and TT2 (Template Toolkit) support. It was started for the conversion
-of an IIS/ASP based commerce site to Apache/ModPerl, but I decided that is
-might be useful to others so here it is on CPAN.
-
-For the curious, Handel is German for commerce.
-
-=head1 WEBSITE
-
-You can get the latest news, source, documentation and wiki help at http://handelframework.com/.
-
-=head1 MAILING LIST
-
-Join the mailing list at http://lists.rawmode.org/cgi-bin/mailman/listinfo/handel.
-Big thanks to gabb@#catalyst for the list space.
-
-=head1 GOALS
-
-=over
-
-=item Database agnostic. Thanks to Class::DBI and staying away from auto incrementing ids,
-Handel should run in any database that Class::DBI supports.
-
-=item Implementation agnostic. Handel should be able to be used from the command line,
-from a web page, from a SOAP service, or from a GUI application. It's simply a data access mechanism.
-Any interaction with forms, web pages, browser, cookies, etc is the responsibility of the consumer
-
-=item Checkout agnostic. A checkout process means different things to different people in
-different situations. The Handel checkout pipeline by itself does absolutely nothing with
-an order. It is instead a plugin manager that allows you to specify and build plugins to do
-various actions (payment authorization, address validation, fax delivery, etc). Each site, server, page,
-even process() call can have it's own unique order processing pipeline.
-
-=item Easy integration into AxKit using taglibs.
-
-=item Easy integration into TT2 using plugins.
-
-=item Easy integration into Catalyst using plugins.
-
-=item Easy integration into other systems using SOAP.
-
-=item Feature complete demo site in AxKit.
-
-=item Feature complete demo site in TT2.
-
-=item Feature complete demo site in Catalyst.
-
-=item Public Subversion repository.
-
-=item Public Wiki/Docs site.
-
-=item Get someone to actually use the damn thing. :-)
-
-=item Abstract schema into SQL::Translator scripts
-
-=back
-
-=head1 WHAT HANDEL IS
-
-=over
-
-=item Simple cart and order record maintenance.
-
-=item Plugin based checkout pipeline processing framework.
-
-=back
-
-=head1 WHAT HANDEL ISN'T
-
-=over
-
-=item Intershop, Cart32, WebGUI, CMS, complete web commerce packageB&lt;(1)&gt;.
-Handel is a simple framework to load/upload cart/order data and shove that
-data through a plugin based pipeline.
-
-=item B&lt;(1)&gt; While it is not a complete web based commerce system, I do plan on having
-feature complete working demos sites so people can still quick-start their own projects.
-
-=back
-
-=head1 FEATURES
-
-=over
-
-=item Add/Update/Delete/Save/Restore Cart Contents
-
-=item Full AxKit XSP Taglib Support
-
-=item Template Toolkit 2 Plugin Support
+Handel - A cart/order/checkout framework with AxKit/TT/Catalyst support
 
-=item Currency Conversion
+=head1 SYNOPSIS
 
-=item Currency Formatting
+    use Handel;
+    Handel-&gt;config_class('My::ConfigReader');
+    
+    my $config = Handel-&gt;config;
+    # $config-&gt;isa('My::ConfigReader')
 
-=item Basic Localization Support
-
-=item Multiple Database Support
+=head1 DESCRIPTION
 
-=back
+This is a generic class containing the default configuration used by other
+Handel classes.
 
-=head1 REQUIREMENTS
+To learn more about what Handel is and how it works, take a look at the
+L&lt;manual|Handel::Manual&gt;.
 
-=head2 Prerequisites
+=head1 METHODS
 
-The following modules are required for Handel to work properly. Older versions
-may work fine, but these are the versions I have installed and verified to
-work correctly. If you have older versions and all tests pass, send me an email
-and I'll lower the version requirements.
+=head2 config_class
 
 =over
 
-=item Class::DBI
-
-C&lt;Class::DBI&gt; version 0.96 or greater.
-
-=item DBI
-
-C&lt;DBI&gt; version 1.36 or greater.
-
-=item Error
-
-C&lt;Error&gt; version 0.14 or greater.
-
-=item Locale::Maketext
-
-C&lt;Locale::Maketext&gt; version 1.06 or greater.
-
-=item Data::UUID
-
-At least one of the following modules are required to create uuids:
-C&lt;UUID&gt; 0.02, C&lt;Win32::Guidgen&gt; 0.04, C&lt;Win32API::GUID&gt; 0.02,
-or C&lt;Data::UUID&gt; 0.10.
+=item Arguments: $config_class
 
 =back
 
-=head2 Optional Modules
-
-The following modules are not required for Handel to run, although some
-features may be unavailable without them.
-
-=over
-
-=item AxKit
-
-C&lt;AxKit&gt; version 1.61 or greater.
-
-C&lt;AxKit&gt; is only required if you plan on using C&lt;Handel&gt; within XSP using the
-supplied taglibs.
-
-=item Locale::Currency::Format
-
-C&lt;Locale::Currency::Format&gt; version 1.22 or greater.
-
-When present, this module allows all prices to be formatted to specific
-currency codes and formats.
-
-=item Finance::Currency::Convert::WebserviceX
-
-C&lt;Finance::Currency::Convert::WebserviceX&gt; version 0.03 or greater.
-
-When present, this module allows all prices to be converted from one currency
-to another.
-
-=item Locale::Currency
-
-C&lt;Locale::Currency&gt; version 2.07 or greater.
-
-When present, this module allows all conversion and currency codes
-to be verified as real 3 letter ISO currency codes.
-
-=item Template
-
-C&lt;Template&gt; version 2.07 or greater.
-
-C&lt;Template&gt; (TT2/Template ToolKit) is only required if you plan on using Handel
-within TT2 based websites.
-
-=back
-
-=head2 Build/Test Modules
-
-The following modules are only required for the test suite when running
-C&lt;make test&gt;.
-
-=over
-
-=item Test::More
-
-C&lt;Test::More&gt; version 0.48 or greater.
-
-The C&lt;Test::More&gt; included with perl 5.8.4 and C&lt;Test::More&gt; &lt;= 0.48 have issues
-with ithreads that usually cause crashes in tests that use C&lt;Class::DBI&gt; or
-C&lt;DBIx:ContextualFetch&gt;. The errors usual mention
-&quot;attempt to free unreferenced scalar&quot;. If you receive these during C&lt;make test&gt;,
-try upgrading C&lt;Test::More&gt;.
-
-=item Pod::Coverage
-
-C&lt;Pod::Coverage&gt; version 0.14 or greater.
-
-The pod coverage tests may fail complaining about missing pod for methods if
-Pod::Coverage &lt; 0.14 is installed. This is due to certain syntax variations of
-the pod with escaped gt/lt. I may just alter the pod and bump this version down
-if there is enough feedback to do so.
-
-=item Test::Pod
-
-C&lt;Test::Pod&gt; version 1.00 or greater.
-
-C&lt;Test::Pod&gt; 1.00 added the C&lt;all_pod_files_ok()&gt; method which makes my life
-easier. :-)
-
-=item Test::Pod::Coverage
-
-C&lt;Test::Pod::Coverage&gt; version 1.04 or greater.
-
-C&lt;Test::Pod::Coverage&gt; 1.04 was made taint safe, and we run the tests with -wT
-like good girls and boys.
-
-=item Test:Strict
-
-C&lt;Test::Strict&gt; version 0.01 or greater.
-
-This keeps me honest and makes sure I always C&lt;use strict&gt;.
-
-=back
+Gets/sets the name of the configuration class to use. The default configuration
+class is Handel::ConfigReader.
 
-=head1 CAVEATS
+A L&lt;Handel::Exception|Handel::Exception&gt; exception will be thrown if the
+specified class can not be loaded.
 
-When using item_class to specify the item class returned from add/items in your
-subclass under Class::DBI &lt; 3.0.8, the item_class specified will be returned from
-all cart classes, including Handel::Cart itself. In most cases, people are only
-using one subclass of Handel::Cart so this won't effect them.
+=head2 config
 
-If you plan on using multiple subclasses of Handel::Cart that may or may not
-return custom items, upgrade your Class::DBI to version 3.0.8 or greater.
+Returns an instance of the specified configuration class.
 
 =head1 SEE ALSO
 
-L&lt;Handel::Cart&gt;
+L&lt;Handel::Cart&gt;, L&lt;Handel::Order&gt;, L&lt;Handel::Checkout&gt;
 
 =head1 AUTHOR
 </diff>
      <filename>lib/Handel.pm</filename>
    </modified>
    <modified>
      <diff>@@ -4,214 +4,168 @@ use strict;
 use warnings;
 
 BEGIN {
-    use base 'Handel::DBI';
-    use Handel::Constants qw(:cart :returnas);
-    use Handel::Constraints qw(:all);
-    use Handel::Currency;
-    use Handel::L10N qw(translate);
-
-    __PACKAGE__-&gt;mk_classdata(_item_class =&gt; 'Handel::Cart::Item');
+    use Handel::Constants qw/:cart/;
+    use Handel::Constraints qw/:all/;
+    use Handel::L10N qw/translate/;
+    use Scalar::Util qw/blessed/;
+
+    use base qw/Handel::Base/;
+    __PACKAGE__-&gt;item_class('Handel::Cart::Item');
+    __PACKAGE__-&gt;storage_class('Handel::Storage::DBIC::Cart');
+    __PACKAGE__-&gt;create_accessors;
 };
 
-__PACKAGE__-&gt;autoupdate(1);
-__PACKAGE__-&gt;table('cart');
-__PACKAGE__-&gt;iterator_class('Handel::Iterator');
-__PACKAGE__-&gt;columns(All =&gt; qw(id shopper type name description));
-__PACKAGE__-&gt;has_many(_items =&gt; 'Handel::Cart::Item', 'cart');
-__PACKAGE__-&gt;add_constraint('id',      id      =&gt; \&amp;constraint_uuid);
-__PACKAGE__-&gt;add_constraint('shopper', shopper =&gt; \&amp;constraint_uuid);
-__PACKAGE__-&gt;add_constraint('type',    type    =&gt; \&amp;constraint_cart_type);
-
-sub new {
-    my ($self, $data) = @_;
-
-    throw Handel::Exception::Argument(
-        -details =&gt; translate('Param 1 is not a HASH reference') . '.') unless
-            ref($data) eq 'HASH';
-
-    if (!defined($data-&gt;{'id'}) || !constraint_uuid($data-&gt;{'id'})) {
-        $data-&gt;{'id'} = $self-&gt;uuid;
-    };
+sub create {
+    my ($self, $data, $opts) = @_;
 
-    if (!defined($data-&gt;{'type'})) {
-        $data-&gt;{'type'} = CART_TYPE_TEMP;
+    if (ref $data ne 'HASH') {
+        throw Handel::Exception::Argument(
+            -details =&gt; translate('PARAM1_NOT_HASHREF')
+        );
     };
 
-    if ($data-&gt;{'type'} == CART_TYPE_SAVED &amp;&amp; !$data-&gt;{'name'}) {
-        throw Handel::Exception::Constraint(
-            -details =&gt; translate(
-                'Cart name is required when creating a saved cart') . '.');
+    no strict 'refs';
+    my $storage = $opts-&gt;{'storage'};
+    if (!$storage) {
+        $storage = $self-&gt;storage;
     };
 
-    return $self-&gt;insert($data);
+    return $self-&gt;create_instance(
+        $storage-&gt;create($data)
+    );
 };
 
 sub add {
     my ($self, $data) = @_;
 
     throw Handel::Exception::Argument( -details =&gt;
-      translate(
-          'Param 1 is not a HASH reference or Handel::Cart::Item') . '.') unless
-              (ref($data) eq 'HASH' or $data-&gt;isa('Handel::Cart::Item'));
+      translate('PARAM1_NOT_HASHREF_CARTITEM')
+    ) unless (ref($data) eq 'HASH' or $data-&gt;isa('Handel::Cart::Item')); ## no critic
 
-    if (ref($data) eq 'HASH') {
-        if (!defined($data-&gt;{'id'}) || !constraint_uuid($data-&gt;{'id'})) {
-            $data-&gt;{'id'} = $self-&gt;uuid;
-        };
+    my $result = $self-&gt;result;
+    my $storage = $result-&gt;storage;
 
-        return $self-&gt;add_to__items($data);
+    if (ref($data) eq 'HASH') {
+        return $self-&gt;item_class-&gt;create_instance(
+            $result-&gt;add_item($data)
+        );
     } else {
         my %copy;
 
-        foreach ($data-&gt;columns) {
-            next if $_ =~ /^(id|cart)$/i;
-            $copy{$_} = $data-&gt;$_;
+        foreach ($storage-&gt;copyable_item_columns) {
+            if ($data-&gt;can($_)) {
+                $copy{$_} = $data-&gt;$_;
+            } elsif ($data-&gt;result-&gt;can($_)) {
+                $copy{$_} = $data-&gt;result-&gt;$_;
+            };
         };
 
-        $copy{'id'} = $self-&gt;uuid;
-
-        return $self-&gt;add_to__items(\%copy);
+        return $self-&gt;item_class-&gt;create_instance(
+            $result-&gt;add_item(\%copy)
+        );
     };
 };
 
 sub clear {
     my $self = shift;
 
-    $self-&gt;_items-&gt;delete_all;
-
-    return undef;
+    return $self-&gt;result-&gt;delete_items;
 };
 
 sub count {
-    my $self  = shift;
+    my $self = shift;
 
-    return $self-&gt;_items-&gt;count || 0;
+    return $self-&gt;result-&gt;count_items;
 };
 
 sub delete {
     my ($self, $filter) = @_;
 
-    throw Handel::Exception::Argument( -details =&gt;
-        translate('Param 1 is not a HASH reference') . '.') unless
-            ref($filter) eq 'HASH';
+    if (ref $filter ne 'HASH') {
+        throw Handel::Exception::Argument(
+            -details =&gt; translate('PARAM1_NOT_HASHREF')
+        );
+    };
 
-    ## I'd much rather use $self-&gt;_items-&gt;search_like, but it doesn't work that
-    ## way yet. This should be fine as long as :weaken refs works.
-    return $self-&gt;item_class-&gt;search_like(%{$filter},
-        cart =&gt; $self-&gt;id)-&gt;delete_all;
+    return $self-&gt;result-&gt;delete_items($filter);
 };
 
 sub destroy {
-    my ($self, $filter) = @_;
+    my ($self, $filter, $opts) = @_;
 
-    if (ref $self) {
-        $self-&gt;SUPER::delete;
+    if (blessed $self &amp;&amp; !defined $filter) {
+        my $result = $self-&gt;result-&gt;delete;
+        if ($result) {
+            undef ($self);
+        };
+        return $result;
     } else {
         throw Handel::Exception::Argument( -details =&gt;
-            translate('Param 1 is not a HASH reference') . '.') unless
-                ref($filter) eq 'HASH';
+            translate('PARAM1_NOT_HASHREF')
+        ) unless ref($filter) eq 'HASH'; ## no critic
 
-        my $carts = $self-&gt;load($filter, RETURNAS_ITERATOR);
-        while (my $cart = $carts-&gt;next) {
-            $cart-&gt;clear;
-            $cart-&gt;SUPER::delete;
+        no strict 'refs';
+        my $storage = $opts-&gt;{'storage'};
+        if (!$storage) {
+            $storage = $self-&gt;storage;
         };
-    };
-
-    return;
-};
-
-sub item_class {
-    my ($class, $item_class) = @_;
-
-    if ($item_class) {
-        eval &quot;require $item_class&quot;;
 
-        require version;
-        my $cdbiver = version-&gt;new(Class::DBI-&gt;VERSION);
-
-        if ($cdbiver-&gt;numify &lt; 3.000008) {
-            undef(*_items);
-            undef(*add_to__items);
-            __PACKAGE__-&gt;has_many(_items =&gt; $item_class, 'cart');
-        } else {
-            $class-&gt;has_many(_items =&gt; $item_class, 'cart');
-        };
-    } else {
-        return $class-&gt;_item_class;
+        return $storage-&gt;delete($filter);
     };
 };
 
 sub items {
-    my ($self, $filter, $wantiterator) = @_;
+    my ($self, $filter, $opts) = @_;
+    my $result = $self-&gt;result;
+    my $storage = $result-&gt;storage;
+
+    $filter ||= {};
+    $opts ||= {};
 
     throw Handel::Exception::Argument( -details =&gt;
-        translate('Param 1 is not a HASH reference') . '.') unless(
-            ref($filter) eq 'HASH' or !$filter);
+        translate('PARAM1_NOT_HASHREF')
+    ) unless ref($filter) eq 'HASH'; ## no critic
 
-    $wantiterator ||= RETURNAS_AUTO;
-    $filter       ||= {};
+    throw Handel::Exception::Argument( -details =&gt;
+        translate('PARAM2_NOT_HASHREF')
+    ) unless ref($opts) eq 'HASH'; ## no critic
 
-    my $wildcard = Handel::DBI::has_wildcard($filter);
+    my $results = $result-&gt;search_items($filter, $opts);
+    my $iterator = $self-&gt;item_class-&gt;result_iterator_class-&gt;new({
+        data         =&gt; $results,
+        result_class =&gt; $self-&gt;item_class
+    });
 
-    ## If the filter as a wildcard, push it through a fresh search_like since it
-    ## doesn't appear to be available within a loaded object.
-    if ((wantarray &amp;&amp; $wantiterator != RETURNAS_ITERATOR) || $wantiterator == RETURNAS_LIST) {
-        my @items = $wildcard ?
-            $self-&gt;item_class-&gt;search_like(%{$filter}, cart =&gt; $self-&gt;id) :
-            $self-&gt;_items(%{$filter});
+    return wantarray ? $iterator-&gt;all : $iterator;
+};
 
-        return @items;
-    } elsif ($wantiterator == RETURNAS_ITERATOR) {
-        my $iterator = $wildcard ?
-            $self-&gt;item_class-&gt;search_like(%{$filter}, cart =&gt; $self-&gt;id) :
-            $self-&gt;_items(%{$filter});
+sub search {
+    my ($self, $filter, $opts) = @_;
+    my $class = blessed $self ? blessed $self : $self;
 
-        return $iterator;
-    } else {
-        my $iterator = $wildcard ?
-            $self-&gt;item_class-&gt;search_like(%{$filter}, cart =&gt; $self-&gt;id) :
-            $self-&gt;_items(%{$filter});
-        if ($iterator-&gt;count == 1 &amp;&amp; $wantiterator != RETURNAS_ITERATOR &amp;&amp; $wantiterator != RETURNAS_LIST) {
-            return $iterator-&gt;next;
-        } else {
-            return $iterator;
-        };
-    };
-};
+    $filter ||= {};
+    $opts ||= {};
 
-sub load {
-    my ($self, $filter, $wantiterator) = @_;
+    throw Handel::Exception::Argument( -details =&gt;
+        translate('PARAM1_NOT_HASHREF')
+    ) unless ref($filter) eq 'HASH'; ## no critic
 
     throw Handel::Exception::Argument( -details =&gt;
-        translate('Param 1 is not a HASH reference') . '.') unless(
-            ref($filter) eq 'HASH' or !$filter);
-
-    $wantiterator ||= RETURNAS_AUTO;
-
-    ## only return array if wantarray and not explicitly asking for an iterator
-    ## or we've explicitly asked for a list/array
-    if ((wantarray &amp;&amp; $wantiterator != RETURNAS_ITERATOR) || $wantiterator == RETURNAS_LIST) {
-        my @carts = $filter ? $self-&gt;search_like(%{$filter}) :
-            $self-&gt;retrieve_all;
-        return @carts;
-    ## return an iterator if explicitly asked for
-    } elsif ($wantiterator == RETURNAS_ITERATOR) {
-        my $iterator = $filter ?
-            $self-&gt;search_like(%{$filter}) : $self-&gt;retrieve_all;
-
-        return $iterator;
-    ## full out auto
-    } else {
-        my $iterator = $filter ?
-            $self-&gt;search_like(%{$filter}) : $self-&gt;retrieve_all;
+        translate('PARAM2_NOT_HASHREF')
+    ) unless ref($opts) eq 'HASH'; ## no critic
 
-        if ($iterator-&gt;count == 1 &amp;&amp; $wantiterator != RETURNAS_ITERATOR &amp;&amp; $wantiterator != RETURNAS_LIST) {
-            return $iterator-&gt;next;
-        } else {
-            return $iterator;
-        };
+    my $storage = delete $opts-&gt;{'storage'};
+    if (!$storage) {
+        $storage = $self-&gt;storage;
     };
+
+    my $results = $storage-&gt;search($filter, $opts);
+    my $iterator = $self-&gt;result_iterator_class-&gt;new({
+        data         =&gt; $results,
+        result_class =&gt; $class
+    });
+
+    return wantarray ? $iterator-&gt;all : $iterator;
 };
 
 sub restore {
@@ -220,70 +174,70 @@ sub restore {
     $mode ||= CART_MODE_REPLACE;
 
     throw Handel::Exception::Argument( -details =&gt;
-        translate(
-            'Param 1 is not a HASH reference or Handel::Cart') . '.') unless(
-                ref($data) eq 'HASH' or $data-&gt;isa('Handel::Cart'));
+        translate('PARAM1_NOT_HASHREF_CART')
+    ) unless (ref($data) eq 'HASH' || $data-&gt;isa('Handel::Cart')); ## no critic
 
     my @carts = (ref($data) eq 'HASH') ?
-        $self-&gt;search_like(%{$data}) : $data;
+        $self-&gt;search($data)-&gt;all : $data;
 
     if ($mode == CART_MODE_REPLACE) {
         $self-&gt;clear;
 
         my $first = $carts[0];
-        $self-&gt;autoupdate(0);
         $self-&gt;name($first-&gt;name);
         $self-&gt;description($first-&gt;description);
-        $self-&gt;update;
-        $self-&gt;autoupdate(1);
 
-        foreach (@carts) {
-            my $iterator = $_-&gt;items(undef, 1);
-            while (my $item = $iterator-&gt;next) {
+        foreach my $cart (@carts) {
+            my @items = $cart-&gt;items-&gt;all;
+            foreach my $item (@items) {
                 $self-&gt;add($item);
             };
         };
     } elsif ($mode == CART_MODE_MERGE) {
-        foreach (@carts) {
-            my $iterator = $_-&gt;items(undef, 1);
-            while (my $item = $iterator-&gt;next) {
-                if (my $exists = $self-&gt;items({sku =&gt; $item-&gt;sku})){
+        foreach my $cart (@carts) {
+            my @items = $cart-&gt;items-&gt;all;
+            foreach my $item (@items) {
+                if (my $exists = $self-&gt;items({sku =&gt; $item-&gt;sku})-&gt;first){
                     $exists-&gt;quantity($item-&gt;quantity + $exists-&gt;quantity);
-                    $exists-&gt;update;
                 } else {
                     $self-&gt;add($item);
                 };
             };
         };
     } elsif ($mode == CART_MODE_APPEND) {
-        foreach (@carts) {
-            my $iterator = $_-&gt;items(undef, 1);
-            while (my $item = $iterator-&gt;next) {
+        foreach my $cart (@carts) {
+            my @items = $cart-&gt;items-&gt;all;
+            foreach my $item (@items) {
                 $self-&gt;add($item);
             };
         };
     } else {
-        return new Handel::Exception::Argument(-text =&gt;
-            translate('Unknown restore mode'));
+        throw Handel::Exception::Argument(-text =&gt;
+            translate('UNKNOWN_RESTORE_MODE')
+        );
     };
+
+    return;
 };
 
 sub save {
-    $_[0]-&gt;type(CART_TYPE_SAVED);
+    my $self = shift;
+    $self-&gt;type(CART_TYPE_SAVED);
 
-    return undef;
+    return;
 };
 
 sub subtotal {
     my $self     = shift;
-    my $it       = $self-&gt;items(undef, 1);
+    my $storage  = $self-&gt;result-&gt;storage;
+    my $items    = $self-&gt;items;
     my $subtotal = 0.00;
 
-    while ( my $item = $it-&gt;next ) {
-        $subtotal += ( $item-&gt;total );
+    while (my $item = $items-&gt;next) {
+        $subtotal += ($item-&gt;total);
     };
 
-    return Handel::Currency-&gt;new($subtotal);
+    return $storage-&gt;currency_class-&gt;new($subtotal);
 };
 
 1;
@@ -296,17 +250,17 @@ Handel::Cart - Module for maintaining shopping cart contents
 =head1 SYNOPSIS
 
     use Handel::Cart;
-
-    my $cart = Handel::Cart-&gt;new({
+    
+    my $cart = Handel::Cart-&gt;create({
         shopper =&gt; 'D597DEED-5B9F-11D1-8DD2-00AA004ABD5E'
     });
-
+    
     $cart-&gt;add({
         sku      =&gt; 'SKU1234',
         quantity =&gt; 1,
         price    =&gt; 1.25
     });
-
+    
     my $iterator = $cart-&gt;items;
     while (my $item = $iterator-&gt;next) {
         print $item-&gt;sku;
@@ -317,237 +271,249 @@ Handel::Cart - Module for maintaining shopping cart contents
 
 =head1 DESCRIPTION
 
-C&lt;Handel::Cart&gt; is quick and dirty component for maintaining simple shopping
-cart data.
-
-While C&lt;Handel::Cart&gt; subclasses L&lt;Class::DBI&gt;, it is strongly recommended that
-you not use its methods unless it's absolutely necessary. Stick to the
-documented methods here and you'll be safe should I decide to implement some
-other data access mechanism. :-)
+Handel::Cart is component for maintaining simple shopping cart data.
 
 =head1 CONSTRUCTOR
 
-There are two ways to create a new cart object. You can either pass a hashref
-into C&lt;new&gt; containing all the required values needed to create a new shopping
-cart record or pass a hashref into C&lt;load&gt; containing the search criteria to use
-to load an existing shopping cart.
+=head2 create
 
 =over
 
-=item C&lt;Handel::Cart-E&lt;gt&gt;new(\%data)&gt;
+=item Arguments: \%data [, \%options]
+
+=back
+
+Creates a new shopping cart object containing the specified data.
 
-    my $cart = Handel::Cart-&gt;new({
+    my $cart = Handel::Cart-&gt;create({
         shopper =&gt; '10020400-E260-11CF-AE68-00AA004A34D5',
         name    =&gt; 'My Shopping Cart'
     });
 
-=item C&lt;Handel::Cart-E&lt;gt&gt;load([\%filter, $wantiterator])&gt;
+A L&lt;Handel::Exception::Argument|Handel::Exception::Argument&gt; exception is
+thrown if the first parameter is not a hashref.
 
-    my $cart = Handel::Cart-&gt;load({
-        id =&gt; 'D597DEED-5B9F-11D1-8DD2-00AA004ABD5E'
-    });
+The following options are available:
 
-You can also omit \%filter to load all available carts.
+=over
 
-    my @carts = Handel::Cart-&gt;load();
+=item storage
 
-In scalar context C&lt;load&gt; returns a C&lt;Handel::Cart&gt; object if there is a single
-result, or a L&lt;Handel::Iterator&gt; object if there are multiple results. You can
-force C&lt;load&gt; to always return an iterator even if only one cart exists by
-setting the C&lt;$wantiterator&gt; parameter to C&lt;RETURNAS_ITERATOR&gt;.
+A storage object to use to create a new cart object. Currently, this storage
+object B&lt;must&gt; have the same columns as the default storage object for the
+current cart class.
 
-    my $iterator = Handel::Cart-&gt;load(undef, RETURNAS_ITERATOR);
-    while (my $item = $iterator-&gt;next) {
-        print $item-&gt;sku;
-    };
+=back
+
+=head1 METHODS
+
+=head2 add
 
-See L&lt;Handel::Contstants&gt; for the available C&lt;RETURNAS&gt; options.
+=over
 
-A C&lt;Handel::Exception::Argument&gt; exception is thrown if the first parameter is
-not a hashref.
+=item Arguments: \%data | $item
 
 =back
 
-=head1 METHODS
+Adds a new item to the current shopping cart and returns an instance of the
+item class specified in cart object storage. You can either pass the item
+data as a hash reference:
+
+    my $item = $cart-&gt;add({
+        shopper  =&gt; '10020400-E260-11CF-AE68-00AA004A34D5',
+        sku      =&gt; 'SKU1234',
+        quantity =&gt; 1,
+        price    =&gt; 1.25
+    });
+
+or pass an existing cart item:
 
-=head2 item_class($classname)
+    my $wishlist = Handel::Cart-&gt;search({
+        shopper =&gt; '10020400-E260-11CF-AE68-00AA004A34D5',
+        type    =&gt; CART_TYPE_SAVED
+    })-&gt;first;
+    
+    $cart-&gt;add(
+        $wishlist-&gt;items({sku =&gt; 'ABC-123'})-&gt;first
+    );
+
+When passing an existing cart item to add, all columns in the source item will
+be copied into the destination item if the column exists in both the
+destination and source, and the column isn't the primary key or the foreign
+key of the item relationship.
 
-Sets the name of the class to be used when returning or creating cart items.
-While you can set this directly in your application, it's best to set it
-in a custom subclass of Handel::Cart.
+A L&lt;Handel::Exception::Argument|Handel::Exception::Argument&gt; exception is
+thrown if the first parameter isn't a hashref or an object that subclasses
+Handel::Cart::Item.
 
-    package CustomCart;
-    use strict;
-    use warnings;
-    use base 'Handel::Cart';
+=head2 clear
 
-    __PACKAGE__-&gt;item_class('CustomCart::CustomItem';
+Deletes all items from the current cart.
 
-    1;
+    $cart-&gt;clear;
 
-=head2 Adding Cart Items
+=head2 count
+
+Returns the number of items in the cart object.
 
-You can add items to the shopping cart by supplying a hashref containing the
-required name/values or by passing in a newly create Handel::Cart::Item
-object. If successful, C&lt;add&gt; will return a L&lt;Handel::Cart::Item&gt; object
-reference.
+    my $numitems = $cart-&gt;count;
 
-Yes, I know. Why a hashref and not just a hash? So I can add new params
-later if need be. Oh yeah, and &quot;Because I Can&quot;. :-P
+=head2 delete
 
 =over
 
-=item C&lt;$cart-E&lt;gt&gt;add(\%data)&gt;
+=item Arguments: \%filter
 
-    my $item = $cart-&gt;add({
-        shopper  =&gt; '10020400-E260-11CF-AE68-00AA004A34D5',
-        sku      =&gt; 'SKU1234',
-        quantity =&gt; 1,
-        price    =&gt; 1.25
-    });
+=back
 
-=item C&lt;$cart-E&lt;gt&gt;add($object)&gt;
+Deletes the item matching the supplied filter from the current cart.
 
-    my $item = Handel::Cart::Item-&gt;new({
-        sku      =&gt; 'SKU1234',
-        quantity =&gt; 1,
-        price    =&gt; 1.25
+    $cart-&gt;delete({
+        sku =&gt; 'ABC-123'
     });
-    ...
-    $cart-&gt;add($item);
 
-A C&lt;Handel::Exception::Argument&gt; exception is thrown if the first parameter
-isn't a hashref or a C&lt;Handel::Cart::Item&gt; object.
+=head2 destroy
+
+=over
+
+=item Arguments: \%filter
 
 =back
 
-=head2 Fetching Cart Items
+Deletes entire shopping carts (and their items) from the database. When called
+as an object method, this will delete all items from the current cart object
+and deletes the cart object itself. C&lt;filter&gt; will be ignored.
+
+    $cart-&gt;destroy;
 
-You can retrieve all or some of the items contained in the cart via the C&lt;items&gt;
-method. In a scalar context, items returns an iterator object which can be used
-to cycle through items one at a time. In list context, it will return an array
-containing all items.
+When called as a class method, this will delete all carts matching C&lt;filter&gt;.
+
+    Handel::Cart-&gt;destroy({
+        shopper =&gt; 'D597DEED-5B9F-11D1-8DD2-00AA004ABD5E'
+    });
+
+A L&lt;Handel::Exception::Argument|Handel::Exception::Argument&gt; exception will be
+thrown if C&lt;filter&gt; is not a HASH reference.
+
+=head2 items
 
 =over
 
-=item C&lt;$cart-E&lt;gt&gt;items()&gt;
+=item Arguments: \%filter [, \%options]
+
+=back
+
+Loads the current carts items matching the specified filter and returns a
+L&lt;Handel::Iterator|Handel::Iterator&gt; in scalar context, or a list of items in
+list context.
 
     my $iterator = $cart-&gt;items;
     while (my $item = $iterator-&gt;next) {
         print $item-&gt;sku;
     };
-
+    
     my @items = $cart-&gt;items;
-    ...
-    dosomething(\@items);
-
-=item C&lt;$cart-E&lt;gt&gt;items(\%filter [, $wantiterator])&gt;
 
-When filtering the items in the shopping cart in scalar context, a
-C&lt;Handel::Cart::Item&gt; object will be returned if there is only one result. If
-there are multiple results, a Handel::Iterator object will be returned
-instead. You can force C&lt;items&gt; to always return a C&lt;Handel::Iterator&gt; object
-even if only one item exists by setting the $wantiterator parameter to
-C&lt;RETURNAS_ITERATOR&gt;.
+By default, the items returned as Handel::Cart::Item objects. To return
+something different, set C&lt;item_class&gt; in the local C&lt;storage&gt; object.
 
-    my $item = $cart-&gt;items({sku =&gt; 'SKU1234'}, RETURNAS_ITERATOR);
-    if ($item-&gt;isa('Handel::Cart::Item)) {
-        print $item-&gt;sku;
-    } else {
-        while ($item-&gt;next) {
-            print $_-&gt;sku;
-        };
-    };
+The following options are available:
 
-See the C&lt;RETURNAS&gt; constants in L&lt;Handel::Constants&gt; for other options.
+=over
 
-In list context, filtered items return an array of items just as when items is
-called without a filter specified.
+=item order_by
 
-    my @items - $cart-&gt;items((sku -&gt; 'SKU1%'});
+Order the items by the column(s) and order specified. This option uses the SQL
+style syntax:
 
-A C&lt;Handel::Exception::Argument&gt; exception is thrown if parameter one isn't a
-hashref or undef.
+    my $items = $cart-&gt;items(undef, {order_by =&gt; 'sku ASC'});
 
 =back
 
-=head2 Removing Cart Items
+A L&lt;Handel::Exception::Argument|Handel::Exception::Argument&gt; exception is
+thrown if parameter one isn't a hashref or undef.
 
-=over
+=head2 search
 
-=item C&lt;$cart-E&lt;gt&gt;clear()&gt;
+=over
 
-This method removes all items from the current cart object.
+=item Arguments: \%filter [, \%options]
 
-    $cart-&gt;clear;
-
-=item C&lt;$cart-E&lt;gt&gt;delete(\%filter)&gt;
+=back
 
-This method deletes the cart item(s) matching the supplied filter values and
-returns the number of items deleted.
+Loads existing carts matching the specified filter and returns a
+L&lt;Handel::Iterator|Handel::Iterator&gt; in scalar context, or a list of carts in
+list context.
 
-    if ( $cart-&gt;delete({id =&gt; '8D4B0BE1-C02E-11D2-A33D-00A0C94B8D0E'}) ) {
-        print 'Item deleted';
+    my $iterator = Handel::Cart-&gt;search({
+        shopper =&gt; 'D597DEED-5B9F-11D1-8DD2-00AA004ABD5E',
+        type    =&gt; CART_TYPE_SAVED
+    });
+    
+    while (my $cart = $iterator-&gt;next) {
+        print $cart-&gt;id;
     };
+    
+    my @carts = Handel::Cart-&gt;search();
 
-=back
-
-=head2 Removing the Entire Cart
+The following options are available:
 
 =over
 
-=item C&lt;$cart-E&lt;gt&gt;destroy(\%filter)&gt;
+=item storage
 
-=item C&lt;Handel::Cart-E&lt;gt&gt;destroy(\%filter)&gt;
+A storage object to use to load cart objects. Currently, this storage
+object B&lt;must&gt; have the same columns as the default storage object for the
+current cart class.
 
-When called used as an instance method, this will delete all items from the
-current cart instance and delete the cart container. C&lt;filter&gt; will be ignored.
+=item order_by
 
-When called as a package method, this will delete all carts matching C&lt;filter&gt;.
-A Handel::Exception::Argument exception will be thrown is C&lt;filter&gt; is not a
-HASH reference.
+Order the items by the column(s) and order specified. This option uses the SQL
+style syntax:
+
+    my $carts = Handel::Cart-&gt;search(undef, {order_by =&gt; 'name ASC'});
 
 =back
 
-=head2 Saving Your Cart
+A L&lt;Handel::Exception::Argument|Handel::Exception::Argument&gt; exception is
+thrown if the first parameter is not a hashref.
 
-By default every shopping cart created is considered temporary
-(C&lt;CART_TYPE_TEMP&gt;) and could be deleted by cleanup processes at any time after
-the defined inactivity period. This could also be considered characteristic of
-whether the shopper id is from a temporary part of where it's used, or whether
-it is generated and stored within a customer profile assigned during
-authentication.
+=head2 save
 
-By saving your shopping cart, you are marking it as C&lt;CART_TYPE_SAVED&gt; and it
-should be left alone by any cleanup processes and available to that shopper at
-any time.
+Marks the current shopping cart type as C&lt;CART_TYPE_SAVED&gt;.
 
-For all intents and purposes, a saved cart is a wishlist. At some point in the
-future they may be treated differently.
+    $cart-&gt;save
 
-=over
+=head2 restore
 
-=item C&lt;$cart-E&lt;gt&gt;save()&gt;
+=over
 
-=back
+=item Arguments: \%filter [, $mode]
 
-=head2 Restoring A Previously Saved Cart
+=item Arguments: $cart [, $mode]
 
-There are two basic ways to restore a previously saved shopping cart into the
-current shopping cart object. You may either pass in a hashref containing the
-search criteria of the shopping cart(s) to restore or you can pass in an
-existing C&lt;Handel::Cart&gt; object.
+=back
 
-=over
+Copies (restores) items from a cart, or a set of carts back into the current
+shopping cart. You may either pass in a hash reference containing the search
+criteria of the shopping cart(s) to restore:
 
-=item C&lt;$cart-E&lt;gt&gt;restore(\%search, [$mode])&gt;
+    $cart-&gt;restore({
+        shopper =&gt; 'D597DEED-5B9F-11D1-8DD2-00AA004ABD5E',
+        type    =&gt; CART_TYPE_SAVED
+    });
 
-=item C&lt;$cart-E&lt;gt&gt;restore($object, [$mode])&gt;
+or you can pass in an existing C&lt;Handel::Cart&gt; object or subclass.
 
-=back
+    my $wishlist = Handel::Cart-&gt;search({
+        id   =&gt; 'D597DEED-5B9F-11D1-8DD2-00AA004ABD5E',
+        type =&gt; CART_TYPE_SAVED
+    })-&gt;first;
+    
+    $cart-&gt;restore($wishlist);
 
 For either method, you may also specify the mode in which the cart should be
-restored. $mode can be one of the following:
+restored. The following modes are available:
 
 =over
 
@@ -561,7 +527,7 @@ into it. This is the default if no mode is specified.
 If an item with the same SKU exists in both the current cart and the saved cart,
 the quantity of each will be added together and applied to the same sku in the
 current cart. Any price differences are ignored and we assume that the price in
-the current cart is more up to date.
+the current cart has the more up to date price.
 
 =item C&lt;CART_MODE_APPEND&gt;
 
@@ -569,53 +535,57 @@ All items in the saved cart will be appended to the list of items in the current
 cart. No effort will be made to merge items with the same SKU and duplicates
 will be ignored.
 
-A C&lt;Handel::Exception::Argument&gt; exception is thrown if the first parameter
-isn't a hashref or a C&lt;Handel::Cart&gt; object.
+A L&lt;Handel::Exception::Argument|Handel::Exception::Argument&gt; exception is
+thrown if the first parameter isn't a hashref or a C&lt;Handel::Cart::Item&gt; object
+or subclass.
 
 =back
 
-=head2 Misc. Methods
+=head1 COLUMNS
 
-=over
+The following methods are mapped to columns in the default cart schema. These
+methods may or may not be available in any subclasses, or in situations where
+a custom schema is being used that has different column names.
 
-=item C&lt;$cart-E&lt;gt&gt;count()&gt;
+=head2 id
 
-Returns the number of items in the cart object.
+Returns the id of the current cart.
 
-    my $numitems = $cart-&gt;count;
+    print $cart-&gt;id;
 
-=item C&lt;$cart-E&lt;gt&gt;description([$description])&gt;
+See L&lt;Handel::Schema::Cart/id&gt; for more information about this column.
 
-Returns/sets the description of the current cart.
+=head2 shopper
 
-=item C&lt;$cart-E&lt;gt&gt;name([$name])&gt;
+=over
 
-Returns/set the name of the current cart.
+=item Arguments: $shopper
 
-=item C&lt;$cart-E&lt;gt&gt;subtotal()&gt;
+=back
 
-Returns the current total price of all the items in the cart object. This is
-equivalent to:
+Gets/sets the id of the shopper the cart should be associated with.
 
-    my $iterator = $cart-&gt;items;
-    while (my $item = $iterator-&gt;next) {
-        $subtotal += $item-&gt;quantity*$item-&gt;price;
-    };
+    $cart-&gt;shopper('11111111-1111-1111-1111-111111111111');
+    print $cart-&gt;shopper;
 
-Starting in version C&lt;0.12&gt;, C&lt;subtotal&gt; now returns a stringified L&lt;Handel::Currency&gt;
-object. This can be used to format the price, and hopefully to convert it's currency
-to another locale in the future.
+See L&lt;Handel::Schema::Cart/shopper&gt; for more information about this column.
 
-=item C&lt;$cart-E&lt;gt&gt;type()&gt;
+=head2 type
 
-Returns the type of the current cart. Currently the two types are
+=over
+
+=item Arguments: $type
+
+=back
+
+Gets/sets the type of the current cart. Currently the two types allowed are:
 
 =over
 
 =item C&lt;CART_TYPE_TEMP&gt;
 
-The cart is temporary and may be purges during any cleanup process after the
-designated amount of inactivity.
+The cart is temporary and may be purged during any [external] cleanup process
+after the designated amount of inactivity.
 
 =item C&lt;CART_TYPE_SAVED&gt;
 
@@ -624,11 +594,55 @@ shopper at any time.
 
 =back
 
+    $cart-&gt;type(CART_TYPE_SAVED);
+    print $cart-&gt;type;
+
+See L&lt;Handel::Schema::Cart/type&gt; for more information about this column.
+
+=head2 name
+
+=over
+
+=item Arguments: $name
+
+=back
+
+Gets/sets the name of the current cart.
+
+    $cart-&gt;name('My Naw Cart');
+    print $cart-&gt;name;
+
+See L&lt;Handel::Schema::Cart/name&gt; for more information about this column.
+
+=head2 description
+
+=over
+
+=item Arguments: $description
+
 =back
 
+Gets/sets the description of the current cart.
+
+    $cart-&gt;description('New Cart');
+    print $cart-&gt;description;
+
+See L&lt;Handel::Schema::Cart/description&gt; for more information about this column.
+
+=head2 subtotal
+
+Returns the current total price of all the items in the cart object as a
+stringified L&lt;Handel::Currency|Handel::Currency&gt; object. This is equivalent to:
+
+    my $iterator = $cart-&gt;items;
+    my $subtotal = 0;
+    while (my $item = $iterator-&gt;next) {
+        $subtotal += $item-&gt;quantity*$item-&gt;price;
+    };
+
 =head1 SEE ALSO
 
-L&lt;Handel::Constants&gt;
+L&lt;Handel::Cart::Item&gt;, L&lt;Handel::Schema::Cart&gt;, L&lt;Handel::Constants&gt;
 
 =head1 AUTHOR
 </diff>
      <filename>lib/Handel/Cart.pm</filename>
    </modified>
    <modified>
      <diff>@@ -4,40 +4,36 @@ use strict;
 use warnings;
 
 BEGIN {
-    use base 'Handel::DBI';
-    use Handel::Constraints qw(:all);
-    use Handel::Currency;
-    use Handel::L10N qw(translate);
-};
+    use base qw/Handel::Base/;
+    use Handel::L10N qw/translate/;
 
-__PACKAGE__-&gt;table('cart_items');
-__PACKAGE__-&gt;autoupdate(1);
-__PACKAGE__-&gt;iterator_class('Handel::Iterator');
-__PACKAGE__-&gt;columns(All =&gt; qw(id cart sku quantity price description));
-__PACKAGE__-&gt;columns(Essential =&gt; qw(id cart sku quantity price description));
-__PACKAGE__-&gt;has_a(price =&gt; 'Handel::Currency');
-__PACKAGE__-&gt;add_constraint('quantity', quantity =&gt; \&amp;constraint_quantity);
-__PACKAGE__-&gt;add_constraint('price',    price    =&gt; \&amp;constraint_price);
-__PACKAGE__-&gt;add_constraint('id',       id       =&gt; \&amp;constraint_uuid);
-__PACKAGE__-&gt;add_constraint('cart',     cart     =&gt; \&amp;constraint_uuid);
+    __PACKAGE__-&gt;storage_class('Handel::Storage::DBIC::Cart::Item');
+    __PACKAGE__-&gt;create_accessors;
+};
 
-sub new {
-    my ($self, $data) = @_;
+sub create {
+    my ($self, $data, $opts) = @_;
 
     throw Handel::Exception::Argument( -details =&gt;
-        translate('Param 1 is not a HASH reference') . '.') unless
-            ref($data) eq 'HASH';
+        translate('PARAM1_NOT_HASHREF')
+    ) unless ref($data) eq 'HASH'; ## no critic
 
-    if (!defined($data-&gt;{'id'}) || !constraint_uuid($data-&gt;{'id'})) {
-        $data-&gt;{'id'} = $self-&gt;uuid;
+    no strict 'refs';
+    my $storage = $opts-&gt;{'storage'};
+    if (!$storage) {
+        $storage = $self-&gt;storage;
     };
 
-    return $self-&gt;construct($data);
+    return $self-&gt;create_instance(
+        $storage-&gt;create($data)
+    );
 };
 
 sub total {
     my $self = shift;
-    return Handel::Currency-&gt;new($self-&gt;quantity * $self-&gt;price);
+    my $storage = $self-&gt;result-&gt;storage;
+
+    return $storage-&gt;currency_class-&gt;new($self-&gt;quantity * $self-&gt;price);
 };
 
 1;
@@ -45,37 +41,38 @@ __END__
 
 =head1 NAME
 
-Handel::Cart::Item - Module representing an individual shopping cart line item
+Handel::Cart::Item - Module representing an individual shopping cart item
 
 =head1 SYNOPSIS
 
     use Handel::Cart::Item;
-
-    my $item = Handel::Cart::Item-&gt;new({
-        sku =&gt; '1234',
-        price =&gt; 1.23,
+    
+    my $item = Handel::Cart::Item-&gt;create({
+        cart     =&gt; '11111111-1111-1111-1111-111111111111',
+        sku      =&gt; '1234',
+        price    =&gt; 1.23,
         quantity =&gt; 1
     });
 
-    $cart-&gt;add($item);
-
 =head1 DESCRIPTION
 
-C&lt;Handel::Cart::Item&gt; is used in two main ways. First, you can create new line
-items and add them to an existing cart object:
+Handel::Cart::Item is used in two main ways. First, you can create or edit cart
+items individually:
 
     use Handel::Cart::Item;
-
-    my $item = Handel::Cart::Item-&gt;new({
+    
+    my $item = Handel::Cart::Item-&gt;create({
+        cart =&gt; '11111111-1111-1111-1111-111111111111',
         sku =&gt; '1234',
         price =&gt; 1.23,
         quantity =&gt; 1
     });
 
-    $cart-&gt;add($item);
+As a general rule, you probably want to add/edit items using the cart objects
+C&lt;items&gt; and C&lt;add&gt; methods below instead.
 
-Second, the C&lt;items&gt; method of any valid C&lt;Handel::Cart&gt; object returns a
-collection of C&lt;Handel::Cart::Item&gt; objects:
+Second, the C&lt;items&gt; method of any valid Handel::Cart object returns a
+collection of Handel::Cart::Item objects:
 
     my @items = $cart-&gt;items;
     foreach (@items) {
@@ -84,57 +81,143 @@ collection of C&lt;Handel::Cart::Item&gt; objects:
 
 =head1 CONSTRUCTOR
 
-=head2 new
+=head2 create
+
+=over
+
+=item Arguments: \%data [, \%options]
+
+=back
 
-You can create a new C&lt;Handel::Cart::Item&gt; object by calling the C&lt;new&gt; method:
+You can create a new Handel::Cart::Item object by calling the C&lt;new&gt; method:
 
-    my $item = Handel::Cart::Item-&gt;new({
+    my $item = Handel::Cart::Item-&gt;create({
+        cart =&gt; '11111111-1111-1111-1111-111111111111',
         sku =&gt; '1234',
         price =&gt; 1.23,
         quantity =&gt; 1
     });
-
+    
     $item-&gt;quantity(2);
-
+    
     print $item-&gt;total;
 
-This is a lazy operation. No actual item record is created until the item object
-is passed into the C&lt;add&gt; method of a C&lt;Handel::Cart&gt; object.
+The following options are available:
+
+=over
 
-=head1 METHODS
+=item storage
+
+A storage object to use to create a new item object. Currently, this storage
+object B&lt;must&gt; have the same columns as the default storage object for the
+current item class.
+
+=back
+
+=head1 COLUMNS
+
+The following methods are mapped to columns in the default cart schema.
+These methods may or may not be available in any subclasses, or in situations
+where a custom schema is being used that has different column names.
+
+=head2 id
+
+Returns the id of the current cart item.
+
+    print $item-&gt;id;
+
+See L&lt;Handel::Schema::Cart::Item/id&gt; for more information about this column.
+
+=head2 cart
+
+Gets/sets the id of the cart this item belongs to.
+
+    $item-&gt;cart('11111111-1111-1111-1111-111111111111');
+    print $item-&gt;cart;
+
+See L&lt;Handel::Schema::Cart::Item/cart&gt; for more information about this column.
 
 =head2 sku
 
-Returns or sets the sku (stock keeping unit/part number) for the cart item.
+=over
+
+=item Arguments: $sku
+
+=back
+
+Gets/sets the sku (stock keeping unit/part number) for the cart item.
+
+    $item-&gt;sku('ABC123');
+    print $item-&gt;sku;
+
+See L&lt;Handel::Schema::Cart::Item/sku&gt; for more information about this column.
 
 =head2 quantity
 
-Returns or sets the quantity the cart item.
+=over
+
+=item Arguments: $quantity
+
+=back
+
+Gets/sets the quantity, or the number of this item being purchased.
+
+    $item-&gt;quantity(3);
+    print $item-&gt;quantity;
+
+By default, the value supplied will be checked against
+L&lt;Handel::Constraints/constraint_quantity&gt; to verify it is within the valid
+range of values.
+
+See L&lt;Handel::Schema::Cart::Item/quantity&gt; for more information about this
+column.
 
 =head2 price
 
-Returns or sets the price for the cart item.
+=over
+
+=item Arguments: $price
+
+=back
+
+Gets/sets the price for the cart item. The price is returned as a stringified
+L&lt;Handel::Currency|Handel::Currency&gt; object.
 
-Starting in version C&lt;0.12&gt;, price now returns a stringified
-C&lt;Handel::Currency&gt; object. This can be used to format the price,
-and convert its value from on currency to another.
+    $item-&gt;price(12.95);
+    print $item-&gt;price;
+    print $item-&gt;price-&gt;format;
+
+
+See L&lt;Handel::Schema::Cart::Item/price&gt; for more information about this column.
 
 =head2 total
 
-Returns the total price for the cart item. This is really just
+Returns the total price for the cart item as a stringified
+L&lt;Handel::Currency|Handel::Currency&gt; object. This is really just
 quantity*total and is provided for convenience.
 
-Starting in version C&lt;0.12&gt;, subtotal now returns a stringified
-C&lt;Handel::Currency&gt; object. This can be used to format the price,
-and convert its value from on currency to another.
+    print $item-&gt;total;
+    print $item-&gt;total-&gt;format;
 
 =head2 description
 
-Returns or sets the description for the cart item.
+=over
+
+=item Arguments: $description
+
+=back
+
+Gets/sets the description for the current cart item.
+
+    $item-&gt;description('Best Item Ever');
+    print $item-&gt;description;
+
+See L&lt;Handel::Schema::Cart::Item/description&gt; for more information about this
+column.
 
 =head1 SEE ALSO
 
-L&lt;Handel::Cart&gt;, L&lt;Handel::Currency&gt;
+L&lt;Handel::Cart&gt;, L&lt;Handel::Schema::Cart::Item&gt;, L&lt;Handel::Currency&gt;
 
 =head1 AUTHOR
 
@@ -142,8 +225,3 @@ L&lt;Handel::Cart&gt;, L&lt;Handel::Currency&gt;
     CPAN ID: CLACO
     claco@chrislaco.com
     http://today.icantfocus.com/blog/
-
-
-
-
-</diff>
      <filename>lib/Handel/Cart/Item.pm</filename>
    </modified>
    <modified>
      <diff>@@ -5,21 +5,23 @@ use warnings;
 
 BEGIN {
     use Handel;
-    use Handel::Cart;
-    use Handel::Checkout::Stash;
-    use Handel::Constants qw(:checkout :returnas);
-    use Handel::Constraints qw(constraint_checkout_phase constraint_uuid);
-    use Handel::Exception qw(:try);
+    use Handel::Constants qw/:all/;
+    use Handel::Constraints qw/constraint_checkout_phase constraint_uuid/;
+    use Handel::Exception qw/try with otherwise finally/;
     use Handel::Checkout::Message;
-    use Handel::L10N qw(translate);
-    use Handel::Order;
-    use Module::Pluggable 2.95 instantiate =&gt; 'new', sub_name =&gt; '_plugins';
-    use base qw(Class::Data::Inheritable);
-
-    __PACKAGE__-&gt;mk_classdata(_order_class =&gt; 'Handel::Order');
-    __PACKAGE__-&gt;mk_classdata(_stash_class =&gt; 'Handel::Checkout::Stash');
+    use Handel::L10N qw/translate/;
+    use Module::Pluggable::Object;
+    use Class::Inspector;
+    use Scalar::Util qw/blessed/;
+
+    use base qw/Class::Accessor::Grouped/;
+    __PACKAGE__-&gt;mk_group_accessors('component_class', qw/order_class stash_class/);
+    __PACKAGE__-&gt;mk_group_accessors('simple', qw/stash/);
 };
 
+__PACKAGE__-&gt;order_class('Handel::Order');
+__PACKAGE__-&gt;stash_class('Handel::Checkout::Stash');
+
 sub new {
     my $class = shift;
     my $opts = shift || {};
@@ -27,22 +29,39 @@ sub new {
         plugins =&gt; [],
         handlers =&gt; {},
         phases =&gt; [],
-        messages =&gt; [],
-        stash =&gt; $opts-&gt;{'stash'} || $class-&gt;stash_class-&gt;new
-    }, ref $class || $class;
+        messages =&gt; []
+    }, $class;
+
+    my $stash = $opts-&gt;{'stash'};
 
-    $self-&gt;_set_search_path($opts);
+    if (blessed $stash) {
+        $self-&gt;stash($stash);
+    } elsif (ref $stash eq 'HASH') {
+        $self-&gt;stash(
+            $self-&gt;stash_class-&gt;new($stash)
+        );
+    } else {
+        $self-&gt;stash(
+            $self-&gt;stash_class-&gt;new
+        );
+    };
 
-    foreach ($self-&gt;_plugins($self)) {
-        if (UNIVERSAL::isa($_, 'Handel::Checkout::Plugin')) {
+    foreach ($self-&gt;load_plugins($opts)) {
+        if (blessed($_) &amp;&amp; $_-&gt;isa('Handel::Checkout::Plugin')) {
             push @{$self-&gt;{'plugins'}}, $_;
             $_-&gt;register($self);
         };
     };
 
-    $self-&gt;cart($opts-&gt;{'cart'}) if $opts-&gt;{'cart'};
-    $self-&gt;order($opts-&gt;{'order'}) if $opts-&gt;{'order'};
-    $self-&gt;phases($opts-&gt;{'phases'}) if $opts-&gt;{'phases'};
+    if ($opts-&gt;{'cart'}) {
+        $self-&gt;cart($opts-&gt;{'cart'});
+    };
+    if ($opts-&gt;{'order'}) {
+        $self-&gt;order($opts-&gt;{'order'});
+    };
+    if ($opts-&gt;{'phases'}) {
+        $self-&gt;phases($opts-&gt;{'phases'});
+    };
 
     return $self;
 };
@@ -58,14 +77,12 @@ sub add_handler {
     my ($package) = caller;
 
     throw Handel::Exception::Argument( -details =&gt;
-        translate(
-            'Param 1 is not a a valid CHECKOUT_PHASE_* value') . '.')
-            unless constraint_checkout_phase($phase);
+        translate('PARAM1_NOT_CHECKOUT_PHASE')
+    ) unless constraint_checkout_phase($phase); ## no critic
 
     throw Handel::Exception::Argument( -details =&gt;
-        translate(
-            'Param 1 is not a CODE reference') . '.')
-            unless ref($ref) eq 'CODE';
+        translate('PARAM1_NOT_CODEREF')
+    ) unless ref($ref) eq 'CODE'; ## no critic
 
     foreach (@{$self-&gt;{'plugins'}}) {
         if (ref $_ eq $package) {
@@ -74,26 +91,29 @@ sub add_handler {
                     my $plugin = $self-&gt;{'handlers'}-&gt;{$phase}-&gt;{$preference}-&gt;[0];
 
                     throw Handel::Exception::Checkout( -details =&gt;
-                        translate(&quot;There is already a handler in phase ([_1]) for preference ([_2]) from the plugin ([_3])&quot;, $phase, $preference, $plugin) . '.')
+                        translate('HANDLER_EXISTS_IN_PHASE', $phase, $preference, $plugin)
+                    );
                 };
             } else {
-                my @prefs = sort {$a &lt;=&gt; $b} keys %{$self-&gt;{'handlers'}-&gt;{'$phase'}};
+                my @prefs = sort {$a &lt;=&gt; $b} keys %{$self-&gt;{'handlers'}-&gt;{$phase}};
                 $preference = scalar @prefs ? $#prefs++ : 101;
             };
             $self-&gt;{'handlers'}-&gt;{$phase}-&gt;{$preference} = [$_, $ref];
             last;
         };
     };
+
+    return;
 };
 
 sub add_message {
     my ($self, $message) = @_;
     my ($package, $filename, $line) = caller;
 
-    if (ref $message &amp;&amp; UNIVERSAL::isa($message, 'Handel::Checkout::Message')) {
-        $message-&gt;package($package) unless $message-&gt;package;
-        $message-&gt;filename($filename) unless $message-&gt;filename;
-        $message-&gt;line($line) unless $message-&gt;line;
+    if (blessed($message) &amp;&amp; $message-&gt;isa('Handel::Checkout::Message')) {
+        $message-&gt;package($package) unless $message-&gt;package;       ## no critic
+        $message-&gt;filename($filename) unless $message-&gt;filename;    ## no critic
+        $message-&gt;line($line) unless $message-&gt;line;                ## no critic
 
         push @{$self-&gt;{'messages'}}, $message;
     } elsif (!ref $message || ref $message eq 'Apache::AxKit::Exception::Error') {
@@ -101,8 +121,11 @@ sub add_message {
             text =&gt; $message, source =&gt; $package, filename =&gt; $filename, line =&gt; $line);
     } else {
         throw Handel::Exception::Argument( -details =&gt;
-            translate('Param 1 is not a Handel::Checkout::Message object or text message') . '.');
+            translate('PARAM1_NOT_CHECKOUT_MESSAGE')
+        );
     };
+
+    return;
 };
 
 sub add_phase {
@@ -111,15 +134,15 @@ sub add_phase {
 
     if (Handel::Constants-&gt;can($name)) {
         throw Handel::Exception::Constraint(
-            -text =&gt; translate(&quot;A constant named '$name' already exists in Handel::Constants&quot;)
+            -text =&gt; translate('CONSTANT_NAME_ALREADY_EXISTS', $name)
         );
     } elsif (constraint_checkout_phase($value)) {
         throw Handel::Exception::Constraint(
-            -text =&gt; translate(&quot;A phase constant value of '$value' already exists&quot;)
+            -text =&gt; translate('CONSTANT_VALUE_ALREADY_EXISTS', $value)
         );
     } elsif ($import &amp;&amp; main-&gt;can($name)) {
         throw Handel::Exception::Constraint(
-            -text =&gt; translate(&quot;A constant named '$name' already exists in caller '$caller'&quot;)
+            -text =&gt; translate('CONSTANT_EXISTS_IN_CALLER', $name, $caller)
         );
     } else {
         my $sub = sub {return $value};
@@ -133,25 +156,26 @@ sub add_phase {
 
         push @Handel::Constants::CHECKOUT_ALL_PHASES, $value;
     };
+
+    return;
 };
 
 sub clear_messages {
     my $self = shift;
 
     $self-&gt;{'messages'} = [];
+
+    return;
 };
 
 sub cart {
     my ($self, $cart) = @_;
 
     if ($cart) {
-        if (ref $cart eq 'HASH' || UNIVERSAL::isa($cart, 'Handel::Cart') || constraint_uuid($cart)) {
-            $self-&gt;order($self-&gt;order_class-&gt;new({cart =&gt; $cart}));
-        } else {
-            throw Handel::Exception::Argument( -details =&gt;
-                translate('Param 1 is not a HASH reference, Handel::Cart object, or cart id') . '.');
-        };
+        $self-&gt;order($self-&gt;order_class-&gt;create({cart =&gt; $cart}));
     };
+
+    return;
 };
 
 sub messages {
@@ -160,34 +184,32 @@ sub messages {
     return wantarray ? @{$self-&gt;{'messages'}} : $self-&gt;{'messages'};
 };
 
-sub order_class {
-    my ($self, $order_class) = @_;
-
-    if ($order_class) {
-        eval &quot;require $order_class&quot;;
-        $self-&gt;_order_class($order_class);
-    };
-
-    return $self-&gt;_order_class;
-};
-
 sub order {
     my ($self, $order) = @_;
 
     if ($order) {
         if (ref $order eq 'HASH') {
-            $self-&gt;{'order'} = $self-&gt;order_class-&gt;load($order, RETURNAS_ITERATOR)-&gt;first;
-        } elsif (UNIVERSAL::isa($order, 'Handel::Order')) {
+            $self-&gt;{'order'} = $self-&gt;order_class-&gt;search($order)-&gt;first;
+        } elsif (blessed($order) &amp;&amp; $order-&gt;isa('Handel::Order')) {
             $self-&gt;{'order'} = $order;
-        } elsif (constraint_uuid($order)) {
-            $self-&gt;{'order'} = $self-&gt;order_class-&gt;load({id =&gt; $order});
+        } elsif (!ref $order) {
+            my ($primary_key) = $self-&gt;order_class-&gt;storage-&gt;primary_columns;
+
+            $self-&gt;{'order'} = $self-&gt;order_class-&gt;search({$primary_key =&gt; $order})-&gt;first;
         } else {
             throw Handel::Exception::Argument( -details =&gt;
-                translate('Param 1 is not a HASH reference, Handel::Order object, or order id') . '.');
-        }
-    } else {
-        return $self-&gt;{'order'};
+                translate('PARAM1_NOT_HASHREF_ORDER')
+            );
+        };
+
+        if (!$self-&gt;order) {
+            throw Handel::Exception::Checkout( -details =&gt;
+                translate('ORDER_NOT_FOUND')
+            );
+        };
     };
+
+    return $self-&gt;{'order'};
 };
 
 sub phases {
@@ -195,7 +217,8 @@ sub phases {
 
     if ($phases) {
         throw Handel::Exception::Argument( -details =&gt;
-            translate('Param 1 is not an ARRAY reference or string') . '.') unless (ref($phases) eq 'ARRAY' || !ref($phases));
+            translate('PARAM1_NOT_ARRAYREF_STRING')
+        ) unless (ref($phases) eq 'ARRAY' || !ref($phases)); ## no critic
 
         if (! ref $phases) {
             # holy crap, that actually worked!
@@ -205,11 +228,13 @@ sub phases {
         $self-&gt;{'phases'} = $phases;
     } else {
         if (wantarray) {
-            return (scalar @{$self-&gt;{'phases'}}) ? @{$self-&gt;{'phases'}} : @{&amp;CHECKOUT_DEFAULT_PHASES};
+            return (scalar @{$self-&gt;{'phases'}}) ? @{$self-&gt;{'phases'}} : @{&amp;CHECKOUT_DEFAULT_PHASES}; ## no critic
         } else {
-            return (scalar @{$self-&gt;{'phases'}}) ? $self-&gt;{'phases'} : &amp;CHECKOUT_DEFAULT_PHASES;
+            return (scalar @{$self-&gt;{'phases'}}) ? $self-&gt;{'phases'} : CHECKOUT_DEFAULT_PHASES;
         };
     };
+
+    return;
 };
 
 sub process {
@@ -218,27 +243,26 @@ sub process {
 
     if ($phases) {
         throw Handel::Exception::Argument( -details =&gt;
-            translate(
-                'Param 1 is not an ARRAY reference or string') . '.')
-                unless (ref($phases) eq 'ARRAY' || ! ref($phases));
+            translate('PARAM1_NOT_ARRAYREF_STRING')
+        ) unless (ref($phases) eq 'ARRAY' || ! ref($phases)); ## no critic
 
         if (! ref $phases) {
             # holy crap, that actually worked!
             $phases = [map(eval &quot;$_&quot;, _path_to_array($phases))];
         };
     } else {
-        $phases = $self-&gt;{'phases'} || CHECKOUT_DEFAULT_PHASES;
+        $phases = scalar @{$self-&gt;{'phases'}} ? $self-&gt;{'phases'} : CHECKOUT_DEFAULT_PHASES;
     };
 
     throw Handel::Exception::Checkout( -details =&gt;
-        translate('No order is assocated with this checkout process') . '.')
-            unless $self-&gt;order;
+        translate('NO_ORDER_LOADED')
+    ) unless $self-&gt;order; ## no critic
 
     $self-&gt;stash-&gt;clear;
     $self-&gt;_setup($self);
 
     {
-        local $self-&gt;order-&gt;db_Main-&gt;{AutoCommit};
+        $self-&gt;order-&gt;result-&gt;txn_begin;
 
         foreach my $phase (@{$phases}) {
             next unless $phase;
@@ -251,9 +275,14 @@ sub process {
                 if ($status != CHECKOUT_HANDLER_OK &amp;&amp; $status != CHECKOUT_HANDLER_DECLINE) {
                     $self-&gt;_teardown($self);
 
-                    eval {$self-&gt;order-&gt;dbi_rollback};
-                    if ($@) {
-                        throw Handel::Exception(-details =&gt; &quot;Transaction aborted. Rollback failed: $@&quot;);
+                    try {
+                        $self-&gt;order-&gt;result-&gt;txn_rollback;
+                        $self-&gt;order-&gt;result-&gt;discard_changes;
+                        foreach my $item ($self-&gt;order-&gt;items-&gt;all) {
+                            $item-&gt;result-&gt;discard_changes;
+                        };
+                    } otherwise {
+                        throw Handel::Exception::Checkout(-details =&gt; translate('ROLLBACK_FAILED', shift));
                     };
 
                     return CHECKOUT_STATUS_ERROR;
@@ -261,7 +290,7 @@ sub process {
             };
         };
 
-        $self-&gt;order-&gt;dbi_commit;
+        $self-&gt;order-&gt;result-&gt;txn_commit;
     };
 
     $self-&gt;_teardown($self);
@@ -269,33 +298,16 @@ sub process {
     return CHECKOUT_STATUS_OK;
 };
 
-sub stash_class {
-    my ($self, $stash_class) = @_;
-
-    if ($stash_class) {
-        eval &quot;require $stash_class&quot;;
-        $self-&gt;_stash_class($stash_class);
-    };
-
-    return $self-&gt;_stash_class;
-};
-
-sub stash {
-    my $self = shift;
-
-    return $self-&gt;{'stash'};
-};
-
 sub _setup {
     my $self = shift;
 
     foreach (@{$self-&gt;{'plugins'}}) {
         try {
             $_-&gt;setup($self);
-        } otherwise {
-            warn shift-&gt;text;
         };
     };
+
+    return;
 };
 
 sub _teardown {
@@ -304,15 +316,17 @@ sub _teardown {
     foreach (@{$self-&gt;{'plugins'}}) {
         try {
             $_-&gt;teardown($self);
-        } otherwise {
-            warn shift-&gt;text;
         };
     };
+
+    return;
 };
 
-sub _set_search_path {
+sub load_plugins {
     my ($self, $opts) = @_;
-    my $config = $Handel::Cfg;
+    my ($package, $file) = caller;
+    my $config = Handel-&gt;config;
+    my $search_path;
 
     my $pluginpaths = ref $opts-&gt;{'pluginpaths'} eq 'ARRAY' ?
         join(' ', @{$opts-&gt;{'pluginpaths'}}) : $opts-&gt;{'pluginpaths'} || '';
@@ -321,32 +335,35 @@ sub _set_search_path {
         join(' ', @{$opts-&gt;{'addpluginpaths'}}) : $opts-&gt;{'addpluginpaths'} || '' ;
 
     if ($pluginpaths) {
-        $self-&gt;search_path(new =&gt; _path_to_array($pluginpaths));
+        $search_path = [_path_to_array($pluginpaths)];
     } elsif (my $path = $config-&gt;{'HandelPluginPaths'}) {
-        $self-&gt;search_path(new =&gt; _path_to_array($path));
+        $search_path = [_path_to_array($path)];
     } elsif ($path = $config-&gt;{'HandelAddPluginPaths'} || $addpluginpaths) {
-        $self-&gt;search_path(new =&gt; 'Handel::Checkout::Plugin', _path_to_array(&quot;$path $addpluginpaths&quot;));
+        $search_path = [&quot;$package\:\:Plugin&quot;, _path_to_array(&quot;$path $addpluginpaths&quot;)];
+    } else {
+        $search_path = [&quot;$package\:\:Plugin&quot;];
     };
 
-    ## reset these crazy things
-    $self-&gt;except([]);
-    $self-&gt;only([]);
-
     my $ignore = $opts-&gt;{'ignoreplugins'} || $config-&gt;{'HandelIgnorePlugins'};
-    if (ref $ignore eq 'Regexp' || ref $ignore eq 'ARRAY') {
-        $self-&gt;except($ignore);
-    } elsif ($ignore) {
-        $self-&gt;except([_path_to_array($ignore)]);
+    if (ref $ignore ne 'Regexp' &amp;&amp; ref $ignore ne 'ARRAY' &amp;&amp; $ignore) {
+        $ignore = [_path_to_array($ignore)];
     };
 
     my $only = $opts-&gt;{'loadplugins'} || $config-&gt;{'HandelLoadPlugins'};
-    if (ref $only eq 'Regexp' || ref $only eq 'ARRAY') {
-        $self-&gt;only($only);
-    } elsif ($only) {
-        $self-&gt;only([_path_to_array($only)]);
+    if (ref $only ne 'Regexp' &amp;&amp; ref $only ne 'ARRAY' &amp;&amp; $only) {
+        $only = [_path_to_array($only)];
     };
 
-    return undef;
+    my $finder = Module::Pluggable::Object-&gt;new(
+        instantiate =&gt; 'new',
+        package     =&gt; $package,
+        file        =&gt; $file,
+        search_path =&gt; $search_path,
+        except      =&gt; $ignore,
+        only        =&gt; $only
+    );
+
+    return $finder-&gt;plugins;
 };
 
 sub _path_to_array {
@@ -360,6 +377,30 @@ sub _path_to_array {
     return split /\s+/, $path;
 };
 
+sub get_component_class {
+    my ($self, $field) = @_;
+
+    return $self-&gt;get_inherited($field);
+};
+
+sub set_component_class {
+    my ($self, $field, $value) = @_;
+
+    if ($value) {
+        if (!Class::Inspector-&gt;loaded($value)) {
+            eval &quot;require $value&quot;; ## no critic
+    
+            throw Handel::Exception::Checkout(
+                -details =&gt; translate('COMPCLASS_NOT_LOADED', $field, $value)
+            ) if $@; ## no critic
+        };
+    };
+
+    $self-&gt;set_inherited($field, $value);
+
+    return;
+};
+
 1;
 __END__
 
@@ -370,12 +411,14 @@ Handel::Checkout - Checkout Pipeline Processor
 =head1 SYNOPSIS
 
     use Handel::Checkout;
-
+    use strict;
+    use warnings;
+    
     my $checkout = Handel::Checkout-&gt;new({
         cart    =&gt; '122345678-9098-7654-3212-345678909876',
         phases  =&gt; [CHECKOUT_PHASE_INITIALIZE, CHECKOUT_PHASE_VALIDATE]
     });
-
+    
     if ($checkout-&gt;process == CHECKOUT_STATUS_OK) {
         print 'Your order number is ', $checkout-&gt;order-&gt;number;
     } else {
@@ -392,31 +435,41 @@ allowing the checkout process to be customized for many different needs.
 
 =head1 CONSTRUCTOR
 
-=head2 new([\%options])
+=head2 new
+
+=over
 
-Creates a new checkout pipeline process and loads all available plugins.
-C&lt;new&gt; accepts the following options in an optional HASH reference:
+=item Arguments: \%options
+
+=back
+
+Creates a new checkout pipeline process and loads all available plugins in the
+default plugin namespace (Handel::Checkout::Plugin). C&lt;new&gt; accepts the
+following options in an optional HASH reference:
 
 =over
 
 =item cart
 
-A HASH reference, Handel::Cart object, or a cart id. This will be loaded
-into a new Handel::Order object and associated with the new checkout
-process.
+A HASH reference, a class object, or a cart primary key value. This will be
+loaded into a new order object and associated with the new checkout
+process. By default, a Handel::Order object will be create unless you have
+set C&lt;order_class&gt; to another class.
 
 See C&lt;cart&gt; below for further details about the various values allowed
 to be passed.
 
 B&lt;Note&gt;: When creating a new order via Handel::Order, C&lt;new&gt; will automatically
-create a checkout process and process the C&lt;CHECKOUT_PHASE_INITIALIZE&gt;.
+create a checkout process and process the C&lt;CHECKOUT_PHASE_INITIALIZE&gt; phase.
 However, when a new order is created using C&lt;cart&gt; in Handel::Checkout, the
 automatic processing of C&lt;CHECKOUT_PHASE_INITIALIZE&gt; is disabled.
 
 =item order
 
-A HASH reference, Handel::Order object, or an order id. This will be loaded
-and associated with the new checkout process.
+A HASH reference, an order object, or an order primary key value. This will be
+loaded and associated with the new checkout process. By default, a Handel::Order
+object will be create when you pass in an order id unless you have set
+C&lt;order_class&gt; to another class.
 
 See C&lt;order&gt; below for further details about the various values allowed
 to be passed.
@@ -425,17 +478,17 @@ to be passed.
 
 An array reference or a comma (or space) separated list containing the various
 namespaces of plugins to be loaded. This will override any settings in
-C&lt;ENV&gt; or F&lt;httpd.conf&gt; for the current checkout instance only.
+C&lt;ENV&gt; or F&lt;httpd.conf&gt; for the current checkout object only.
 
     my $checkout = Handel::Checkout-&gt;new({
         pluginpaths =&gt; [MyNamespace::Plugins, Other::Plugin]
     });
-
+    
     my $checkout = Handel::Checkout-&gt;new({
         pluginpaths =&gt; 'MyNamespace::Plugins, Other::Plugin'
     });
 
-See L&lt;&quot;HandelPluginPaths&quot;&gt; for more information about settings/resetting
+See L&lt;/HandelPluginPaths&gt; for more information about settings/resetting
 plugin search paths.
 
 =item addpluginpaths
@@ -447,12 +500,12 @@ If C&lt;HandelAddPluginPaths&gt; is also specified, the two will be combined.
     my $checkout = Handel::Checkout-&gt;new({
         addpluginpaths =&gt; [MyNamespace::Plugins, Other::Plugin]
     });
-
+    
     my $checkout = Handel::Checkout-&gt;new({
         addpluginpaths =&gt; 'MyNamespace::Plugins, Other::Plugin'
     });
 
-See L&lt;&quot;HandelAddPluginPaths&quot;&gt; for more information about settings/resetting
+See L&lt;/HandelAddPluginPaths&gt; for more information about settings/resetting
 plugin search paths.
 
 =item loadplugins
@@ -460,7 +513,7 @@ plugin search paths.
 An array reference or a comma (or space) separated list containing the
 names of the specific plugins to load in the current plugin paths.
 
-See L&lt;&quot;HandelLoadPlugins&quot;&gt; for more information about loading specific
+See L&lt;/HandelLoadPlugins&gt; for more information about loading specific
 plugins.
 
 =item ignoreplugins
@@ -469,7 +522,7 @@ An array reference or a comma (or space) separated list containing the
 names of the specific plugins to be ignored (not loaded)
 in the current plugin paths.
 
-See L&lt;&quot;HandelIgnorePlugins&quot;&gt; for more information about ignore specific
+See L&lt;/HandelIgnorePlugins&gt; for more information about ignore specific
 plugins.
 
 =item phases
@@ -478,35 +531,49 @@ An array reference or a comma (or space) separated list containing the
 various phases to be executed.
 
     my $checkout = Handel::Checkout-&gt;new({
-        phases =&gt; [CHECKOUT_PHASE_VALIDATION,
-                   CHECKOUT_PHASE_AUTHORIZATION]
+        phases =&gt; [CHECKOUT_PHASE_VALIDATE,
+                   CHECKOUT_PHASE_AUTHORIZE]
     });
-
+    
     my $checkout = Handel::Checkout-&gt;new({
-        phases =&gt; 'CHECKOUT_PHASE_VALIDATION, CHECKOUT_PHASE_AUTHORIZATION'
+        phases =&gt; 'CHECKOUT_PHASE_VALIDATE, CHECKOUT_PHASE_AUTHORIZE'
     });
 
 =item stash
 
-A Handel::Checkout::Stash instance of subclass instance. If nothing is specified,
-$self-&gt;stash_class will be used instead.
+A Handel::Checkout::Stash object, subclass or a hash reference. If nothing is
+specified, C&lt;stash_class&gt; will be used instead.
+
+    my $checkout = Handel::Checkout-&gt;new({
+        stash =&gt; { key =&gt; 'value' }
+    });
+    
+    my $checkout = Handel::Checkout-&gt;new({
+        stash =&gt; $stash
+    });
 
 =back
 
 =head1 METHODS
 
-=head2 add_handler($phase, \&amp;coderef, $preference)
+=head2 add_handler
+
+=over
+
+=item Arguments: $phase, \&amp;coderef, $preference
 
-Registers a code reference with the checkout phase specified and assigned a run
+=back
+
+Registers a code reference with the checkout phase specified and assigns a run
 order preference. This is usually called within C&lt;register&gt; on the current
-checkout context:
+checkout context within a plugin:
 
     sub register {
         my ($self, $ctx) = @_;
 
         $ctx-&gt;add_handler(CHECKOUT_PHASE_DELIVER, \&amp;myhandler, 200);
     };
-
+    
     sub myhandler {
         ...
     };
@@ -517,11 +584,17 @@ list after all other handlers in that phase.
 If there is already a handler in the specified phase with the same preference, a
 Handel::Exception::Checkout exception will be thrown.
 
-While not enforced, please keep your handler preference orders between 251 - 749.
-Preference orders 1-250 and 750-1000 will be reserved for core modules that need
-to run before or after all other plugin handlers.
+While not enforced, please keep your handler preference orders between
+251 - 749. Preference orders 1-250 and 750-1000 will be reserved for core
+modules that need to run before or after all other plugin handlers.
+
+=head2 add_message
+
+=over
+
+=item Arguments: $message
 
-=head2 add_message($message)
+=back
 
 Adds a new text message or Handel::Checkout::Message based object
 to the message stack so plugins can log their issues for later inspection.
@@ -530,7 +603,7 @@ to the message stack so plugins can log their issues for later inspection.
         my ($self, $ctx) = @_;
         ...
         $ctx-&gt;add_message('Skipping phase for countries other than US...');
-
+    
         return CHECKOUT_HANDLER_DECLINE;
     };
 
@@ -539,34 +612,46 @@ If your adding a simple text message, a new Handel::Checkout::Message object
 will automatically be created and C&lt;package&gt;, C&lt;filename&gt;, and C&lt;line&gt;
 properties will be set.
 
-=head2 add_phase($name, $value [, $import]);
+=head2 add_phase
+
+=over
+
+=item Arguments: $name, $value [, $import]
+
+=back
 
 Adds a new constant/sub named $name to Handel::Constant and adds the $value to
-CHECKOUT_ALL_PHASES. The new phase will be accepted by &amp;constraint_checkout_phase
-and can be used by checkout plugins registering their handlers via
-add_handler($phase, &amp;handler). If $import is true, add_phase will register the
-constant in the local namespace just as if it you had specified it in your use
-statement.
+CHECKOUT_ALL_PHASES. The new phase will be accepted by
+C&lt;constraint_checkout_phase&gt; and can be used by checkout plugins registering
+their handlers via add_handler($phase, &amp;handler). If $import is true,
+C&lt;add_phase&gt; will register the constant in the local namespace just as if it
+you had specified it in your use statement.
 
     use Handel::Checkout;
-
+    
     Handel::Checkout-&gt;add_phase('CHECKOUT_PHASE_CUSTOMPHASE', 42, 1);
-
+    
     print constraint_checkout_phase(&amp;CHECKOUT_PHASE_CUSTOMPHASE);
-
-    $plugincontext-&gt;add_handler(Handel::Constants::CHECKOUT_PHASE_CUSTOMPHASE, &amp;handlersub);
+    
+    $plugincontext-&gt;add_handler(
+        Handel::Constants::CHECKOUT_PHASE_CUSTOMPHASE, &amp;handlersub
+    );
 
 =head2 clear_messages
 
-Clears all messages from the current checkout instance.
+Clears all messages from the current checkout object.
 
 =head2 cart
 
-Creates a new Handel::Order object from the specified cart and associates
+Creates a new order object from the specified cart and associates
 that order with the current checkout process. This is typically only needed
 the first time you want to run checkout for a specific cart. From then on,
 you only need to load the already created order using C&lt;order&gt; below.
 
+By default, a Handel::Order object will be create unless you have
+set C&lt;order_class&gt; to another class. When the order class loads a cart by id, it
+will create a cart using the C&lt;cart_class&gt; set in the C&lt;order_class&gt;.
+
 C&lt;cart&gt; can accept one of three possible parameter values:
 
 =over
@@ -574,67 +659,83 @@ C&lt;cart&gt; can accept one of three possible parameter values:
 =item cart(\%filter)
 
 When you pass a HASH reference, C&lt;cart&gt; will attempt to load all available
-carts using Handel::Cart::load(\%filter). If multiple carts are found, only
-the first one will be used.
+carts. If multiple carts are found, only the first one will be used.
 
     $checkout-&gt;cart({
         shopper =&gt; '12345678-9098-7654-3212-345678909876',
         type =&gt; CART_TYPE_TEMP
     });
 
-=item cart(Handel::Cart)
+=item cart($cart)
 
 You can also pass in an already existing Handel::Cart object or subclass. It
-will then be loaded into a new order object ans associated with the current
+will then be loaded into a new order object and associated with the current
 checkout process.
 
-    my $cart = Handel::Cart-&gt;load({
+    my $cart = Handel::Cart-&gt;search({
         id =&gt; '12345678-9098-7654-3212-345678909876'
-    });
-
+    })-&gt;first;
+    
     $checkout-&gt;cart($cart);
 
-=item cart($cartid)
+=item cart('11111111-1111-1111-1111-111111111111')
 
-Finally, you can pass a valid cart/uuid into C&lt;cart&gt;. The matching cart
-will be loaded into a new Handel::Order object and associated with the
-current checkout process.
+Finally, you can pass a valid cart/uuid into C&lt;cart&gt;. The matching cart will be
+loaded into a new order object and associated with the current checkout
+process.
 
     $checkout-&gt;cart('12345678-9098-7654-3212-345678909876');
 
 =back
 
-=head2 order_class($orderclass)
+=head2 order_class
 
-Gets/Sets the name of the class to use when loading existing order into the
-checkout process. By default, it loads order using Handel::Order. While you can
-set this directly in your application, it's best to set it in a custom subclass
-of Handel::Checkout.
+=over
+
+=item Arguments: $order_class
+
+=back
+
+Gets/sets the name of the class to use when loading an existing order into the
+checkout process or when creating a new order from an existing cart. By default,
+it loads order using Handel::Order. While you can set this directly in your
+application, it's best to set it in a custom subclass of Handel::Checkout.
 
     package CustomCheckout;
-    use base 'Handel::Checkout';
+    use strict;
+    use warnings;
+    use base qw/Handel::Checkout/;
     __PACKAGE__-&gt;order_class('CustomOrder');
-
+    
     ...
     use CustomCheckout;
-    my $checkout = CustomCheckout-&gt;new({order =&gt; '11111111-2222-3333-4444-555555555555'});
-
+    my $checkout = CustomCheckout-&gt;new({
+        order =&gt; '11111111-2222-3333-4444-555555555555'
+    });
+    
     print ref $checkout-&gt;order; # CustomOrder
 
-=head2 stash_class($stashclass)
+=head2 stash_class
+
+=over
 
-Gets/Sets the name of the stash class to create during C&lt;new&gt;. By default, it
-returns Handel::Checkout::Stash. While you can
-set this directly in your application, it's best to set it in a custom subclass
-of Handel::Checkout.
+=item Arguments: $stash_class
+
+=back
+
+Gets/sets the name of the stash class to create during C&lt;new&gt;. By default, it
+returns Handel::Checkout::Stash. While you can set this directly in your
+application, it's best to set it in a custom subclass of Handel::Checkout.
 
     package CustomCheckout;
-    use base 'Handel::Checkout';
+    use strict;
+    use warnings;
+    use base qw/Handel::Checkout/;
     __PACKAGE__-&gt;stash_class('MyCustomStash');
 
 =head2 messages
 
-Returns a reference to an array in list context of Handel::Checkout::Message
+Returns a reference to an array in scalar context of Handel::Checkout::Message
 objects containing additional information about plugin and other checkout
 decisions and activities. Returns a list in list context.
 
@@ -642,13 +743,26 @@ decisions and activities. Returns a list in list context.
         warn $_-&gt;text, &quot;\n&quot;;
     };
 
+=head2 load_plugins
+
+=over
+
+=item Arguments: \%options
+
+=back
+
+Returns a list of plugins pre-instantiated that match the options specified.
+The plugins returned are not yet registered.
+
+See L&lt;/new&gt; for the available plugin/plugin path options.
+
 =head2 plugins
 
-Returns a list plugins loaded for checkout instance in list context:
+Returns a list plugins loaded for current checkout object in list context:
 
     my $checkout = Handel::Checkout-&gt;new;
     my @plugins = $checkout-&gt;plugins;
-
+    
     foreach (@plugins) {
         $_-&gt;cleanup_or_something;
     };
@@ -657,7 +771,9 @@ Returns an array reference in scalar context.
 
 =head2 order
 
-Gets/Sets an existing Handel::Order object with the existing checkout process.
+Gets/sets an existing order object with the existing checkout process. By
+default, a Handel::Order object will be create unless you have set
+C&lt;order_class&gt; to another class.
 
 C&lt;order&gt; can accept one of three possible parameter values:
 
@@ -666,26 +782,25 @@ C&lt;order&gt; can accept one of three possible parameter values:
 =item order(\%filter)
 
 When you pass a HASH reference, C&lt;order&gt; will attempt to load all available
-order using Handel::Order::load(\%filter). If multiple order are found, only
-the first one will be used.
+orders. If multiple order are found, only the first one will be used.
 
     $checkout-&gt;order({
         shopper =&gt; '12345678-9098-7654-3212-345678909876',
         id =&gt; '11111111-2222-3333-4444-5555666677778888'
     });
 
-=item order(Handel::Order)
+=item order($order)
 
 You can also pass in an already existing Handel::Order object or subclass. It
 will then be associated with the current checkout process.
 
-    my $order = Handel::Order-&gt;load({
+    my $order = Handel::Order-&gt;search({
         id =&gt; '12345678-9098-7654-3212-345678909876'
-    });
-
+    })-&gt;first;
+    
     $checkout-&gt;order($order);
 
-=item order($orderid)
+=item order('11111111-1111-1111-1111-111111111111')
 
 Finally, you can pass a valid order/uuid into C&lt;order&gt;. The matching order
 will be loaded and associated with the current checkout process.
@@ -694,45 +809,60 @@ will be loaded and associated with the current checkout process.
 
 =back
 
-=head2 phases(\@phases)
+=head2 phases
+
+=over
+
+=item Arguments: \@phases
 
-Get/Set the phases active for the current checkout process. This can be
+=back
+
+Gets/sets the phases active for the current checkout process. This can be
 an array reference or a comma (or space) separated string:
 
     $checkout-&gt;phases([
         CHECKOUT_PHASE_INITIALIZE,
-        CHECKOUT_PHASE_VALIDATION
+        CHECKOUT_PHASE_VALIDATE
     ]);
+    
+    $checkout-&gt;phases('CHECKOUT_PHASE_INITIALIZE, CHECKOUT_PHASE_VALIDATE']);
 
-    $checkout-&gt;phases('CHECKOUT_PHASE_INITIALIZE, CHECKOUT_PHASE_VALIDATION']);
+No attempt is made to sanitize the array for duplicates or the order of the
+phases. This means you can do evil things like run a phase twice, or run the
+phases out of order. Returns a list in list context and an array reference in
+scalar context.
 
-No attempt is made to sanitize the array for duplicates or the order of the phases.
-This means you can do evil things like run a phase twice, or run the phases
-out of order. Returns a list in list context and an array reference in scalar context.
+=head2 process
 
-=head2 process([\@phases])
+=over
+
+=item Arguments: \@phases
+
+=back
 
 Executes the current checkout process pipeline and returns CHECKOUT_STATUS_*.
-Any plugin handler that doesn't return CHECKOUT_HANDLER_OK or CHECKOUT_HANDLER_DECLINE
-is considered to be an error that the checkout process is aborted.
+Any plugin handler that doesn't return CHECKOUT_HANDLER_OK or
+CHECKOUT_HANDLER_DECLINE is considered to be an error that the checkout process
+is aborted.
 
 Just like C&lt;phases&gt;, you can pass an array reference or a comma (or space)
 separated string of phases into process.
 
-The method $self-&gt;stash-&gt;clear is called before the call to
-$plugin-&gt;setup so plugins can set stash data, and the stash remains until the
-next call to process so $plugin-&gt;teardown can read any remaining stash data
+The C&lt;clear&gt; method is called on the stash before the call to C&lt;setup&gt; on each
+plugin so plugins can set stash data, and the stash remains until the next call
+to process so $plugin-&gt;teardown can read any remaining stash data
 before C&lt;process&gt; ends.
 
-The call to C&lt;process&gt; will return on of the following constants:
+The call to C&lt;process&gt; will return one of the following constants:
 
 =over
 
-=item CHECKOUT_STATUS_OK
+=item C&lt;CHECKOUT_STATUS_OK&gt;
 
-All plugin handlers were called and returned CHECKOUT_HANDLER_OK or CHECKOUT_HANDLER_DECLINE
+All plugin handlers were called and returned CHECKOUT_HANDLER_OK or
+CHECKOUT_HANDLER_DECLINE
 
-=item CHECKOUT_STATUS_ERROR
+=item C&lt;CHECKOUT_STATUS_ERROR&gt;
 
 At least one plugin failed to return or an error occurred while processing
 the registered plugin handlers.
@@ -741,14 +871,46 @@ the registered plugin handlers.
 
 =head2 stash
 
-Returns a Handel::Checkout::Stash object that can store information shared by
-all plugins in the current context.
+Returns a stash object that can store information shared by all plugins in the
+current context. By default, a Handel::Checkout::Stash object will be create
+unless you have set C&lt;stash_class&gt; to another class.
 
     # plugin handler
     my ($self, $ctx) = @_;
 
     $ctx-&gt;stash-&gt;{'template'} = 'template.tt';
 
+=head2 get_component_class
+
+=over
+
+=item Arguments: $name
+
+=back
+
+Gets the current class for the specified component name.
+
+    my $class = $self-&gt;get_component_class('cart_class');
+
+There is no good reason to use this. Use the specific class accessors instead.
+
+=head2 set_component_class
+
+=over
+
+=item Arguments: $name, $value
+
+=back
+
+Sets the current class for the specified component name.
+
+    $self-&gt;set_component_class('cart_class', 'MyCartClass');
+
+A L&lt;Handel::Exception|Handel::Exception&gt; exception will be thrown if the
+specified class can not be loaded.
+
+There is no good reason to use this. Use the specific class accessors instead.
+
 =head1 CONFIGURATION
 
 =head2 HandelPluginPaths
@@ -766,8 +928,8 @@ You can also pass a comma or space separate list of namespaces.
 
     PerlSetVar HandelPluginPaths 'MyApp::Plugins, OtherApp::Plugins'
 
-Any plugin found in the search path that isn't a subclass of Handel::Checkout::Plugin
-will be ignored.
+Any plugin found in the search path that isn't a subclass of
+Handel::Checkout::Plugin will be ignored.
 
 =head2 HandelAddPluginPaths
 
@@ -780,13 +942,14 @@ In the example above, when a checkout process is loaded, it will load
 all plugins in the Handel::Checkout::Plugin::*, MyApp::Plugins::*, and
 OtherApp::Plugins namespaces.
 
-Any plugin found in the search path that isn't a subclass of Handel::Checkout::Plugin
-will be ignored.
+Any plugin found in the search path that isn't a subclass of
+Handel::Checkout::Plugin will be ignored.
 
 =head2 HandelIgnorePlugins
 
-This is a comma/space separated list [or an anonymous array, or a regex outside of httpd.conf] of plugins to ignore when loading
-all available plugins in the given namespaces.
+This is a comma/space separated list [or an anonymous array, or a regex outside
+of httpd.conf] of plugins to ignore when loading all available plugins in the
+given namespaces.
 
     PerlSetVar HandelIgnorePlugins 'Handel::Checkout::Plugin::Initialize'
 
@@ -801,16 +964,18 @@ If the Handel::Checkout::Plugin namespace has the following modules:
     Handel::Checkout::Plugin::FaxDelivery
     Handel::Checkout::Plugin::EmailDelivery
 
-all of the modules above will be loaded &lt;b&gt;except&lt;/b&gt; Handel::Checkout::Plugin::Initialize.
-All plugins in any other configured namespaces will be loaded.
+all of the modules above will be loaded &lt;b&gt;except&lt;/b&gt;
+Handel::Checkout::Plugin::Initialize. All plugins in any other configured
+namespaces will be loaded.
 
-If both HandelLoadPlugins and HandelIgnorePlugins are specified, only the plugins in
-HandelLoadPlugins will be loaded, unless they are also in HandelIgnorePlugins in which case
-they will be ignored.
+If both HandelLoadPlugins and HandelIgnorePlugins are specified, only the
+plugins in HandelLoadPlugins will be loaded, unless they are also in
+HandelIgnorePlugins in which case they will be ignored.
 
 =head2 HandelLoadPlugins
 
-This is a comma or space separated list [or an anonymous array, or a regex outside of httpd.conf] of plugins to be loaded from the available namespaces.
+This is a comma or space separated list [or an anonymous array, or a regex
+outside of httpd.conf] of plugins to be loaded from the available namespaces.
 
     PerlSetVar HandelLoadPlugins 'Handel::Checkout::Plugin::ValidateAddress'
 
@@ -827,20 +992,21 @@ If the following plugins are available in all configured namespaces:
     MyApp::Plugin::VerifiedByVisa
     MyApp::Plugin::WarehouseUpdate
 
-only Handel::Checkout::Plugin::ValidateAddress will be loaded. All other plugins in all
-configured namespaces will be ignored.
+only Handel::Checkout::Plugin::ValidateAddress will be loaded. All other
+plugins in all configured namespaces will be ignored.
 
-If both HandelLoadPlugins and HandelIgnorePlugins are specified, only the plugins in
-HandelLoadPlugins will be loaded, unless they are also in HandelIgnorePlugins in which case
-they will be ignored.
+If both HandelLoadPlugins and HandelIgnorePlugins are specified, only the
+plugins in HandelLoadPlugins will be loaded, unless they are also in
+HandelIgnorePlugins in which case they will be ignored.
 
 =head1 CAVEATS
 
-[I think] Due to the localization of AutoCommit to coerce disabling of autoupdates during process,
-Always access orders and order items from their checkout parent once they've been assigned to
+[I think] Due to the localization of AutoCommit to coerce disabling of
+autoupdates during process, Always access orders and order items from their
+checkout parent once they've been assigned to
 the checkout process, and not any available reference:
 
-    my $order = Handel::Order-&gt;new({billtofirstname =&gt; 'Chris'});
+    my $order = Handel::Order-&gt;create({billtofirstname =&gt; 'Chris'});
     my $checkout = Handel::Checkout-&gt;new({order =&gt; $order});
 
     # some plugin alters billtofirstname to 'Christopher'</diff>
      <filename>lib/Handel/Checkout.pm</filename>
    </modified>
    <modified>
      <diff>@@ -2,12 +2,11 @@
 package Handel::Checkout::Message;
 use strict;
 use warnings;
-use vars '$AUTOLOAD';
 use overload '&quot;&quot;' =&gt; \&amp;stringify, fallback =&gt; 1;
 
 sub new {
     my ($class, %args) = @_;
-    my $self = bless \%args, ref $class || $class;
+    my $self = bless \%args, $class;
 
     return $self;
 };
@@ -15,13 +14,17 @@ sub new {
 sub stringify {
     my $self = shift;
 
-    return $self-&gt;text || $self;
+    if (my $text = $self-&gt;text) {
+        return $text;
+    } else {
+        return ref $self;
+    };
 };
 
 sub AUTOLOAD {
     my $self = shift;
 
-    my $name = $AUTOLOAD;
+    my $name = our $AUTOLOAD;
     $name =~ s/.*://;
 
     if (@_) {
@@ -41,14 +44,14 @@ Handel::Checkout::Message - Checkout Pipeline Process Message
 =head1 SYNOPSIS
 
     use Handel::Checkout::Message;
-
+    
     my $message = Handel::Checkout::Message-&gt;new(
         text =&gt; 'My Message',
         otherproperty =&gt; 'some data'
     );
-
+    
     $message-&gt;tempdata('stuff');
-
+    
     print $message-&gt;text;
     print $message-&gt;otherproperty;
     print $message-&gt;tempdata;
@@ -59,17 +62,31 @@ Handel::Checkout::Message is just a simple blessed hash to hold any and every
 property you throw at it. It is autoloaded, so any instance method simple loads
 or sets the corresponding key value in the hash.
 
-Handel::Checkout::Message stringifies to text() if available, otherwise it returns $self.
+Handel::Checkout::Message stringifies to text() if available, otherwise it
+returns $self.
 
 =head1 CONSTRUCTOR
 
-=head2 new([%options])
+=head2 new
+
+=over
+
+=item Arguments: %options
+
+=back
 
     my $message = Handel::Checkout::Message-&gt;new(
         text =&gt; 'My Message',
         otherproperty =&gt; 'some data'
     );
 
+=head1 METHODS
+
+=head2 stringify
+
+Returns C&lt;text&gt; in scalar context. If no text is set, it returns the name of the
+current message object.
+
 =head1 SEE ALSO
 
 L&lt;Handel::Constants&gt;, L&lt;Handel::Checkout::Plugin&gt;, L&lt;Handel::Order&gt;</diff>
      <filename>lib/Handel/Checkout/Message.pm</filename>
    </modified>
    <modified>
      <diff>@@ -3,9 +3,14 @@ package Handel::Checkout::Plugin;
 use strict;
 use warnings;
 
+BEGIN {
+    use Handel::L10N qw/translate/;
+    use Carp qw/cluck/;
+};
+
 sub new {
     my ($class, $ctx) = @_;
-    my $self = bless {}, ref $class || $class;
+    my $self = bless {}, $class;
 
     $self-&gt;init($ctx);
 
@@ -13,19 +18,21 @@ sub new {
 };
 
 sub init {
-
+    return;
 };
 
 sub setup {
-
+    return;
 };
 
 sub teardown {
-
+    return;
 };
 
 sub register {
-    warn &quot;Attempt to register plugin that hasn't defined 'register'!&quot;;
+    cluck translate('PLUGIN_HAS_NO_REGISTER');
+
+    return;
 };
 
 sub name {
@@ -46,25 +53,25 @@ Handel::Checkout::Plugin - Base module for Handle::Checkout plugins
     package MyPackage::FaxOrder;
     use Handel::Constants qw(:checkout);
     use base 'Handel::Checkout::Plugin';
-
+    
     sub register {
         my ($self, $ctx) = @_;
 
         $ctx-&gt;add_handler(CHECKOUT_PHASE_DELIVER, \&amp;deliver);
     };
-
+    
     sub deliver {
         my ($self, $ctx) = @_;
-
+    
         ...
-
+    
         return CHECKOUT_HANDLER_OK;
     };
 
 =head1 DESCRIPTION
 
-C&lt;Handel::Checkout::Plugin&gt; is the base module for all checkout pipeline
-plugins used in C&lt;Handel::Checkout&gt;.
+Handel::Checkout::Plugin is the base module for all checkout pipeline plugins
+used in Handel::Checkout.
 
 =head1 CONSTRUCTOR
 </diff>
      <filename>lib/Handel/Checkout/Plugin.pm</filename>
    </modified>
    <modified>
      <diff>@@ -2,25 +2,30 @@
 package Handel::Checkout::Plugin::AssignOrderNumber;
 use strict;
 use warnings;
-use base 'Handel::Checkout::Plugin';
-use Handel::Constants qw(:checkout);
+
+BEGIN {
+    use base qw/Handel::Checkout::Plugin/;
+    use Handel::Constants qw/:checkout/;
+};
 
 sub register {
     my ($self, $ctx) = @_;
 
     $ctx-&gt;add_handler(CHECKOUT_PHASE_FINALIZE, \&amp;handler);
+
+    return;
 };
 
 sub handler {
     my ($self, $ctx) = @_;
 
     $ctx-&gt;order-&gt;number(time);
-    $ctx-&gt;order-&gt;updated(scalar localtime);
 
     return CHECKOUT_HANDLER_OK;
 };
 
 1;
+__END__
 
 =head1 NAME
 
@@ -29,13 +34,13 @@ Handel::Checkout::Plugin::AssignOrderNumber - Checkout plugin to assign order nu
 =head1 SYNOPSIS
 
     use Handel::Checkout;
-
+    
     my $checkout = Handel::Checkout-&gt;new({
         order       =&gt; $order,
         phases      =&gt; 'CHECKOUT_PHASE_FINALIZE',
         loadplugins =&gt; 'Handel::Checkout::Plugin::AssignOrderNumber'
     });
-
+    
     $checkout-&gt;process;
 
 =head1 DESCRIPTION
@@ -43,6 +48,16 @@ Handel::Checkout::Plugin::AssignOrderNumber - Checkout plugin to assign order nu
 This checkout plugin simply assigns a number to $order-&gt;number during the
 CHECKOUT_PHASE_FINALIZE phase.
 
+=head1 METHODS
+
+=head2 register
+
+Registers this plugin for the CHECKOUT_PHASE_FINALIZE phase.
+
+=head2 handler
+
+Assigns a number to the current order.
+
 =head1 SEE ALSO
 
 L&lt;Handel::Checkout::Plugin&gt;, L&lt;Handel::Checkout&gt;</diff>
      <filename>lib/Handel/Checkout/Plugin/AssignOrderNumber.pm</filename>
    </modified>
    <modified>
      <diff>@@ -2,24 +2,30 @@
 package Handel::Checkout::Plugin::MarkOrderSaved;
 use strict;
 use warnings;
-use base 'Handel::Checkout::Plugin';
-use Handel::Constants qw(:checkout :order);
+
+BEGIN {
+    use base qw/Handel::Checkout::Plugin/;
+    use Handel::Constants qw/:checkout :order/;
+};
 
 sub register {
     my ($self, $ctx) = @_;
 
     $ctx-&gt;add_handler(CHECKOUT_PHASE_FINALIZE, \&amp;handler);
+
+    return;
 };
 
 sub handler {
     my ($self, $ctx) = @_;
 
-    $ctx-&gt;order-&gt;type(ORDER_TYPE_SAVED);
+    $ctx-&gt;order-&gt;save;
 
     return CHECKOUT_HANDLER_OK;
 };
 
 1;
+__END__
 
 =head1 NAME
 
@@ -28,13 +34,13 @@ Handel::Checkout::Plugin::MarkOrderSaved - Checkout plugin to mark the order ORD
 =head1 SYNOPSIS
 
     use Handel::Checkout;
-
+    
     my $checkout = Handel::Checkout-&gt;new({
         order       =&gt; $order,
         phases      =&gt; 'CHECKOUT_PHASE_FINALIZE',
         loadplugins =&gt; 'Handel::Checkout::Plugin::MarkOrderSaved'
     });
-
+    
     $checkout-&gt;process;
 
 =head1 DESCRIPTION
@@ -42,6 +48,16 @@ Handel::Checkout::Plugin::MarkOrderSaved - Checkout plugin to mark the order ORD
 This checkout plugin simply changes $order-&gt;type to ORDER_TYPE_SAVED during the
 CHECKOUT_PHASE_FINALIZE phase.
 
+=head1 METHODS
+
+=head2 register
+
+Registers this plugin for the CHECKOUT_PHASE_FINALIZE phase.
+
+=head2 handler
+
+Calls L&lt;Handel::Order/save&gt; to mark the current order as saved.
+
 =head1 SEE ALSO
 
 L&lt;Handel::Checkout::Plugin&gt;, L&lt;Handel::Checkout&gt;</diff>
      <filename>lib/Handel/Checkout/Plugin/MarkOrderSaved.pm</filename>
    </modified>
    <modified>
      <diff>@@ -3,9 +3,18 @@ package Handel::Checkout::Stash;
 use strict;
 use warnings;
 
+BEGIN {
+    use Handel::L10N qw/translate/;
+};
+
 sub new {
-    my $class = shift;
-    my $self = bless {}, ref $class || $class;
+    my ($class, $data) = @_;
+
+    throw Handel::Exception::Argument(
+        -details =&gt; translate('PARAM1_NOT_HASHREF')
+    ) if defined $data &amp;&amp; ref($data) ne 'HASH'; ## no critic
+
+    my $self = bless $data || {}, $class;
 
     return $self;
 };
@@ -14,6 +23,8 @@ sub clear {
     my $self = shift;
 
     %{$self} = ();
+
+    return;
 };
 
 1;
@@ -26,10 +37,10 @@ Handel::Checkout::Stash - Basic storage for checkout plugins during processing
 =head1 SYNOPSIS
 
     use Handel::Checkout;
-
+    
     my $checkout = Handel::Checkout-&gt;new;
     $checkout-&gt;process;
-
+    
     # later in some plugin
     sub myhandler {
         my ($self, $ctx) = @_;
@@ -37,11 +48,11 @@ Handel::Checkout::Stash - Basic storage for checkout plugins during processing
         $ctx-&gt;stash-&gt;{'mystuff'};
         ...
     };
-
+    
     # later in some other plugin
     sub myhandler {
         my ($self, $ctx) = @_;
-
+    
         my $stuff = $ctx-&gt;stash-&gt;{'mystuff'};
         ...
     };
@@ -59,13 +70,13 @@ tell Handel::Checkout to use the new stash instead:
     use strict;
     use warnings;
     use base 'Handel::Checkout::Stash';
-
+    
     sub clear {};
-
+    
     ---
-
+    
     use Handel::Checkout;
-
+    
     my $co = Handel::Checkout-&gt;new({
         stash =&gt; MyApp::Stash-&gt;new
     });
@@ -74,7 +85,14 @@ tell Handel::Checkout to use the new stash instead:
 
 =head2 new
 
-Creates a new instance of Handel::Checkout::Stash.
+=over
+
+=item Arguments: \%data
+
+=back
+
+Creates a new instance of Handel::Checkout::Stash. You can optionally pass a hash
+reference to new which will be blessed into the new stash instance.
 
 =head1 METHODS
 </diff>
      <filename>lib/Handel/Checkout/Stash.pm</filename>
    </modified>
    <modified>
      <diff>@@ -2,9 +2,11 @@
 package Handel::ConfigReader;
 use strict;
 use warnings;
-use vars qw(%Defaults $MOD_PERL);
+use vars qw/%DEFAULTS $MOD_PERL/;
 
-%Defaults = (
+my $instance;
+
+%DEFAULTS = (
     HandelMaxQuantityAction =&gt; 'Adjust',
     HandelCurrencyCode      =&gt; 'USD',
     HandelCurrencyFormat    =&gt; 'FMT_STANDARD'
@@ -12,16 +14,16 @@ use vars qw(%Defaults $MOD_PERL);
 
 BEGIN {
     use Tie::Hash;
-    use base 'Tie::StdHash';
+    use base qw/Tie::StdHash/;
 
-    if (exists $ENV{MOD_PERL_API_VERSION} &amp;&amp; $ENV{MOD_PERL_API_VERSION} == 2) {
+    if (exists $ENV{'MOD_PERL_API_VERSION'} &amp;&amp; $ENV{'MOD_PERL_API_VERSION'} == 2) {
         require Apache2::RequestRec;
         require Apache2::RequestUtil;
         require Apache2::RequestIO;
         require Apache2::ServerUtil;
 
         $MOD_PERL = 2;
-    } elsif ($ENV{MOD_PERL}) {
+    } elsif ($ENV{'MOD_PERL'}) {
         require Apache;
 
         $MOD_PERL = 1;
@@ -33,22 +35,31 @@ BEGIN {
 sub new {
     my $class = shift;
     my %config;
-    tie %config, __PACKAGE__;
+    tie %config, __PACKAGE__; ## no critic
 
     return bless \%config, $class;
 };
 
+sub instance {
+    if (!$instance) {
+        $instance = shift-&gt;new(@_);
+    };
+
+    return $instance;
+};
+
 sub get {
     my ($self, $key) = (shift, shift);
-    my $default = shift || $Defaults{$key} || '';
+    my $default = defined $_[0] ? shift : $DEFAULTS{$key};
+    my $value = $self-&gt;{$key} || undef;
 
-    return $self-&gt;{$key} || $default;
+    return defined $value ? $value : $default;
 };
 
 sub FETCH {
     my ($self, $key) = @_;
-    my $default = $Defaults{$key} || '';
-    my $value   = '';
+    my $default = $DEFAULTS{$key};
+    my $value;
 
     if ($MOD_PERL == 2) {
         my $c = eval {
@@ -73,7 +84,9 @@ sub FETCH {
     };
 
     # quick untaint for now. Assuming we'll mever get a ref from system os ENV
-    if (! ref $value &amp;&amp; $value =~ /^(.*)$/g) {
+    if ($value &amp;&amp;  !ref $value) {
+        ## no critic
+        $value =~ /^(.*)$/g;
         $value = $1;
     };
 
@@ -83,7 +96,11 @@ sub FETCH {
 sub EXISTS {
     my ($self, $key) = @_;
 
-    return 1 if ($self-&gt;FETCH($key));
+    if (defined $self-&gt;FETCH($key)) {
+        return 1;
+    };
+
+    return;
 };
 
 sub STORE {};
@@ -95,14 +112,15 @@ __END__
 
 =head1 NAME
 
-Handel::ConfigReader - Read in Handel configuration settings
+Handel::ConfigReader - Read in Handel configuration settings from ENV/ModPerl
 
 =head1 SYNOPSIS
 
     use Handel::ConfigReader;
-
-    my $cfg = Handel::ConfigReader-new();
+    
+    my $cfg = Handel::ConfigReader-&gt;instance();
     my $setting = $cfg-&gt;get('HandelMaxQuantity');
+    my $other = $cfg-&gt;{'OtherSetting'};
 
 =head1 DESCRIPTION
 
@@ -110,11 +128,10 @@ Handel::ConfigReader is a generic wrapper to get various configuration
 values. As some point this will probably get worked into XS/custom httpd.conf
 directives.
 
-Starting in version 0.11, each instance is also a tied hash. The two usages are
-the same:
-
-    my $cfg = Handel::ConfigReader-&gt;new();
+Each configuration object is also a tied hash. The two usages are the same:
 
+    my $cfg = Handel::ConfigReader-&gt;instance();
+    
     my $setting = $cfg-&gt;get('Setting');
     my $setting = $cfg-&gt;{'Setting'};
 
@@ -125,25 +142,82 @@ Apache::ModuleConfig and custom directives which use the same hash syntax.
 
 =head2 new
 
-Returns a new Handel::ConfigReader object.
+Returns a new Handel::ConfigReader instance.
 
     my $cfg = Handel::ConfigReader-&gt;new();
 
+=head2 instance
+
+Returns the same Handel::ConfigReader instance for each call.
+
+    my $cfg = Handel::ConfigReader-&gt;instance();
+
 =head1 METHODS
 
-=head2 get($key [, $default])
+=head2 get
+
+=over
+
+=item Arguments: $key [, $default]
+
+=back
 
 Returns the configured value for the key specified. You can use this as an
 instance method or as a simpleton:
 
-    my $setting = Handel::ConfigReader-&gt;get('HandelMaxQuantity');
-
-    my $cfg = Handel::ConfigReader-&gt;new();
+    my $cfg = Handel::ConfigReader-&gt;instance();
+    my $setting = $cfg-&gt;get('HandelMaxQuantity');
+    
+    my $cfg = Handel::ConfigReader-&gt;instance();
     my $setting = $cfg-&gt;get('HandelMaxQuantity');
 
 You can also pass a default value as the second parameter. If no value is loaded
 for the key specified, the default value will be returned instead.
 
+    my $cfg = Handel::ConfigReader-&gt;instance();
+    my $setting = $cfg-&gt;get('DoesNotExist', 'foo');
+    print $setting; # foo
+
+=head2 FETCH
+
+=over
+
+=item Arguments: $key
+
+=back
+
+Returns an item form the configuration via tied hash.
+
+    my $cfg = Handel::ConfigReader-&gt;new;
+    my $setting = $cfg-&gt;{'MySetting'};
+
+=head2 EXISTS
+
+=over
+
+=item Arguments: $key
+
+=back
+
+Returns true if the specified setting returns a defined value.
+
+    my $cfg = Handel::ConfigReader-&gt;new;
+    if (exists $cfg-&gt;{'MySetting'}) {
+        ...
+    };
+
+=head2 CLEAR
+
+Does nothing.
+
+=head2 DELETE
+
+Does nothing.
+
+=head2 STORE
+
+Does nothing.
+
 =head1 CONFIGURATION
 
 Various Handel runtime options can be set via C&lt;%ENV&gt; variables, or using
@@ -155,34 +229,34 @@ C&lt;PerlSetVar&gt; when running under C&lt;mod_perl&gt;.
     ...
     $ENV{HandelMaxQuantity} = 32;
 
-If defined, this sets the maximum quantity allowed for each C&lt;Handel::Cart::Item&gt;
-in the shopping cart. By default, when the user request more than
-C&lt;HandelMaxQuantity&gt;, C&lt;quantity&gt; is reset to C&lt;HandelMaxQuantity&gt;. If you
-would rather raise an C&lt;Handel::Exception::Constraint&gt; instead, see
+If defined, this sets the maximum quantity allowed for each
+C&lt;Handel::Cart::Item&gt; in the shopping cart. By default, when the user request
+more than C&lt;HandelMaxQuantity&gt;, C&lt;quantity&gt; is reset to C&lt;HandelMaxQuantity&gt;.
+If you would rather raise an C&lt;Handel::Exception::Constraint&gt; instead, see
 C&lt;HandelMaxQuantityAction&gt; below.
 
 =head2 HandelMaxQuantityAction (Adjust|Exception)
 
-This option defines what action should be taken when a cart items quantity is being set
-to something above C&lt;HandelMaxQuantity&gt;. When set to C&lt;Adjust&gt; the quantity will simply
-be reset to C&lt;HandelMaxQuantity&gt; and no exception will be raised. This is the default
-action.
+This option defines what action should be taken when a cart items quantity is
+being set to something above C&lt;HandelMaxQuantity&gt;. When set to C&lt;Adjust&gt; the
+quantity will simply be reset to C&lt;HandelMaxQuantity&gt; and no exception will be
+raised. This is the default action.
 
-When set to &lt;Exception&gt; and the quantity requested is greater than C&lt;HandelMaxQuantity&gt;,
-a C&lt;Handel::Exception::Constraint&gt; exception is thrown.
+When set to &lt;Exception&gt; and the quantity requested is greater than
+C&lt;HandelMaxQuantity&gt;, a C&lt;Handel::Exception::Constraint&gt; exception is thrown.
 
 =head2 HandelCurrencyCode
 
 This sets the default currency code used when no code is passed into C&lt;format&gt;.
-See L&lt;Locale::Currency::Format&gt; for all available currency codes. The default code
-is USD.
+See L&lt;Locale::Currency::Format&gt; for all available currency codes. The default
+code is USD.
 
 =head2 HandelCurrencyFormat
 
 This sets the default options used to format the price. See
 L&lt;Locale::Currency::Format&gt; for all available currency codes. The default format
-used is C&lt;FMT_STANDARD&gt;. Just like in C&lt;Locale::Currency::Format&gt;, you can combine
-options using C&lt;|&gt;.
+used is C&lt;FMT_STANDARD&gt;. Just like in C&lt;Locale::Currency::Format&gt;, you can
+combine options using C&lt;|&gt;.
 
 =head2 HandelDBIDriver
 
@@ -229,8 +303,8 @@ You can also pass a comma or space separate list of namespaces.
 
     PerlSetVar HandelPluginPaths 'MyApp::Plugins, OtherApp::Plugins'
 
-Any plugin found in the search path that isn't a subclass of Handel::Checkout::Plugin
-will be ignored.
+Any plugin found in the search path that isn't a subclass of
+Handel::Checkout::Plugin will be ignored.
 
 =head2 HandelAddPluginPaths
 
@@ -243,13 +317,14 @@ In the example above, when a checkout process is loaded, it will load
 all plugins in the Handel::Checkout::Plugin::*, MyApp::Plugins::*, and
 OtherApp::Plugins namespaces.
 
-Any plugin found in the search path that isn't a subclass of Handel::Checkout::Plugin
-will be ignored.
+Any plugin found in the search path that isn't a subclass of
+Handel::Checkout::Plugin will be ignored.
 
 =head2 HandelIgnorePlugins
 
-This is a comma/space separated list [or an anonymous array, or a regex outside of httpd.conf] of plugins to ignore when loading
-all available plugins in the given namespaces.
+This is a comma/space separated list [or an anonymous array, or a regex outside
+of httpd.conf] of plugins to ignore when loading all available plugins in the
+given namespaces.
 
     PerlSetVar HandelIgnorePlugins 'Handel::Checkout::Plugin::Initialize'
 
@@ -264,16 +339,18 @@ If the Handel::Checkout::Plugin namespace has the following modules:
     Handel::Checkout::Plugin::FaxDelivery
     Handel::Checkout::Plugin::EmailDelivery
 
-all of the modules above will be loaded &lt;b&gt;except&lt;/b&gt; Handel::Checkout::Plugin::Initialize.
-All plugins in any other configured namespaces will be loaded.
+all of the modules above will be loaded &lt;b&gt;except&lt;/b&gt;
+Handel::Checkout::Plugin::Initialize. All plugins in any other configured
+namespaces will be loaded.
 
-If both HandelLoadPlugins and HandelIgnorePlugins are specified, only the plugins in
-HandelLoadPlugins will be loaded, unless they are also in HandelIgnorePlugins in which case
-they will be ignored.
+If both HandelLoadPlugins and HandelIgnorePlugins are specified, only the
+plugins in HandelLoadPlugins will be loaded, unless they are also in
+HandelIgnorePlugins in which case they will be ignored.
 
 =head2 HandelLoadPlugins
 
-This is a comma or space separated list [or an anonymous array, or a regex outside of httpd.conf] of plugins to be loaded from the available namespaces.
+This is a comma or space separated list [or an anonymous array, or a regex
+outside of httpd.conf] of plugins to be loaded from the available namespaces.
 
     PerlSetVar HandelLoadPlugins 'Handel::Checkout::Plugin::ValidateAddress'
 
@@ -290,12 +367,12 @@ If the following plugins are available in all configured namespaces:
     MyApp::Plugin::VerifiedByVisa
     MyApp::Plugin::WarehouseUpdate
 
-only Handel::Checkout::Plugin::ValidateAddress will be loaded. All other plugins in all
-configured namespaces will be ignored.
+only Handel::Checkout::Plugin::ValidateAddress will be loaded. All other
+plugins in all configured namespaces will be ignored.
 
-If both HandelLoadPlugins and HandelIgnorePlugins are specified, only the plugins in
-HandelLoadPlugins will be loaded, unless they are also in HandelIgnorePlugins in which case
-they will be ignored.
+If both HandelLoadPlugins and HandelIgnorePlugins are specified, only the
+plugins in HandelLoadPlugins will be loaded, unless they are also in
+HandelIgnorePlugins in which case they will be ignored.
 
 =head1 AUTHOR
 </diff>
      <filename>lib/Handel/ConfigReader.pm</filename>
    </modified>
    <modified>
      <diff>@@ -2,12 +2,12 @@
 package Handel::Constants;
 use strict;
 use warnings;
-use vars qw(@EXPORT_OK %EXPORT_TAGS @CHECKOUT_ALL_PHASES);
+use vars qw/@EXPORT_OK %EXPORT_TAGS @CHECKOUT_ALL_PHASES/;
 
 
 BEGIN {
-    use base 'Exporter';
-    use Handel::L10N qw(translate);
+    use base qw/Exporter/;
+    use Handel::L10N qw/translate/;
 };
 
 use constant CART_MODE_APPEND  =&gt; 3;
@@ -126,7 +126,7 @@ Handel::Constants - Common constants used in Handel
 
     use Handel::Constants qw(:cart);
 
-    my $cart = Handel::Cart-&gt;new({
+    my $cart = Handel::Cart-&gt;create({
         shopper =&gt; 'D597DEED-5B9F-11D1-8DD2-00AA004ABD5E'
     });
 
@@ -136,15 +136,21 @@ Handel::Constants - Common constants used in Handel
 
 =head1 DESCRIPTION
 
-C&lt;Handel::Constants&gt; contains a set of constants used throughout C&lt;Handel&gt;. It
-may be useful (or even a good idea) to use these in your code. :-)
+Handel::Constants contains a set of constants used throughout Handel. It may be
+useful (or even a good idea) to use these in your code. :-)
 
-By default, C&lt;Handel::Constants&gt; export C&lt;nothing&gt;. Use can use the export tags
+By default, Handel::Constants export I&lt;nothing&gt;. You can use the export tags
 below to export all or only certain groups of constants.
 
-=head1 METHODS
+=head1 FUNCTIONS
 
-=head2 str_to_const($)
+=head2 str_to_const
+
+=over
+
+=item Arguments: $constant_name
+
+=back
 
 Converts a string version of a constant into that constants value.
 
@@ -177,7 +183,7 @@ automatically reaped from the database during cleanup.
 
 =head2 CART_TYPE_TEMP
 
-Any cart with this type could be purged form the database during cleanup at any
+Any cart with this type could be purged from the database during cleanup at any
 time.
 
 =head2 CHECKOUT_PHASE_INITIALIZE
@@ -186,16 +192,18 @@ The phase run when first creating a new order.
 
 =head2 CHECKOUT_PHASE_VALIDATE
 
-The phase run to validate address, shipping, and other information about an order.
+The phase run to validate address, shipping, and other information about an
+order.
 
 =head2 CHECKOUT_PHASE_AUTHORIZE
 
-The phase run when authorizing or validating credit card or other payment information.
+The phase run when authorizing or validating credit card or other payment
+information.
 
 =head2 CHECKOUT_PHASE_FINALIZE
 
-The phase to run and post authorization order cleanup, like setting order number, before
-order delivery/confirmation.
+The phase to run and post authorization order cleanup, like setting order
+number, before order delivery/confirmation.
 
 =head2 CHECKOUT_PHASE_DELIVER
 
@@ -212,7 +220,8 @@ Contains all available phases.
 
 =head2 CHECKOUT_STATUS_OK
 
-All plugin handlers returned successfully and the checkout process has completed.
+All plugin handlers returned successfully and the checkout process has
+completed.
 
 =head2 CHECKOUT_STATUS_ERROR
 
@@ -234,30 +243,20 @@ using L&lt;Handel::Checkout/add_handler&gt;
 Specifies that the plugin handler encountered errors and would like to abort
 the checkout process.
 
-=head2 RETURNAS_AUTO
-
-When calling C&lt;load&gt; or C&lt;items&gt; on C&lt;Handel::Cart&gt;, it will attempt to return
-the most appropriate object. In list context, it will return a list. In
-scalar context, it will return a C&lt;Handel::Iterator&gt; object. If the iterator
-only contains one item, that item will be returns instead.
-
-=head2 RETURNAS_ITERATOR
-
-Always return a C&lt;Handel::Iterator&gt; object regardless of context or the amount
-of results.
+=head2 ORDER_TYPE_SAVED
 
-=head2 RETURNAS_LIST
-
-Always return a list regardless of context or the amount of results.
+Marks the order as permanent. Order with this value set should never be
+automatically reaped from the database during cleanup.
 
-=head2 RETURNAS_ARRAY
+=head2 ORDER_TYPE_TEMP
 
-Same as C&lt;RETURNAS_LIST&gt;
+Any order with this type could be purged from the database during cleanup at any
+time.
 
 =head1 EXPORT_TAGS
 
-The following C&lt;%EXPORT_TAGS&gt; are defined for C&lt;Handel::Constants&gt;. See
-L&lt;Exporter&gt; for further details on using export tags.
+The following C&lt;%EXPORT_TAGS&gt; are defined for Handel::Constants. See
+L&lt;Exporter|Exporter&gt; for further details on using export tags.
 
 =head2 :all
 
@@ -267,9 +266,14 @@ This exports all constants found in this module.
 
 This exports all C&lt;CART_*&gt; constants in this module.
 
-=head2 :returnas
+=head2 :checkout
+
+This exports all C&lt;CHECKOUT_*&gt; constants in this module.
+
+
+=head2 :order
 
-This exports all C&lt;RETURNAS_*&gt; constants in this module.
+This exports all C&lt;ORDER_*&gt; constants in this module.
 
 =head1 AUTHOR
 </diff>
      <filename>lib/Handel/Constants.pm</filename>
    </modified>
    <modified>
      <diff>@@ -2,24 +2,27 @@
 package Handel::Constraints;
 use strict;
 use warnings;
-use vars qw(@EXPORT_OK %EXPORT_TAGS);
+use vars qw/@EXPORT_OK %EXPORT_TAGS/;
 
 BEGIN {
     use base 'Exporter';
     use Handel;
-    use Handel::Constants qw(:cart :checkout :order);
+    use Handel::Constants qw/:cart :checkout :order/;
     use Handel::Exception;
-    use Handel::L10N qw(translate);
+    use Handel::L10N qw/translate/;
+    use Locale::Currency;
+    use Scalar::Util qw/blessed/;
 };
 
-@EXPORT_OK = qw(&amp;constraint_quantity
+@EXPORT_OK = qw/&amp;constraint_quantity
                 &amp;constraint_price
                 &amp;constraint_uuid
                 &amp;constraint_cart_type
+                &amp;constraint_cart_name
                 &amp;constraint_currency_code
                 &amp;constraint_checkout_phase
                 &amp;constraint_order_type
-);
+/;
 
 %EXPORT_TAGS = (all =&gt; \@EXPORT_OK);
 
@@ -29,17 +32,17 @@ sub constraint_quantity {
     my $value = defined $_[0] ? shift : '';
     my ($object, $column, $changing) = @_;
 
-    my $cfg    = $Handel::Cfg;
+    my $cfg    = Handel-&gt;config;
     my $max    = $cfg-&gt;{'HandelMaxQuantity'};
     my $action = $cfg-&gt;{'HandelMaxQuantityAction'};
 
     if ($action =~ /^exception$/i &amp;&amp; $max) {
         throw Handel::Exception::Constraint( -details =&gt;
-            translate('The quantity requested ([_1]) is greater than the maximum quantity allowed ([_2])', $value, $max)
-        ) if $value &gt; $max;
+            translate('QUANTITY_GT_MAX', $value, $max)
+        ) if $value &gt; $max; ## no critic
     } elsif ($action =~ /^adjust$/i &amp;&amp; $max) {
-        if (ref($object) &amp;&amp; $value) {
-            $changing-&gt;{'quantity'} = $max if $value &gt; $max;
+        if (ref($object) &amp;&amp; $value &amp;&amp; $value &gt; $max) {
+            $changing-&gt;{'quantity'} = $max;
         };
     };
 
@@ -49,6 +52,10 @@ sub constraint_quantity {
 sub constraint_price {
     my $value = defined $_[0] ? shift : '';
 
+    if (blessed $value &amp;&amp; $value-&gt;isa('Data::Currency')) {
+        $value = $value-&gt;value;
+    };
+
     return ($value =~ /^\d{1,5}(\.\d{1,2})?$/);
 };
 
@@ -74,20 +81,26 @@ sub constraint_cart_type {
     return 1;
 };
 
+sub constraint_cart_name {
+    my ($value, $object, $column, $changing) = @_;
+    my $type = ref $changing ? $changing-&gt;{'type'} : '';
+
+    if (constraint_cart_type($type) &amp;&amp; $type == CART_TYPE_SAVED &amp;&amp; !length($value || '')) {
+        return 0;
+    };
+    return 1;
+};
+
+
 sub constraint_currency_code {
     my $value = defined $_[0] ? uc(shift) : '';
 
-    return  unless ($value =~ /^[A-Z]{3}$/);
+    return unless ($value =~ /^[A-Z]{3}$/); ## no critic
 
-    eval 'use Locale::Currency';
-    if (!$@) {
-        if (! keys %codes) {
-            %codes = map {uc($_) =&gt; uc($_)} all_currency_codes();
-        };
-        return exists $codes{$value};
+    if (! keys %codes) {
+        %codes = map {uc($_) =&gt; uc($_)} all_currency_codes();
     };
-
-    return 1;
+    return exists $codes{$value};
 };
 
 sub constraint_checkout_phase {
@@ -124,42 +137,63 @@ Handel::Constraints - Common database constraints used to validate input data
 
 =head1 SYNOPSIS
 
-    use Handel::Constraints qw(constraint_quantity);
-
+    use Handel::Constraints qw/constraint_quantity/;
+    
     my $qty = 'bogus-1';
-
-    if (constraint_quantity($qty) {
+    
+    if (constraint_quantity($qty)) {
         print 'invalid quantity';
     };
 
 =head1 DESCRIPTION
 
-C&lt;Handel::Constraints&gt; contains a set of functions used to validate data
-submitted by users into Handel objects. By default, C&lt;Handel::Constraints&gt;
-doesn't export anything. Use the export tags to export groups of functions, or
-specify the exact methods you are interested in using. See L&lt;Exporter&gt; for more
+Handel::Constraints contains a set of functions used to validate data submitted
+by users into Handel objects. By default, Handel::Constraints doesn't export
+anything. Use the export tags to export groups of functions, or specify the
+exact methods you are interested in using. See L&lt;Exporter|Exporter&gt; for more
 information on using export tags.
 
 =head1 FUNCTIONS
 
 =head2 constraint_quantity
 
-Returns 1 if the value passed is a numeric, non-negative value, otherwise
- it returns C&lt;undef&gt;.
+=over
+
+=item Arguments: $quantity
+
+=back
+
+Returns 1 if the value passed is a numeric, non-negative value that is less
+than or equal HandelMaxQuantity. Otherwise it returns C&lt;undef&gt;.
+
+See L&lt;Handel::ConfigReader|Handel::ConfigReader&gt; for more information on
+HandelMaxQuantity and HandelMaxQuantityAction.
 
 =head2 constraint_price
 
+=over
+
+=item Arguments: $price
+
+=back
+
 Returns 1 if the value passed is a numeric, non-negative value between 0 and
 99999.99, otherwise it returns C&lt;undef&gt;.
 
 =head2 constraint_uuid
 
+=over
+
+=item Arguments: $string
+
+=back
+
 Returns 1 if the value passed is conforms to the GUID/UUID format, otherwise it
 returns C&lt;undef&gt;. Currently, this does B&lt;not&gt; expect the brackets around the
 value.
 
     constraint_uuid( '11111111-1111-1111-1111-111111111111' ); # 1
-
+    
     constraint_uuid('{11111111-1111-1111-1111-111111111111}'); # undef
 
 This will probably change in the future, or some sort of stripping of the
@@ -167,37 +201,72 @@ brackets may occur.
 
 =head2 constraint_cart_type
 
+=over
+
+=item Arguments: $type
+
+=back
+
 Returns 1 if the value passed is C&lt;CART_TYPE_SAVED&gt; or C&lt;CART_TYPE_TEMP&gt;,
 otherwise it returns C&lt;undef&gt;.
 
 =head2 constraint_currency_code
 
+=over
+
+=item Arguments: $code
+
+=back
+
 Returns 1 if the value passed is considered a 3 letter currency code.
-If L&lt;Locale::Currency&gt; is installed, it will verify the 3 letter code is
-actually a valid currency code.
+If L&lt;Locale::Currency|Locale::Currency&gt; is installed, it will verify the 3
+letter code is actually a valid currency code.
 
-If C&lt;Locale::Currency&gt; is not installed, it simply checks that the code
-conforms to:
+If Locale::Currency is not installed, it simply checks that the code conforms
+to:
 
     /^[A-Z]{3}$/
 
 =head2 constraint_checkout_phase
 
+=over
+
+=item Arguments: $phase
+
+=back
+
 Returns 1 if the value passed is one of the C&lt;CHECKOUT_PHASE_*&gt; constants,
 otherwise it returns C&lt;undef&gt;.
 
 =head2 constraint_order_type
 
+=over
+
+=item Arguments: $type
+
+=back
+
 Returns 1 if the value passed is C&lt;ORDER_TYPE_SAVED&gt; or C&lt;ORDER_TYPE_TEMP&gt;,
 otherwise it returns C&lt;undef&gt;.
 
+=head2 constraint_cart_name
+
+=over
+
+=item Arguments: $name
+
+=back
+
+Returns 0 if the cart type is C&lt;CART_TYPE_SAVED&gt; and the name is undefined,
+otherwise it returns 1.
+
 =head1 EXPORT_TAGS
 
 =head2 :all
 
-Exports all functions into the classes namespace.
+Exports all functions into the callers namespace.
 
-    use Handel::Constraints qw(:all);
+    use Handel::Constraints qw/:all/;
 
 =head1 AUTHOR
 </diff>
      <filename>lib/Handel/Constraints.pm</filename>
    </modified>
    <modified>
      <diff>@@ -2,90 +2,83 @@
 package Handel::Currency;
 use strict;
 use warnings;
-use overload '&quot;&quot;' =&gt; \&amp;stringify, fallback =&gt; 1;
 
 BEGIN {
-    use Handel;
-    use Handel::Constraints qw(:all);
-    use Handel::Exception;
-    use Handel::L10N qw(translate);
+    use base qw/Data::Currency/;
+    use Handel ();
+    use Handel::Exception ();
+    use Handel::L10N qw/translate/;
+    use Handel::Constraints qw/constraint_currency_code/;
+    use Class::Inspector ();
 };
 
-sub new {
-    my ($class, $value) = @_;
-    my $self = bless {price =&gt; $value}, ref($class) || $class;
+sub code {
+    my ($self, $code) = @_;
+    my $cfg = Handel-&gt;config;
 
-    eval 'use Finance::Currency::Convert::WebserviceX';
-    if (!$@) {
-        $self-&gt;{'converter'} = Finance::Currency::Convert::WebserviceX-&gt;new;
-    };
-
-    return $self;
-};
-
-sub format {
-    my ($self, $code, $format) = @_;
+    if ($code) {
+        throw Handel::Exception::Argument(
+            -details =&gt; translate('CURRENCY_CODE_INVALID', $code)
+        ) unless constraint_currency_code($code); ## no critic
 
-    eval 'use Locale::Currency::Format';
-    return $self-&gt;{'price'} if $@;
-
-    my $cfg = $Handel::Cfg;
+        $self-&gt;SUPER::code($code);
+    };
 
-    eval '$format = ' .  ($format || $cfg-&gt;{'HandelCurrencyFormat'});
-    $code   ||= $cfg-&gt;{'HandelCurrencyCode'};
+    $code = $self-&gt;get_simple('code') || $cfg-&gt;{'HandelCurrencyCode'};
 
     throw Handel::Exception::Argument(
-        -details =&gt; translate(&quot;Currency code '[_1]' is invalid or malformed&quot;, $code) . '.') unless
-            constraint_currency_code($code);
+        -details =&gt; translate('CURRENCY_CODE_INVALID', $code)
+    ) unless constraint_currency_code($code); ## no critic
 
-    return _to_utf8(currency_format($code, $self-&gt;{'price'}, $format));
+    return $code;
 };
 
 sub convert {
-    my ($self, $from, $to, $format, $options) = @_;
-    my $cfg = $Handel::Cfg;
-
-    $from ||= $cfg-&gt;{'HandelCurrencyCode'};
-    $to   ||= $cfg-&gt;{'HandelCurrencyCode'};
-    eval '$options = ' .  ($options || $cfg-&gt;{'HandelCurrencyFormat'});
+    my ($self, $to) = @_;
+    my $from = $self-&gt;code;
 
-    return if uc($from) eq uc($to);
+    $to ||= '';
 
     throw Handel::Exception::Argument(
-        -details =&gt; translate(&quot;Currency code '[_1]' is invalid or malformed&quot;, $from) . '.') unless
-            constraint_currency_code($from);
+        -details =&gt; translate('CURRENCY_CODE_INVALID', $from)
+    ) unless constraint_currency_code($from); ## no critic
 
     throw Handel::Exception::Argument(
-        -details =&gt; translate(&quot;Currency code '[_1]' is invalid or malformed&quot;, $to) . '.') unless
-            constraint_currency_code($to);
+        -details =&gt; translate('CURRENCY_CODE_INVALID', $to)
+    ) unless constraint_currency_code($to); ## no critic
 
-    my $result = defined $self-&gt;{'converter'} ?
-        $self-&gt;{'converter'}-&gt;convert($self-&gt;{'price'}, $from, $to) :
-        undef;
+    return $self-&gt;SUPER::convert($to);
+};
 
-    eval 'use Locale::Currency::Format';
-    if (!$@ &amp;&amp; defined $result &amp;&amp; $format) {
-        return _to_utf8(currency_format($to, $result, $options));
-    };
+sub format {
+    my ($self, $format) = @_;
+    my $cfg = Handel-&gt;config;
 
-    return $result;
-};
+    if ($format) {
+        $self-&gt;SUPER::format($format);
+    };
 
-sub stringify {
-    my $self = shift;
+    $format = $self-&gt;get_simple('format') || $cfg-&gt;{'HandelCurrencyFormat'};
 
-    return $self-&gt;{'price'};
+    return $format ? $format : undef;
 };
 
-sub _to_utf8 {
-    my $value = shift;
+sub set_component_class {
+    my ($self, $field, $value) = @_;
 
-    if ($] &gt;= 5.008) {
-        require utf8;
-        utf8::upgrade($value);
+    if ($value) {
+        if (!Class::Inspector-&gt;loaded($value)) {
+            eval &quot;use $value&quot;; ## no critic
+
+            throw Handel::Exception(
+                -details =&gt; translate('COMPCLASS_NOT_LOADED', $field, $value)
+            ) if $@; ## no critic
+        };
     };
 
-    return $value;
+    $self-&gt;set_inherited($field, $value);
+
+    return;
 };
 
 1;
@@ -98,99 +91,229 @@ Handel::Currency - Price container to do currency conversion/formatting
 =head1 SYNOPSIS
 
     use Handel::Currency;
-
-    my $curr = Handel::Currenct-new(1.2);
-    print $curr-&gt;format();          # 1.20 USD
-    print $curr-&gt;format('CAD');     # 1.20 CAD
-    print $curr-&gt;format(undef, 'FMT_SYMBOL');   # $1.20
-
+    
+    my $price = Handel::Currency-&gt;new(1.2. 'USD');
+    print $price;            # 1.20 USD
+    print $price+1           # 2.2
+    print $price-&gt;code;      # USD
+    print $price-&gt;format;    # FMT_SYMBOL
+    print $price-&gt;as_string; # 1.20 USD
+    print $price-&gt;as_string('FMT_SYMBOL'); # $1.20
+    
     print 'Your price in Canadian Dollars is: ';
-    print $curr-&gt;convert('USD', 'CAD');
+    print $price-&gt;convert('CAD')-&gt;value;
 
 =head1 DESCRIPTION
 
-The C&lt;Handel::Currency&gt; module provides basic currency formatting within
-Handel. It can be used separately to format any number into a more friendly
-format:
+The Handel::Currency module provides basic currency formatting within Handel
+using L&lt;Data::Currency|Data::Currency&gt;. It can be used separately to format any
+number into a more friendly formatted currency string.
 
     my $price = 1.23;
     my $currency = Handel::Currency-&gt;new($price);
 
-    print $currency-&gt;format;
+    print $currency-&gt;as_string;
 
 A new Handel::Currency object is automatically returned within the shopping
 cart when calling C&lt;subtotal&gt;, C&lt;total&gt;, and C&lt;price&gt; as an lvalue:
 
-    my $cart = Handel::Cart-&gt;load({id =&gt; '11111111-1111-1111-1111-111111111111'});
+    my $cart = Handel::Cart-&gt;search({id =&gt; '11111111-1111-1111-1111-111111111111'});
 
     print $cart-&gt;subtotal;              # 12.9
-    print $cart-&gt;subtotal-&gt;format();    # 12.90 USD
+    print $cart-&gt;subtotal-&gt;as_string;   # 12.90 USD
 
-By default, a Handel::Currency object will stringify to the original decimal
-based price.
+Each Handel::Currency object will stringify to the original value except in
+string context, where it stringifies to the format specified in C&lt;format&gt;.
 
 =head1 CONSTRUCTOR
 
 =head2 new
 
-The create a new Handel::Currency instance, simply call C&lt;new&gt; and pass in the
+=over
+
+=item Arguments: $price [, $code, $format]
+
+=back
+
+To creates a new Handel::Currency object, simply call C&lt;new&gt; and pass in the
 price to be formatted:
 
     my $currency = Handel::Currency-&gt;new(10.23);
 
+You can also pass in the default currency code and/or currency format to be
+used. If no code or format are supplied, future calls to C&lt;format&gt;, C&lt;code&gt; and
+C&lt;convert&gt; will use the C&lt;HandelCurrencyCode&gt; and C&lt;HandelCurrencyFormat&gt;
+environment variables.
+
 =head1 METHODS
 
-=head2 format([$code, $options])
+=head2 as_string
+
+=over
+
+=item Arguments: $format
+
+=back
+
+Returns the freshly formatted price in a format declared in
+L&lt;Locale::Currency::Format|Locale::Currency::Format&gt;. If no format options are
+specified, the defaults values from C&lt;new&gt; and then
+C&lt;HandelCurrencyFormat&gt; are used. Currently the default format is
+C&lt;FMT_STANDARD&gt;.
+
+It is also acceptable to specify different default values.
+See L&lt;/&quot;CONFIGURATION&quot;&gt; and C&lt;Handel::ConfigReader&gt; for further details.
+
+=head2 code
+
+=over
+
+=item Arguments: $code
+
+=back
+
+Gets/sets the three letter currency code for the current currency object.
+
+C&lt;code&gt; throws a L&lt;Handel::Exception::Argument|Handel::Exception::Argument&gt;
+if C&lt;code&gt; isn't a valid currency code. If no code was passed during object
+creation, I&lt;no code will be return by this method&gt; unless C&lt;HandelCurrencyCode&gt;
+is set.
+
+=head2 convert
+
+=over
+
+=item Arguments: $code
+
+=back
 
-The C&lt;format&gt; method returns the freshly formatted price in a currency and
-format declared in C&lt;Locale::Currency::Format&gt;. If no currency code or
-format are specified, the defaults values from C&lt;Handel::ConfigReader&gt; are
-used. Currently those defaults are C&lt;USD&gt; and C&lt;FMT_STANDARD&gt;.
+Returns a new Handel::Currency object containing the converted price value.
+
+If no C&lt;code&gt; is specified for the current currency object, the
+C&lt;HandelCurrencyCode&gt; will be used as the currency code to convert from. If the
+currency you are converting to is the same as the currency objects current
+currency code, convert will just return itself.
+
+You can also chain the C&lt;convert&gt; call into other method calls:
+
+    my $price = Handel::Currency-&gt;new(1.25, 'USA');
+    print $price-&gt;convert('CAD')-&gt;format('FMT_STANDARD')-&gt;as_string;
+
+C&lt;convert&gt; throws a L&lt;Handel::Exception::Argument|Handel::Exception::Argument&gt;
+if C&lt;code&gt; isn't valid currency code or isn't defined.
+
+It is also acceptable to specify different default values.
+See L&lt;/&quot;CONFIGURATION&quot;&gt; and C&lt;Handel::ConfigReader&gt; for further details.
+
+=head2 converter_class
+
+=over
+
+=item Arguments: $converter_class
+
+=back
+
+Gets/sets the converter class to be used when converting currency numbers.
+
+    __PACKAGE__-&gt;currency_class('MyCurrencyConverter');
+
+The converter class can be any class that supports the following method
+signature:
+
+    sub convert {
+        my ($self, $price, $from, $to) = @_;
+
+        return $converted_price;
+    };
+
+A L&lt;Handel::Exception|Handel::Exception&gt; exception will be thrown if the
+specified class can not be loaded.
+
+=head2 format
+
+=over
+
+=item Arguments: $format
+
+=back
+
+Gets/sets the format to be used when displaying this object as a formatted
+currency string.
+
+If no format is defined, the defaults value C&lt;HandelCurrencyFormat&gt; is used.
+Currently the default format is C&lt;FMT_STANDARD&gt;.
 
 It is also acceptable to specify different default values.
 See L&lt;/&quot;CONFIGURATION&quot;&gt; and C&lt;Handel::ConfigReader&gt; for further details.
 
-In situations where C&lt;Locale::Currency::Format&gt; isn't installed, C&lt;format&gt;
-simply returns the price in it's original format no harm no foul.
+=head2 name
+
+Returns the currency name for the current objects currency code. If no
+currency code is set, the code set in C&lt;HandelCurrencyCode&gt; will be used.
+
+C&lt;name&gt; throws a L&lt;Handel::Exception::Argument|Handel::Exception::Argument&gt;
+if code used isn't a valid currency code.
+
+=head2 stringify
+
+Sames as C&lt;as_string&gt;.
+
+=head2 value
+
+Returns the original price value given to C&lt;new&gt;. Always use this instead of
+relying on stringification when deflating currency objects in DBIx::Class
+schemas.
+
+=head2 get_component_class
+
+=over
+
+=item Arguments: $name
+
+=back
+
+Gets the current class for the specified component name.
+
+    my $class = $self-&gt;get_component_class('item_class');
+
+There is no good reason to use this. Use the specific class accessors instead.
+
+=head2 set_component_class
 
-C&lt;format&gt; throws a C&lt;Handel::Exception::Argument&gt; if C&lt;code&gt; isn't a valid
-currency code.
+=over
 
-=head2 convert($from, $to [, $format, $options])
+=item Arguments: $name, $value
 
-The C&lt;convert&gt; method converts the given price from one currency to another
-using C&lt;Finance::Currency::Convert::WebserviceX&gt;.
+=back
 
-In situations where C&lt;Finance::Currency::Convert::WebserviceX&gt; isn't installed,
-C&lt;convert&gt; simply returns undef.
+Sets the current class for the specified component name.
 
-If no C&lt;from&gt; is specified, C&lt;HandelCurrencyCode&gt; below will be used instead.
+    $self-&gt;set_component_class('item_class', 'MyItemClass');
 
-C&lt;convert&gt; throws a C&lt;Handel::Exception::Argument&gt; if C&lt;from&gt; or C&lt;to&gt; aren't
-valid currency codes.
+A L&lt;Handel::Exception|Handel::Exception&gt; exception will be thrown if the
+specified class can not be loaded.
 
-If C&lt;$format&gt; is true, the result of the conversion will also be formatted
-using the formatting C&lt;options&gt; given or the default in
-C&lt;HandelCurrencyFormat&gt;.
+There is no good reason to use this. Use the specific class accessors instead.
 
 =head1 CONFIGURATION
 
 =head2 HandelCurrencyCode
 
-This sets the default currency code used when no code is passed into C&lt;format&gt;.
-See C&lt;Locale::Currency::Format&gt; for all available currency codes. The default
-code is USD.
+This sets the default currency code used when no code is passed into C&lt;new&gt;.
+See L&lt;Locale::Currency::Format|Locale::Currency::Format&gt; for all available
+currency codes. The default code is USD.
 
 =head2 HandelCurrencyFormat
 
 This sets the default options used to format the price. See
-C&lt;Locale::Currency::Format&gt; for all available currency codes. The default
-format used is C&lt;FMT_STANDARD&gt;. Just like in C&lt;Locale::Currency::Format&gt;,
-you can combine options using C&lt;|&gt;.
+L&lt;Locale::Currency::Format|Locale::Currency::Format&gt; for all available currency
+codes. The default format used is C&lt;FMT_STANDARD&gt;. Just like in
+Locale::Currency::Format, you can combine options using C&lt;|&gt;.
 
 =head1 SEE ALSO
 
-L&lt;Locale::Currency::Format&gt;, L&lt;Finance::Currency::Convert::WebserviceX&gt;
+L&lt;Data::Currency&gt;, L&lt;Locale::Currency&gt;, L&lt;Locale::Currency::Format&gt;,
+L&lt;Finance::Currency::Convert::WebserviceX&gt;
 
 =head1 AUTHOR
 </diff>
      <filename>lib/Handel/Currency.pm</filename>
    </modified>
    <modified>
      <diff>@@ -4,11 +4,13 @@ use strict;
 use warnings;
 
 BEGIN {
-    use base 'Error';
-    use Handel::L10N qw(translate);
-    eval 'require Apache::AxKit::Exception';
-    if (!$@) {
-        push @__PACKAGE__::ISA, 'Apache::AxKit::Exception';
+    use base qw/Error/;
+    use Handel::L10N qw/translate/;
+    use Class::Inspector;
+
+    if (Class::Inspector-&gt;loaded('Apache::AxKit::Exception')) {
+        no strict 'vars';
+        push @ISA, 'Apache::AxKit::Exception'; ## no critic
     };
 };
 
@@ -18,13 +20,11 @@ sub new {
     my $class = shift;
     my %args  = @_;
     my $text  = translate(
-        $args{-text} || 'An unspecified error has occurred'
+        $args{-text} || 'UNHANDLED_EXCEPTION'
     );
 
-    if ( defined( $args{-details} ) ) {
+    if ( defined($args{'-details'}) &amp;&amp; ! ref $args{'-details'}) {
         $text .= ': ' . $args{-details};
-    } else {
-        # $text .= '.';
     };
 
     ## don't pass the original text
@@ -33,34 +33,40 @@ sub new {
     return $class-&gt;SUPER::new( -text =&gt; $text, %args );
 };
 
+sub details {
+    return shift-&gt;{'-details'};
+};
+
+sub results {
+    return shift-&gt;{'-results'};
+};
 
 package Handel::Exception::Constraint;
 use strict;
 use warnings;
 
 BEGIN {
-    use base 'Handel::Exception';
+    use base qw/Handel::Exception/;
 };
 
 sub new {
     my $class = shift;
     return $class-&gt;SUPER::new(
-        -text =&gt; 'The supplied field(s) failed database constraints', @_ );
+        -text =&gt; 'CONSTRAINT_EXCEPTION', @_ );
 };
 
-
 package Handel::Exception::Argument;
 use strict;
 use warnings;
 
 BEGIN {
-    use base 'Handel::Exception';
+    use base qw/Handel::Exception/;
 };
 
 sub new {
     my $class = shift;
     return $class-&gt;SUPER::new(
-        -text =&gt; 'The argument supplied is invalid or of the wrong type', @_ );
+        -text =&gt; 'ARGUMENT_EXCEPTION', @_ );
 };
 
 package Handel::Exception::Taglib;
@@ -68,13 +74,13 @@ use strict;
 use warnings;
 
 BEGIN {
-    use base 'Handel::Exception';
+    use base qw/Handel::Exception/;
 };
 
 sub new {
     my $class = shift;
     return $class-&gt;SUPER::new(
-        -text =&gt; 'The tag is out of scope or missing required child tags', @_ );
+        -text =&gt; 'XSP_TAG_EXCEPTION', @_ );
 };
 
 package Handel::Exception::Order;
@@ -82,13 +88,13 @@ use strict;
 use warnings;
 
 BEGIN {
-    use base 'Handel::Exception';
+    use base qw/Handel::Exception/;
 };
 
 sub new {
     my $class = shift;
     return $class-&gt;SUPER::new(
-        -text =&gt; 'An error occurred while while creating or validating the current order', @_ );
+        -text =&gt; 'ORDER_EXCEPTION', @_ );
 };
 
 package Handel::Exception::Checkout;
@@ -96,13 +102,55 @@ use strict;
 use warnings;
 
 BEGIN {
-    use base 'Handel::Exception';
+    use base qw/Handel::Exception/;
+};
+
+sub new {
+    my $class = shift;
+    return $class-&gt;SUPER::new(
+        -text =&gt; 'CHECKOUT_EXCEPTION', @_ );
+};
+
+package Handel::Exception::Storage;
+use strict;
+use warnings;
+
+BEGIN {
+    use base qw/Handel::Exception/;
+};
+
+sub new {
+    my $class = shift;
+    return $class-&gt;SUPER::new(
+        -text =&gt; 'STORAGE_EXCEPTION', @_ );
+};
+
+package Handel::Exception::Validation;
+use strict;
+use warnings;
+
+BEGIN {
+    use base qw/Handel::Exception/;
+};
+
+sub new {
+    my $class = shift;
+    return $class-&gt;SUPER::new(
+        -text =&gt; 'VALIDATION_EXCEPTION', @_ );
+};
+
+package Handel::Exception::Virtual;
+use strict;
+use warnings;
+
+BEGIN {
+    use base qw/Handel::Exception/;
 };
 
 sub new {
     my $class = shift;
     return $class-&gt;SUPER::new(
-        -text =&gt; 'An error occurred during the checkout process', @_ );
+        -text =&gt; 'VIRTUAL_METHOD', @_ );
 };
 
 1;
@@ -116,13 +164,11 @@ Handel::Exception - Exceptions used within Handel
 
     use Handel::Cart;
     use Handel::Exception' qw(:try);
-
+    
     try {
         my $cart = Handel::Cart-&gt;new('junk crap');
-
     } catch Handel::Exception::Argument with {
         print 'Passed the wrong arguments to method';
-
     } catch Handel::Exception with {
         print 'Unknown issue with Handel';
     } catch Error with {
@@ -133,8 +179,8 @@ Handel::Exception - Exceptions used within Handel
 
 =head1 DESCRIPTION
 
-C&lt;Handel::Exception&gt; subclasses L&lt;Error&gt; and attempts to throw exceptions when
-unexpected things happen.
+Handel::Exception subclasses L&lt;Error|Error&gt; and attempts to throw exceptions
+when unexpected things happen.
 
 =head1 EXCEPTIONS
 
@@ -161,8 +207,21 @@ exceptions.
 =head2 Handel::Exception::Constraint
 
 This exception is thrown if a database constraint is violated. This is true for
-both raw DBI database constraint errors as well as  field updates that don't
-pass constraints in C&lt;Handel::Constraints&gt;.
+both raw DBI database constraint errors as well as field updates that don't
+pass constraints in
+L&lt;Handel::Components::Constraints|Handel::Components::Constraints&gt;.
+
+=head2 Handel::Exception::Validation
+
+This exception is thrown if the validation performed by
+L&lt;Handel::Components::Validation|Handel::Components::Validation&gt; has failed.
+If the validation component returned a result object, that can be found in
+$E-E&lt;gt&gt;results.
+
+=head2 Handel::Exception::Storage
+
+This exception is thrown if there are any configuration or setup errors in
+Handel::Storage.
 
 =head2 Handel::Exception::Argument
 
@@ -172,22 +231,31 @@ into methods.
 =head2 Handel::Exception::Taglib
 
 This exception is thrown when an unexpected error occurs within
-C&lt;AxKit::XSP::Handel::Cart&gt; taglib.
+the AxKit taglibs.
 
 =head1 METHODS
 
 =head2 new
 
-This returns a new C&lt;Handel::Exception&gt; object. This is mostly used internally
-by L&lt;Error&gt;. In most circumstance, you don't need to call C&lt;new&gt; at all.
+This returns a new Handel::Exception object. This is mostly used internally
+by L&lt;Error|Error&gt;. In most circumstances, you don't need to call C&lt;new&gt; at all.
 Instead, simply use the C&lt;throw&gt; syntax:
 
     use Handel::Exceptions;
-
+    
     throw Handel::Exception::Taglib(
         -text =&gt; translate(&quot;Tag '[_1]' not valid inside of other Handel tags&quot;, $tag)
     ) if ($context[$#context] ne 'root');
 
+=head2 details
+
+Returns the details portion of the exception message if there are any.
+
+=head2 results
+
+Returns the data validation result errors from exceptions thrown by
+L&lt;Handel::Components::Validation|Handel::Components::Validation&gt;.
+
 =head1 SEE ALSO
 
 L&lt;Error&gt;, L&lt;Handel::Constraints&gt;</diff>
      <filename>lib/Handel/Exception.pm</filename>
    </modified>
    <modified>
      <diff>@@ -1,10 +1,85 @@
 # $Id$
+## no critic (ProhibitAmbiguousNames, RequireFinalReturn)
 package Handel::Iterator;
 use strict;
 use warnings;
+use overload
+        '0+'     =&gt; \&amp;count,
+        'bool'   =&gt; \&amp;count,
+        '=='     =&gt; \&amp;count,
+        fallback =&gt; 1;
 
 BEGIN {
-    use base 'Class::DBI::Iterator';
+    use base qw/Class::Accessor::Grouped/;
+    __PACKAGE__-&gt;mk_group_accessors('inherited', qw/data result_class storage/);
+
+    use Handel::Exception qw/:try/;
+    use Handel::L10N qw/translate/;
+};
+
+sub new {
+    my ($class, $options) = @_;
+
+    throw Handel::Exception::Argument(
+        -details =&gt; translate('PARAM1_NOT_HASHREF')
+    ) unless ref $options eq 'HASH'; ## no critic
+
+    throw Handel::Exception::Argument(
+        -details =&gt; translate('NO_ITERATOR_DATA')
+    ) unless $options-&gt;{'data'}; ## no critic
+
+    throw Handel::Exception::Argument(
+        -details =&gt; translate('NO_RESULT_CLASS')
+    ) unless $options-&gt;{'result_class'}; ## no critic
+
+    throw Handel::Exception::Argument(
+        -details =&gt; translate('NO_STORAGE')
+    ) unless $options-&gt;{'storage'}; ## no critic
+
+    return bless $options, $class;
+};
+
+sub all {
+    throw Handel::Exception::Virtual;
+};
+
+sub count {
+    throw Handel::Exception::Virtual;
+};
+
+sub first {
+    throw Handel::Exception::Virtual;
+};
+
+sub last {
+    throw Handel::Exception::Virtual;
+};
+
+sub next {
+    throw Handel::Exception::Virtual;
+};
+
+sub reset {
+    throw Handel::Exception::Virtual;
+};
+
+sub create_result {
+    my ($self, $result, $storage) = @_;
+    if (!$storage) {
+        $storage = $self-&gt;storage;
+    };
+
+    throw Handel::Exception::Argument( -text =&gt;
+        translate('NO_RESULT')
+    ) unless $result; ## no critic
+
+    throw Handel::Exception::Argument( -text =&gt;
+        translate('NO_STORAGE')
+    ) unless $storage; ## no critic
+
+    return $self-&gt;result_class-&gt;create_instance(
+        $result, $storage
+    );
 };
 
 1;
@@ -12,32 +87,131 @@ __END__
 
 =head1 NAME
 
-Handel::Iterator - Iterator class used for collection looping
+Handel::Iterator - Iterator base class used for collection looping
 
 =head1 SYNOPSIS
 
-    use Handel::Cart;
+    my $iterator = Handel::Iterator::Custom-&gt;new({
+        data         =&gt; [$object1, $object2, ...],
+        result_class =&gt; 'MyResult',
+        storage      =&gt; $storage
+    });
+    
+    while (my $result = $iterator-&gt;next) {
+        print $result-&gt;method;
+    };
+
+=head1 DESCRIPTION
+
+Handel::Iterator is a base class used to create custom iterators for
+DBIx::Class resultsets and lists of results.
+
+=head1 CONSTRUCTOR
+
+=head2 new
+
+=over
+
+=item Arguments: \%options
+
+=back
 
-    my $cart = Handel::Cart-&gt;new({
-        shopper =&gt; 'D597DEED-5B9F-11D1-8DD2-00AA004ABD5E'
+Creates a new iterator object. The following options are available:
+
+    my $iterator = Handel::Iterator::Custom-&gt;new({
+        data         =&gt; [$object1, $object2, ...],
+        result_class =&gt; 'MyResult',
+        storage      =&gt; $storage
     });
 
-    my $iterator = $cart-&gt;items;
-    while (my $item = $iterator-&gt;next) {
-        print $item-&gt;sku;
-        print $item-&gt;price;
-        print $item-&gt;total;
+    my $result = $iterator-&gt;first;
+    print ref $result; # MyResult
+
+=over
+
+=item data
+
+The data to be iterated through. The type of this data depends on the
+individual subclass.
+
+=item result_class
+
+The name of the class that each result should be inflated into.
+
+=item storage
+
+The storage object that was used to create the results.
+
+=back
+
+=head1 METHODS
+
+=head2 all
+
+Returns all results from current iterator.
+
+    foreach my $result ($iterator-&gt;all) {
+        print $result-&gt;method;
     };
 
-=head1 DESCRIPTION
+=head2 count
+
+Returns the number of results in the current iterator.
+
+    my $count = $iterator-&gt;count;
+
+=head2 create_result
+
+=over
 
-C&lt;Handel::Iterator&gt; is used internally by C&lt;Handel::Cart&gt; to iterate through
-collections of carts and cart items. At this point, there should be no reason to
-use it directly.
+=item Arguments: $result [, $storage]
+
+=back
+
+Returns a new result class object based on the specified result and storage
+objects. If no storage object is specified, the storage object passed to C&lt;new&gt;
+will be used instead.
+
+This method is used by methods like C&lt;first&gt; and C&lt;next&gt; to to create storage
+result objects. There is probably no good reason to use this method directly.
+
+=head2 first
+
+Returns the first result or undef if there are no results.
+
+    my $first = $iterator-&gt;first;
+
+=head2 last
+
+Returns the last result or undef if there are no results.
+
+    my $last = $iterator-&gt;last;
+
+=head2 next
+
+Returns the next result or undef if there are no results.
+
+    while (my $result = $iterator-&gt;next) {
+        print $result-&gt;method;
+    };
+
+=head2 reset
+
+Resets the current result position back to the first result.
+
+    while (my $result = $iterator-&gt;next) {
+        print $result-&gt;method;
+    };
+    
+    $iterator-&gt;reset;
+    
+    while (my $result = $iterator-&gt;next) {
+        print $result-&gt;method;
+    };
 
 =head1 SEE ALSO
 
-L&lt;Handel::Cart&gt;
+L&lt;Handel::Iterator::DBIC&gt;, L&lt;Handel::Iterator::List&gt;
 
 =head1 AUTHOR
 </diff>
      <filename>lib/Handel/Iterator.pm</filename>
    </modified>
    <modified>
      <diff>@@ -1,13 +1,13 @@
 # $Id$
+## no critic (ProhibitPackageVars)
 package Handel::L10N;
 use strict;
 use warnings;
 use utf8;
-use vars qw(@EXPORT_OK %Lexicon $handle);
+use vars qw/@EXPORT_OK %Lexicon $handle/;
 
 BEGIN {
-    use base 'Locale::Maketext';
-    use base 'Exporter';
+    use base qw/Locale::Maketext Exporter/;
 };
 
 @EXPORT_OK = qw(translate);
@@ -32,7 +32,7 @@ Handel::L10N - Localization module for Handel
 =head1 SYNOPSIS
 
     use Handel::L10N qw(translate);
-
+    
     warn translate('This is my message');
 
 =head1 DESCRIPTION
@@ -44,25 +44,40 @@ export anything. You can either use it directly:
 
     warn Handel::L10N::translate('My message');
 
-You can also export C&lt;translate&gt; into the users namespace:
+You can also export C&lt;translate&gt; into the callers namespace:
 
-    use Handel::L10N qw(translate);
+    use Handel::L10N qw/translate/;
 
     warn translate('My message');
 
-Thus far, the French translation comes from Googles translation tools. IF you
-have the time and can do better, the help would be much appreciated.
+If you have the time and can do a language, the help would be much appreciated.
+If you're going to email a translation module, please Gzip it first. It's not
+uncommon for an email server along the way to trash UTF-8 characters in the
+.pm attachment text.
 
-=head1 METHODS
+There is also a t/l10n_lexicon_synced.t test that ensures that each lexicon
+has the same number of keys as the English version. Please make sure to
+run/update that test before submitting your lexicon.
+
+=head1 FUNCTIONS
 
 =head2 translate
 
+=over
+
+=item Arguments: $message
+
+=back
+
 Translates the supplied text into the appropriate language if available. If no
 match is available, the original text is returned.
 
+    print translate('foo was here');
+
 =head1 SEE ALSO
 
-L&lt;Locale::Maketext&gt;, L&lt;Handel::L10N::us_en&gt;, L&lt;Handel::L10N::fr&gt;
+L&lt;Locale::Maketext&gt;, L&lt;Handel::L10N::us_en&gt;, L&lt;Handel::L10N::fr&gt;,
+L&lt;Handel::L10N::zh_tw&gt;
 
 =head1 AUTHOR
 </diff>
      <filename>lib/Handel/L10N.pm</filename>
    </modified>
    <modified>
      <diff>@@ -1,16 +1,209 @@
+## no critic
 # $Id$
 package Handel::L10N::en_us;
 use strict;
 use warnings;
 use utf8;
-use vars qw(%Lexicon);
+use vars qw/%Lexicon/;
 
 BEGIN {
-    use base 'Handel::L10N';
+    use base qw/Handel::L10N/;
 };
 
 %Lexicon = (
     Language =&gt; 'English',
+
+    COMPAT_DEPRECATED =&gt;
+        'Handel::Compat is deprecated and will go away in a future release.',
+
+    COMPCLASS_NOT_LOADED =&gt;
+        'The component class [_1] [_2] could not be loaded',
+
+    PARAM1_NOT_HASHREF =&gt;
+        'Param 1 is not a HASH reference',
+
+    PARAM1_NOT_HASHREF_CARTITEM =&gt;
+        'Param 1 is not a HASH reference or Handel::Cart::Item',
+
+    PARAM1_NOT_HASHREF_CART =&gt;
+        'Param 1 is not a HASH reference or Handel::Cart',
+
+    PARAM1_NOT_HASHREF_ORDER =&gt;
+        'Param 1 is not a HASH reference or Handel::Order',
+
+    PARAM1_NOT_CHECKOUT_PHASE =&gt;
+        'Param 1 is not a valid CHECKOUT_PHASE_* value',
+
+    PARAM1_NOT_CODEREF =&gt;
+        'Param 1 is not a CODE reference',
+
+    PARAM1_NOT_CHECKOUT_MESSAGE =&gt;
+        'Param 1 is not a Handel::Checkout::Message object or text message',
+
+    PARAM1_NOT_HASH_CARTITEM_ORDERITEM =&gt;
+        'Param 1 is not a HASH reference, Handel::Cart::Item or Handel::Order::Item',
+
+    PARAM1_NOT_ARRAYREF_STRING =&gt;
+        'Param 1 is not an ARRAY reference or string',
+
+    PARAM2_NOT_HASHREF =&gt;
+        'Param 2 is not a HASH reference',
+
+    CARTPARAM_NOT_HASH_CART =&gt;
+        'Cart reference is not a HASH reference or Handel::Cart',
+
+    COLUMN_NOT_SPECIFIED =&gt;
+        'No column was specified',
+
+    COLUMN_NOT_FOUND =&gt;
+        'Column [_1] does not exist',
+
+    COLUMN_VALUE_EXISTS =&gt;
+        '[_1] value already exists',
+
+    CONSTRAINT_NAME_NOT_SPECIFIED =&gt;
+        'No constraint name was specified',
+
+    CONSTRAINT_NOT_SPECIFIED =&gt;
+        'No constraint was specified',
+
+    UNKNOWN_RESTORE_MODE =&gt;
+        'Unknown restore mode',
+
+    HANDLER_EXISTS_IN_PHASE =&gt;
+        'There is already a handler in phase ([_1]) for preference ([_2]) from the plugin ([_3])',
+
+    CONSTANT_NAME_ALREADY_EXISTS =&gt;
+        'A constant named [_1] already exists in Handel::Constants',
+
+    CONSTANT_VALUE_ALREADY_EXISTS =&gt;
+        'A phase constant value of [_1] already exists',
+
+    CONSTANT_EXISTS_IN_CALLER =&gt;
+        'A constant named [_1] already exists in caller [_2]',
+
+    NO_ORDER_LOADED =&gt;
+        'No order is assocated with this checkout process',
+
+    CART_NOT_FOUND =&gt;
+        'Could not find a cart matching the supplied search criteria',
+
+    ORDER_NOT_FOUND =&gt;
+        'Could not find an order matching the supplied search criteria',
+
+    ORDER_CREATE_FAILED_CART_EMPTY =&gt;
+        'Could not create a new order because the supplied cart is empty',
+
+    ROLLBACK_FAILED =&gt;
+        'Transaction aborted. Rollback failed: [_1]',
+
+    QUANTITY_GT_MAX =&gt;
+        'The quantity requested ([_1]) is greater than the maximum quantity allowed ([_2])',
+
+    CURRENCY_CODE_INVALID =&gt;
+        'Currency code [_1] is invalid or malformed',
+
+    UNHANDLED_EXCEPTION =&gt;
+        'An unspecified error has occurred',
+
+    CONSTRAINT_EXCEPTION =&gt;
+        'The supplied field(s) failed database constraints',
+
+    ARGUMENT_EXCEPTION =&gt;
+        'The argument supplied is invalid or of the wrong type',
+
+    XSP_TAG_EXCEPTION =&gt;
+        'The tag is out of scope or missing required child tags',
+
+    ORDER_EXCEPTION =&gt;
+        'An error occurred while while creating or validating the current order',
+
+    CHECKOUT_EXCEPTION =&gt;
+        'An error occurred during the checkout process',
+
+    STORAGE_EXCEPTION =&gt;
+        'An error occurred while loading storage',
+
+    VALIDATION_EXCEPTION =&gt;
+        'The data could not be written because it failed validation',
+
+    VIRTUAL_METHOD =&gt;
+        'Virtual method not implemented',
+
+    NO_STORAGE =&gt;
+        'Storage not supplied',
+
+    NO_RESULT_CLASS =&gt;
+        'Result class not supplied',
+
+    NO_ITERATOR_DATA =&gt;
+        'Iterator data not supplied',
+
+    ITERATOR_DATA_NOT_ARRAYREF =&gt;
+        'Iterator data is not an ARRAY reference',
+
+    ITERATOR_DATA_NOT_RESULTSET =&gt;
+        'Iterator data is not a DBIx::Class::Resultset',
+
+    ITERATOR_DATA_NOT_RESULTS_ITERATOR =&gt;
+        'Iterator data is not an iterator',
+
+    NO_RESULT =&gt;
+        'No result exists or result not supplied',
+
+    NOT_CLASS_METHOD =&gt;
+        'Not a class method',
+
+    NOT_OBJECT_METHOD =&gt;
+        'Not an object method',
+
+    FVS_REQUIRES_ARRAYREF =&gt;
+        'FormValidator::Simple requires an ARRAYREF based profile',
+
+    DFV_REQUIRES_HASHREF =&gt;
+        'Data::FormValidator requires an HASHREF based profile',
+
+    PLUGIN_HAS_NO_REGISTER =&gt;
+        'Attempt to register plugin that hasn\'t defined register',
+
+    ADD_CONSTRAINT_EXISTING_SCHEMA =&gt;
+        'Can not add constraints to an existing schema instance',
+
+    REMOVE_CONSTRAINT_EXISTING_SCHEMA =&gt;
+        'Can not remove constraints to an existing schema instance',
+
+    SETUP_EXISTING_SCHEMA =&gt;
+        'A schema instance has already been initialized',
+
+    COMPDATA_EXISTING_SCHEMA =&gt;
+        'Can not assign [_1] to an existing schema instance',
+
+    ITEM_RELATIONSHIP_NOT_SPECIFIED =&gt;
+        'No item relationship defined',
+
+    ITEM_STORAGE_NOT_DEFINED =&gt;
+        'No item storage or item storage class defined',
+
+    SCHEMA_SOURCE_NOT_SPECIFIED =&gt;
+        'No schema_source is specified',
+
+    SCHEMA_CLASS_NOT_SPECIFIED =&gt;
+        'No schema_class is specified',
+
+    SCHEMA_SOURCE_NO_RELATIONSHIP =&gt;
+        'The source [_1] has no relationship named [_2]',
+
+    TAG_NOT_ALLOWED_IN_OTHERS =&gt;
+        'Tag [_1] not valid inside of other Handel tags',
+
+    TAG_NOT_ALLOWED_HERE =&gt;
+        'Tag [_1] not valid here',
+
+    TAG_NOT_ALLOWED_IN_TAG =&gt;
+        'Tag [_1] not valid inside of tag [_2]',
+
+    NO_COLUMN_ACCESSORS =&gt;
+        'Storage did not return any column accessors',
 );
 
 1;
@@ -25,4 +218,4 @@ Handel::L10N::en_us - Handel Language Pack: US English
     Christopher H. Laco
     CPAN ID: CLACO
     claco@chrislaco.com
-    http://today.icantfocus.com/blog/
\ No newline at end of file
+    http://today.icantfocus.com/blog/</diff>
      <filename>lib/Handel/L10N/en_us.pm</filename>
    </modified>
    <modified>
      <diff>@@ -1,101 +1,209 @@
+## no critic
 # $Id$
 package Handel::L10N::fr;
 use strict;
 use warnings;
 use utf8;
-use vars qw(%Lexicon);
+use vars qw/%Lexicon/;
 
 BEGIN {
-    use base 'Handel::L10N';
+    use base qw/Handel::L10N/;
 };
 
 %Lexicon = (
-    &quot;Language&quot; =&gt;
-        &quot;Fran&#231;ais&quot;,
+    Language =&gt; 'Fran&#231;ais',
 
-    ## Base exceptions
-    &quot;An unspecified error has occurred&quot; =&gt;
-        &quot;Une erreur non sp&#233;cifi&#233;e s'est produite&quot;,
+    COMPAT_DEPRECATED =&gt;
+        'Handel::Compat est obsol&#232;te et sera retir&#233; dans la prochaine version.',
 
-    &quot;The supplied field(s) failed database constraints&quot; =&gt;
-        &quot;Le champ recu n'a pas satisfait aux contraintes de base de donn&#233;es&quot;,
+    COMPCLASS_NOT_LOADED =&gt;
+        'The component class [_1] [_2] could not be loaded',
 
-    &quot;The argument supplied is invalid or of the wrong type&quot; =&gt;
-        &quot;L'argument fourni est invalide ou du type inappropri&#233;&quot;,
+    PARAM1_NOT_HASHREF =&gt;
+        'Le param&#232;tre 1 n\'est pas une r&#233;f&#233;rence &#224; un tableau associatif (HASH)',
 
-    &quot;Required modules not found&quot; =&gt;
-        &quot;Modules requis non trouv&#233;s&quot;,
+    PARAM1_NOT_HASHREF_CARTITEM =&gt;
+        'Le param&#232;tre 1 n\'est pas une r&#233;f&#233;rence &#224; un tableau associatif (HASH) ou un Handel::Cart::Item',
 
-    &quot;The quantity requested ([_1]) is greater than the maximum quantity allowed ([_2])&quot; =&gt;
-        &quot;La quantit&#233; demand&#233; ([_1]) est plus grande que la quantit&#233; maximale permise ([_2])&quot;,
+    PARAM1_NOT_HASHREF_CART =&gt;
+        'Le param&#232;tre 1 n\'est pas une r&#233;f&#233;rence &#224; un tableau associatif (HASH) ou un Handel::Cart',
 
-    &quot;An error occurred while while creating or validating the current order&quot; =&gt;
-        &quot;Une erreur s'est produite lors de la validation ou de la creation de la commande en cours&quot;,
+    PARAM1_NOT_HASHREF_ORDER =&gt;
+        'Le param&#232;tre 1 n\'est pas une r&#233;f&#233;rence &#224; un tableau associatif (HASH) ou un Handel::Order',
 
-    &quot;An error occurred during the checkout process&quot; =&gt;
-        &quot;Une erreur s'est produite pendant le processus de paiement&quot;,
+    PARAM1_NOT_CHECKOUT_PHASE =&gt;
+        'Le param&#232;tre 1 n\'est pas une valeur CHECKOUT_PHASE_*',
 
-    ## param 1 violations
-    &quot;Param 1 is not a HASH reference&quot; =&gt;
-        &quot;Le parametre 1 n'est pas une reference a un tableau associatif (HASH)&quot;,
+    PARAM1_NOT_CODEREF =&gt;
+        'Le param&#232;tre 1 n\'est pas une r&#233;f&#233;rence CODE',
 
-    &quot;Cart reference is not a HASH reference or Handel::Cart&quot; =&gt;
-        &quot;La reference au panier (Cart) n'est pas une reference a un tableau associatif (HASH) ou un Handel::Cart&quot;,
+    PARAM1_NOT_CHECKOUT_MESSAGE =&gt;
+        'Le param&#232;tre 1 n\'est pas un objet Handel::Checkout::Message ou un message texte',
 
-    &quot;Param 1 is not a HASH reference or Handel::Cart::Item&quot; =&gt;
-        &quot;Le parametre 1 n'est pas une reference a un tableau associatif (HASH) ou a un Handel::Cart::Item&quot;,
+    PARAM1_NOT_HASH_CARTITEM_ORDERITEM =&gt;
+        'Le param&#232;tre 1 n\'est pas une r&#233;f&#233;rence &#224; un tableau associatif (HASH) ou un Handel::Cart::Item ou un Handel::Order::Item',
 
-    &quot;Param 1 is not a HASH reference, Handel::Order::Item or Handel::Cart::Item&quot; =&gt;
-        &quot;Le parametre 1 n'est pas une reference a un tableau associatif (HASH) ou a un Handel::Order::Item ou un Handel::Cart::Item&quot;,
+    PARAM1_NOT_ARRAYREF_STRING =&gt;
+        'Le param&#232;tre 1 n\'est pas une r&#233;f&#233;rence &#224; un tableau ou une chaine de caract&#232;res',
 
-    &quot;Unknown restore mode&quot; =&gt;
-        &quot;Mode inconnu de restauration&quot;,
+    PARAM2_NOT_HASHREF =&gt;
+        'Le param&#232;tre 2 n\'est pas une r&#233;f&#233;rence &#224; un tableau associatif (HASH)',
 
-    &quot;Currency code '[_1]' is invalid or malformed&quot; =&gt;
-        &quot;Le code de devise '[_1]' est invalide ou mal form&#233;&quot;,
+    CARTPARAM_NOT_HASH_CART =&gt;
+        'La r&#233;f&#233;rence Panier n\'est pas une r&#233;f&#233;rence &#224; un tableau associatif (HASH) ou un Handel::Cart',
 
-    &quot;Param 1 is not a a valid CHECKOUT_PHASE_* value&quot; =&gt;
-        &quot;Le parametre 1 n'est pas une valeur valide de CHECKOUT_PHASE_*&quot;,
+    COLUMN_NOT_SPECIFIED =&gt;
+        'Aucune colonne sp&#233;cifi&#233;e',
 
-    &quot;Param 1 is not a CODE reference&quot; =&gt;
-        &quot;Le parametre 1 n'est pas une r&#233;f&#233;rence de CODE&quot;,
+    COLUMN_NOT_FOUND =&gt;
+        'La colonne [_1] n\'a pas &#233;t&#233; trouv&#233;e',
 
-    &quot;Param 1 is not an ARRAY reference&quot; =&gt;
-        &quot;Le parametre 1 n'est pas une r&#233;f&#233;rence de TABLEAU&quot;,
+    COLUMN_VALUE_EXISTS =&gt;
+        'La valeur [_1] existe d&#233;j&#224;',
 
-    &quot;Param 1 is not an ARRAY reference or string&quot; =&gt;
-        &quot;Le parametre 1 n'est pas une r&#233;f&#233;rence de TABLEAU ou de chaine de caracteresE&quot;,
+    CONSTRAINT_NAME_NOT_SPECIFIED =&gt;
+        'Aucun nom de contrainte sp&#233;cifi&#233;',
 
-    &quot;Param 1 is not a HASH reference, Handel::Order object, or order id&quot; =&gt;
-        &quot;Le parametre 1 n'est pas une r&#233;f&#233;rence a un tableau associatif (HASH), un objet de Handel::Cart, ou un identifiant de commande&quot;,
+    CONSTRAINT_NOT_SPECIFIED =&gt;
+        'Aucune contrainte sp&#233;cifi&#233;e',
 
-    &quot;Param 1 is not a Handel::Checkout::Message object or text message&quot; =&gt;
-        &quot;Le parametre 1 n'est pas un message de texte ni un objet de Handel::Checkout::Message&quot;,
+    UNKNOWN_RESTORE_MODE =&gt;
+        'Mode de restauration inconnu',
 
-    ## Taglib exceptions
-    &quot;Tag '[_1]' not valid inside of other Handel tags&quot; =&gt;
-        &quot;L'&#233;tiquette '[_1] 'ne peut resider a l'interieur d'autres &#233;tiquettes de Handel&quot;,
+    HANDLER_EXISTS_IN_PHASE =&gt;
+        'Il y a d&#233;j&#224; un handler en phase ([_1]) pour la pr&#233;f&#233;rence ([_2]) depuis le plugin ([_3])',
 
-    &quot;Tag '[_1]' not valid here&quot; =&gt;
-        &quot;&#201;tiquette '[_1]' nvalide ici&quot;,
+    CONSTANT_NAME_ALREADY_EXISTS =&gt;
+        'Une constante appel&#233;e [_1] existe d&#233;j&#224; dans Handel::Constants',
 
-    ## naughty bits
-    &quot;has invalid value&quot; =&gt;
-        &quot;a une valeur invalide&quot;,
+    CONSTANT_VALUE_ALREADY_EXISTS =&gt;
+        'Une valeur constante de phase de [_1] existe d&#233;j&#224;',
 
-    &quot;[_1] value already exists&quot; =&gt;
-        &quot;la valeur [_1] existe d&#233;j&#224;&quot;,
+    CONSTANT_EXISTS_IN_CALLER =&gt;
+        'Une constante appel&#233;e [_1] existe d&#233;j&#224; dans l\'appel [_2]',
 
-    ## Order exceptions
-    &quot;Could not find a cart matching the supplid search criteria&quot; =&gt;
-        &quot;N'a pas pu trouver un panier correspondant aux crit&#232;res de recherche fournis&quot;,
+    NO_ORDER_LOADED =&gt;
+        'Aucune commande n\'est associ&#233;e a ce processus de paiement',
 
-    &quot;Could not create a new order because the supplied cart is empty&quot; =&gt;
-        &quot;Impossible de cr&#233;er une nouvelle commande parce que le panier fourni est vide&quot;,
+    CART_NOT_FOUND =&gt;
+        'Aucun panier ne correspondant aux crit&#232;res de recherche fournis',
 
-    ## Checkout exception
-    &quot;No order is assocated with this checkout process&quot; =&gt;
-        &quot;Aucune commande n'est associee a ce processus de paiement&quot;,
+    ORDER_NOT_FOUND =&gt;
+        'Aucune commande ne correspondant aux crit&#232;res de recherche fournis',
+
+    ORDER_CREATE_FAILED_CART_EMPTY =&gt;
+        'Impossible de cr&#233;er une nouvelle commande, le panier fourni est vide',
+
+    ROLLBACK_FAILED =&gt;
+        'Transaction abandonn&#233;e. Echec de Rollback [_1]',
+
+    QUANTITY_GT_MAX =&gt;
+        'La quantit&#233; demand&#233; ([_1]) est plus grande que la quantit&#233; maximale permise ([_2])',
+
+    CURRENCY_CODE_INVALID =&gt;
+        'Le code devise [_1] est invalide ou malform&#233;',
+
+    UNHANDLED_EXCEPTION =&gt;
+        'Une erreur non sp&#233;cifi&#233;e s\'est produite',
+
+    CONSTRAINT_EXCEPTION =&gt;
+        'Le champ recu ne respecte pas les contraintes de la base de donn&#233;es',
+
+    ARGUMENT_EXCEPTION =&gt;
+        'L\'argument fourni est invalide ou d\'un mauvais type',
+
+    XSP_TAG_EXCEPTION =&gt;
+        'L\'&#233;tiquette est hors de port&#233;e ou il manque les &#233;tiquettes filles r&#233;quises',
+
+    ORDER_EXCEPTION =&gt;
+        'Une erreur s\'est produite lors de la validation ou de la cr&#233;ation de la commande en cours',
+
+    CHECKOUT_EXCEPTION =&gt;
+        'Une erreur s\'est produite pendant le processus de paiement',
+
+    STORAGE_EXCEPTION =&gt;
+        'Une erreur s\'est produite pendant le chargement du stockage',
+
+    VALIDATION_EXCEPTION =&gt;
+        'Echec de la validation, les donn&#233;es ne peuvent pas &#234;tre enregistr&#233;',
+
+    VIRTUAL_METHOD =&gt;
+        'Les m&#233;thodes virtuels ne sont pas impl&#233;ment&#233;s',
+
+    NO_STORAGE =&gt;
+        'Le stockage n\'est pas fourni',
+
+    NO_RESULT_CLASS =&gt;
+        'Le r&#233;sultat de la classe n\'est pas fourni',
+
+    NO_ITERATOR_DATA =&gt;
+        'Les donn&#233;es d\'it&#233;ration ne sont pas fournies',
+
+    ITERATOR_DATA_NOT_ARRAYREF =&gt;
+        'Les donn&#233;es d\'it&#233;ration ne sont pas une r&#233;f&#233;rence &#224; un tableau',
+
+    ITERATOR_DATA_NOT_RESULTSET =&gt;
+        'Les donn&#233;es d\'it&#233;ration ne sont pas un DBIx::Class::Resultset',
+
+    ITERATOR_DATA_NOT_RESULTS_ITERATOR =&gt;
+        'Les donn&#233;es d\'it&#233;ration ne sont pas une it&#233;ration',
+
+    NO_RESULT =&gt;
+        'Aucun r&#233;sultat ou r&#233;sultat non fourni',
+
+    NOT_CLASS_METHOD =&gt;
+        'N\'est pas une m&#233;thode de la classe',
+
+    NOT_OBJECT_METHOD =&gt;
+        'N\'est pas une m&#233;thode de l\'objet',
+
+    FVS_REQUIRES_ARRAYREF =&gt;
+        'FormValidator::Simple a besoin d\'un profil sous forme de r&#233;f&#233;rence &#224; un tableau',
+
+    DFV_REQUIRES_HASHREF =&gt;
+        'Data::FormValidator a besoin d\'un profil sous forme de r&#233;f&#233;rence &#224; un tableau associatif (HASH)',
+
+    PLUGIN_HAS_NO_REGISTER =&gt;
+        'Tentative d\'enregistrement d\'un plugin sans d&#233;finition d\'enregistrement',
+
+    ADD_CONSTRAINT_EXISTING_SCHEMA =&gt;
+        'Ne peut pas ajouter des contraintes &#224; une instance de sch&#233;ma existante',
+
+    REMOVE_CONSTRAINT_EXISTING_SCHEMA =&gt;
+        'Ne peut pas enlever des contraintes &#224; une instance de sch&#233;ma existante',
+
+    SETUP_EXISTING_SCHEMA =&gt;
+        'Une instance de sch&#233;ma a d&#233;j&#224; &#233;t&#233; initialis&#233;',
+
+    COMPDATA_EXISTING_SCHEMA =&gt;
+        'Ne peut pas assigner [_1] &#224; une instance d\'un sch&#233;ma existant',
+
+    ITEM_RELATIONSHIP_NOT_SPECIFIED =&gt;
+        'Aucun &#233;l&#233;ment de relation d&#233;fini',
+
+    ITEM_STORAGE_NOT_DEFINED =&gt;
+        'Aucun &#233;l&#233;ment de stockage ou d\'&#233;l&#233;ment classe de stockage d&#233;fini ',
+
+    SCHEMA_SOURCE_NOT_SPECIFIED =&gt;
+        'Aucun schema_source sp&#233;cifi&#233;',
+
+    SCHEMA_CLASS_NOT_SPECIFIED =&gt;
+        'Aucun schema_class sp&#233;cifi&#233;',
+
+    SCHEMA_SOURCE_NO_RELATIONSHIP =&gt;
+        'La source [_1] n\'a pas de relation appel&#233;e [_2]',
+
+    TAG_NOT_ALLOWED_IN_OTHERS =&gt;
+        '&#201;tiquette [_1] invalide &#224; l\'int&#233;rieur d\'autres &#233;tiquettes Handel',
+
+    TAG_NOT_ALLOWED_HERE =&gt;
+        '&#201;tiquette [_1] invalide ici',
+
+    TAG_NOT_ALLOWED_IN_TAG =&gt;
+        '&#201;tiquette [_1] invalide &#224; l\'int&#233;rieur de l\'&#233;tiquettes [_2]',
+
+    NO_COLUMN_ACCESSORS =&gt;
+        'Le stockage ne retourne pas d\'acc&#232;s aux colonnes',
 );
 
 1;
@@ -110,4 +218,6 @@ Handel::L10N::fr - Handel Language Pack: French
     Christopher H. Laco
     CPAN ID: CLACO
     claco@chrislaco.com
-    http://today.icantfocus.com/blog/
\ No newline at end of file
+    http://today.icantfocus.com/blog/
+
+    Translation : Pierrick DINTRAT</diff>
      <filename>lib/Handel/L10N/fr.pm</filename>
    </modified>
    <modified>
      <diff>@@ -4,95 +4,76 @@ use strict;
 use warnings;
 
 BEGIN {
-    use base 'Handel::DBI';
-    use Handel::Cart;
-    use Handel::Checkout;
-    use Handel::Constants qw(:checkout :returnas :order);
-    use Handel::Constraints qw(:all);
+    use Handel::Constants qw/:checkout :order/;
+    use Handel::Constraints qw/:all/;
     use Handel::Currency;
-    use Handel::L10N qw(translate);
-
-    __PACKAGE__-&gt;mk_classdata(_cart_class =&gt; 'Handel::Cart');
-    __PACKAGE__-&gt;mk_classdata(_item_class =&gt; 'Handel::Order::Item');
+    use Handel::L10N qw/translate/;
+    use Scalar::Util qw/blessed/;
+    use Carp qw/carp/;
+
+    use base qw/Handel::Base/;
+    __PACKAGE__-&gt;item_class('Handel::Order::Item');
+    __PACKAGE__-&gt;cart_class('Handel::Cart');
+    __PACKAGE__-&gt;checkout_class('Handel::Checkout');
+    __PACKAGE__-&gt;storage_class('Handel::Storage::DBIC::Order');
+    __PACKAGE__-&gt;mk_group_accessors('inherited', qw/ccn cctype ccm ccy ccvn ccname ccissuenumber ccstartdate ccenddate/);
+    __PACKAGE__-&gt;create_accessors;
 };
 
-__PACKAGE__-&gt;autoupdate(1);
-__PACKAGE__-&gt;table('orders');
-__PACKAGE__-&gt;iterator_class('Handel::Iterator');
-__PACKAGE__-&gt;columns(All =&gt; qw(id shopper type number created updated comments
-    shipmethod shipping handling tax subtotal total
-    billtofirstname billtolastname billtoaddress1 billtoaddress2 billtoaddress3
-    billtocity billtostate billtozip billtocountry  billtodayphone
-    billtonightphone billtofax billtoemail shiptosameasbillto
-    shiptofirstname shiptolastname shiptoaddress1 shiptoaddress2 shiptoaddress3
-    shiptocity shiptostate shiptozip shiptocountry shiptodayphone
-    shiptonightphone shiptofax shiptoemail)
-);
-__PACKAGE__-&gt;columns(
-    TEMP =&gt; qw(ccn cctype ccm ccy ccvn ccname ccissuenumber ccstartdate ccenddate)
-);
-
-__PACKAGE__-&gt;has_many(_items =&gt; 'Handel::Order::Item', 'orderid');
-__PACKAGE__-&gt;has_a(subtotal  =&gt; 'Handel::Currency');
-__PACKAGE__-&gt;has_a(total     =&gt; 'Handel::Currency');
-__PACKAGE__-&gt;has_a(shipping  =&gt; 'Handel::Currency');
-__PACKAGE__-&gt;has_a(handling  =&gt; 'Handel::Currency');
-__PACKAGE__-&gt;has_a(tax       =&gt; 'Handel::Currency');
-
-__PACKAGE__-&gt;add_constraint('id',       id       =&gt; \&amp;constraint_uuid);
-__PACKAGE__-&gt;add_constraint('shopper',  shopper  =&gt; \&amp;constraint_uuid);
-__PACKAGE__-&gt;add_constraint('type',     type     =&gt; \&amp;constraint_order_type);
-__PACKAGE__-&gt;add_constraint('shipping', shipping =&gt; \&amp;constraint_price);
-__PACKAGE__-&gt;add_constraint('handling', handling =&gt; \&amp;constraint_price);
-__PACKAGE__-&gt;add_constraint('subtotal', subtotal =&gt; \&amp;constraint_price);
-__PACKAGE__-&gt;add_constraint('tax',      tax      =&gt; \&amp;constraint_price);
-__PACKAGE__-&gt;add_constraint('total',    total    =&gt; \&amp;constraint_price);
-
-sub new {
-    my ($self, $data, $process) = @_;
+sub create { ## no critic (ProhibitExcessComplexity)
+    my ($self, $data, $opts) = @_;
 
     throw Handel::Exception::Argument(
-        -details =&gt; translate('Param 1 is not a HASH reference') . '.') unless
-            ref($data) eq 'HASH';
-
-    if (!defined($data-&gt;{'id'}) || !constraint_uuid($data-&gt;{'id'})) {
-        $data-&gt;{'id'} = $self-&gt;uuid;
-    };
+        -details =&gt; translate('PARAM1_NOT_HASHREF')
+    ) unless ref($data) eq 'HASH'; ## no critic
 
-    if (!defined($data-&gt;{'type'})) {
-        $data-&gt;{'type'} = ORDER_TYPE_TEMP;
+    no strict 'refs';
+    my $storage = $opts-&gt;{'storage'};
+    if (!$storage) {
+        $storage = $self-&gt;storage;
     };
 
+    my $process = $opts-&gt;{'process'} || 0;
     my $cart = delete $data-&gt;{'cart'};
-    my $is_uuid = constraint_uuid($cart);
 
     if (defined $cart) {
         throw Handel::Exception::Argument( -details =&gt;
-          translate(
-              'Cart reference is not a HASH reference or Handel::Cart') . '.') unless
-                  (ref($cart) eq 'HASH' or UNIVERSAL::isa($cart, 'Handel::Cart') or $is_uuid);
+          translate('CARTPARAM_NOT_HASH_CART')
+        ) if (
+                (ref($cart) &amp;&amp; !blessed($cart) &amp;&amp; ref($cart) ne 'HASH') ||
+                (blessed($cart) &amp;&amp; !$cart-&gt;isa('Handel::Cart'))
+        ); ## no critic
 
         if (ref $cart eq 'HASH') {
-            $cart = $self-&gt;cart_class-&gt;load($cart, RETURNAS_ITERATOR)-&gt;first;
+            $cart = $self-&gt;cart_class-&gt;search($cart)-&gt;first;
 
             throw Handel::Exception::Order( -details =&gt;
-                translate(
-                    'Could not find a cart matching the supplied search criteria') . '.') unless $cart;
-        } elsif ($is_uuid) {
-            $cart = $self-&gt;cart_class-&gt;load({id =&gt; $cart}, RETURNAS_ITERATOR)-&gt;first;
+                translate('CART_NOT_FOUND')
+            ) unless $cart; ## no critic
+        } elsif (!blessed($cart)) {
+            my ($primary_key) = $self-&gt;cart_class-&gt;storage-&gt;primary_columns;
+
+            $cart = $self-&gt;cart_class-&gt;search({$primary_key =&gt; $cart})-&gt;first;
 
             throw Handel::Exception::Order( -details =&gt;
-                translate(
-                    'Could not find a cart matching the supplied search criteria') . '.') unless $cart;
+                translate('CART_NOT_FOUND')
+            ) unless $cart; ## no critic
         };
 
         throw Handel::Exception::Order( -details =&gt;
-            translate(
-                'Could not create a new order because the supplied cart is empty') . '.') unless
-                    $cart-&gt;count &gt; 0;
+            translate('ORDER_CREATE_FAILED_CART_EMPTY')
+        ) unless $cart-&gt;count &gt; 0; ## no critic
+    };
+
+    if (defined $cart) {
+        if ($cart-&gt;can('shopper') &amp;&amp; !defined $data-&gt;{'shopper'}) {
+            $data-&gt;{'shopper'} = $cart-&gt;shopper;
+        };
     };
 
-    my $order = $self-&gt;insert($data);
+    my $order = $self-&gt;create_instance(
+        $storage-&gt;create($data)
+    );
 
     if (defined $cart) {
         $self-&gt;copy_cart($order, $cart);
@@ -100,14 +81,14 @@ sub new {
     };
 
     if ($process) {
-        my $checkout = Handel::Checkout-&gt;new;
+        my $checkout = $self-&gt;checkout_class-&gt;new;
         $checkout-&gt;order($order);
 
         my $status = $checkout-&gt;process([CHECKOUT_PHASE_INITIALIZE]);
         if ($status == CHECKOUT_STATUS_OK) {
             $checkout-&gt;order-&gt;update;
         } else {
-            $order-&gt;SUPER::delete;
+            $order-&gt;destroy;
             undef $order;
         };
         undef $checkout;
@@ -116,255 +97,200 @@ sub new {
     return $order;
 };
 
-sub cart_class {
-    my ($self, $cart_class) = @_;
-
-    if ($cart_class) {
-        eval &quot;require $cart_class&quot;;
-        $self-&gt;_cart_class($cart_class);
-    };
-
-    return $self-&gt;_cart_class;
-};
-
 sub copy_cart {
     my ($self, $order, $cart) = @_;
 
-    if ($cart-&gt;shopper &amp;&amp; !$order-&gt;shopper) {
-        $order-&gt;shopper($cart-&gt;shopper);
-    };
-
     $order-&gt;subtotal($cart-&gt;subtotal);
     $order-&gt;update;
+
+    return;
 };
 
 sub copy_cart_items {
     my ($self, $order, $cart) = @_;
-    my $items = $cart-&gt;items(undef, RETURNAS_ITERATOR);
 
-    while (my $item = $items-&gt;next) {
-        my %copy;
-
-        foreach (Handel::Cart::Item-&gt;columns) {
-            next if $_ =~ /^(id|cart)$/i;
-            $copy{$_} = $item-&gt;$_;
-        };
-
-        $copy{'id'} = $self-&gt;uuid unless Handel::Constraints::constraint_uuid($copy{'id'});
-        $copy{'orderid'} = $order-&gt;id;
-        $copy{'total'} = $copy{'quantity'}*$copy{'price'};
-
-        $order-&gt;add_to__items(\%copy);
+    foreach my $item ($cart-&gt;items) {
+        $order-&gt;add($item);
     };
+
+    return;
 };
 
 sub add {
     my ($self, $data) = @_;
 
     throw Handel::Exception::Argument( -details =&gt;
-      translate(
-          'Param 1 is not a HASH reference, Handel::Cart::Item or Handel::Order::Item') . '.') unless
-              (ref($data) eq 'HASH' or $data-&gt;isa('Handel::Order::Item') or $data-&gt;isa('Handel::Cart::Item'));
+      translate('PARAM1_NOT_HASH_CARTITEM_ORDERITEM')
+    ) unless (ref($data) eq 'HASH' || $data-&gt;isa('Handel::Order::Item') || $data-&gt;isa('Handel::Cart::Item')); ## no critic
 
-    if (ref($data) eq 'HASH') {
-        if (!defined($data-&gt;{'id'}) || !constraint_uuid($data-&gt;{'id'})) {
-            $data-&gt;{'id'} = $self-&gt;uuid;
-        };
+    my $result = $self-&gt;result;
+    my $storage = $result-&gt;storage;
 
-        return $self-&gt;add_to__items($data);
+    if (ref($data) eq 'HASH') {
+        return $self-&gt;item_class-&gt;create_instance(
+            $result-&gt;add_item($data)
+        );
     } else {
         my %copy;
 
-        foreach ($data-&gt;columns) {
-            next if $_ =~ /^(id|orderid|cart)$/i;
-            $copy{$_} = $data-&gt;$_;
-        };
-        if (UNIVERSAL::isa($data, 'Handel::Cart::Item')) {
-            $copy{'total'} = $data-&gt;total;
+        foreach ($storage-&gt;copyable_item_columns) {
+            if ($data-&gt;can($_)) {
+                $copy{$_} = $data-&gt;$_;
+            } elsif ($data-&gt;result-&gt;can($_)) {
+                $copy{$_} = $data-&gt;result-&gt;$_;
+            };
         };
 
-        $copy{'id'} = $self-&gt;uuid;
-
-        return $self-&gt;add_to__items(\%copy);
+        return $self-&gt;item_class-&gt;create_instance(
+            $result-&gt;add_item(\%copy)
+        );
     };
 };
 
 sub clear {
     my $self = shift;
 
-    $self-&gt;_items-&gt;delete_all;
-
-    return undef;
+    return $self-&gt;result-&gt;delete_items;
 };
 
 sub count {
     my $self  = shift;
 
-    return $self-&gt;_items-&gt;count || 0;
+    return $self-&gt;result-&gt;count_items;
 };
 
 sub delete {
     my ($self, $filter) = @_;
 
     throw Handel::Exception::Argument( -details =&gt;
-        translate('Param 1 is not a HASH reference') . '.') unless
-            ref($filter) eq 'HASH';
+        translate('PARAM1_NOT_HASHREF')
+    ) unless ref($filter) eq 'HASH'; ## no critic
 
-    ## I'd much rather use $self-&gt;_items-&gt;search_like, but it doesn't work that
-    ## way yet. This should be fine as long as :weaken refs works.
-    return $self-&gt;item_class-&gt;search_like(%{$filter},
-        orderid =&gt; $self-&gt;id)-&gt;delete_all;
+    return $self-&gt;result-&gt;delete_items($filter);
 };
 
 sub destroy {
-    my ($self, $filter) = @_;
+    my ($self, $filter, $opts) = @_;
 
-    if (ref $self) {
-        $self-&gt;SUPER::delete;
+    if (blessed $self &amp;&amp; !defined $filter) {
+        my $result = $self-&gt;result-&gt;delete;
+        if ($result) {
+            undef ($self);
+        };
+        return $result;
     } else {
         throw Handel::Exception::Argument( -details =&gt;
-            translate('Param 1 is not a HASH reference') . '.') unless
-                ref($filter) eq 'HASH';
+            translate('PARAM1_NOT_HASHREF')
+        ) unless ref($filter) eq 'HASH'; ## no critic
 
-        my $orders = $self-&gt;load($filter, RETURNAS_ITERATOR);
-        while (my $order = $orders-&gt;next) {
-            $order-&gt;clear;
-            $order-&gt;SUPER::delete;
+        no strict 'refs';
+        my $storage = $opts-&gt;{'storage'};
+        if (!$storage) {
+            $storage = $self-&gt;storage;
         };
-    };
-
-    return;
-};
-
-sub item_class {
-    my ($class, $item_class) = @_;
-
-    if ($item_class) {
-        eval &quot;require $item_class&quot;;
 
-        require version;
-        my $cdbiver = version-&gt;new(Class::DBI-&gt;VERSION);
-
-        if ($cdbiver-&gt;numify &lt; 3.000008) {
-            undef(*_items);
-            undef(*add_to__items);
-            __PACKAGE__-&gt;has_many(_items =&gt; $item_class, 'orderid');
-        } else {
-            $class-&gt;has_many(_items =&gt; $item_class, 'orderid');
-        };
-    } else {
-        return $class-&gt;_item_class;
+        return $storage-&gt;delete($filter);
     };
 };
 
 sub items {
-    my ($self, $filter, $wantiterator) = @_;
+    my ($self, $filter, $opts) = @_;
+    my $result = $self-&gt;result;
+    my $storage = $result-&gt;storage;
+
+    $filter ||= {};
+    $opts ||= {};
 
     throw Handel::Exception::Argument( -details =&gt;
-        translate('Param 1 is not a HASH reference') . '.') unless(
-            ref($filter) eq 'HASH' or !$filter);
+        translate('PARAM1_NOT_HASHREF')
+    ) unless ref($filter) eq 'HASH'; ## no critic
 
-    $wantiterator ||= RETURNAS_AUTO;
-    $filter       ||= {};
+    throw Handel::Exception::Argument( -details =&gt;
+        translate('PARAM2_NOT_HASHREF')
+    ) unless ref($opts) eq 'HASH'; ## no critic
 
-    my $wildcard = Handel::DBI::has_wildcard($filter);
+    my $results = $result-&gt;search_items($filter, $opts);
+    my $iterator = $self-&gt;item_class-&gt;result_iterator_class-&gt;new({
+        data         =&gt; $results,
+        result_class =&gt; $self-&gt;item_class
+    });
 
-    ## If the filter as a wildcard, push it through a fresh search_like since it
-    ## doesn't appear to be available within a loaded object.
-    if ((wantarray &amp;&amp; $wantiterator != RETURNAS_ITERATOR) || $wantiterator == RETURNAS_LIST) {
-        my @items = $wildcard ?
-            $self-&gt;item_class-&gt;search_like(%{$filter}, orderid =&gt; $self-&gt;id) :
-            $self-&gt;_items(%{$filter});
+    return wantarray ? $iterator-&gt;all : $iterator;
+};
 
-        return @items;
-    } elsif ($wantiterator == RETURNAS_ITERATOR) {
-        my $iterator = $wildcard ?
-            $self-&gt;item_class-&gt;search_like(%{$filter}, orderid =&gt; $self-&gt;id) :
-            $self-&gt;_items(%{$filter});
+sub search {
+    my ($self, $filter, $opts) = @_;
+    my $class = blessed $self ? blessed $self : $self;
 
-        return $iterator;
-    } else {
-        my $iterator = $wildcard ?
-            $self-&gt;item_class-&gt;search_like(%{$filter}, orderid =&gt; $self-&gt;id) :
-            $self-&gt;_items(%{$filter});
-        if ($iterator-&gt;count == 1 &amp;&amp; $wantiterator != RETURNAS_ITERATOR &amp;&amp; $wantiterator != RETURNAS_LIST) {
-            return $iterator-&gt;next;
-        } else {
-            return $iterator;
-        };
-    };
-};
+    $filter ||= {};
+    $opts ||= {};
 
-sub load {
-    my ($self, $filter, $wantiterator) = @_;
+    throw Handel::Exception::Argument( -details =&gt;
+        translate('PARAM1_NOT_HASHREF')
+    ) unless ref($filter) eq 'HASH'; ## no critic
 
     throw Handel::Exception::Argument( -details =&gt;
-        translate('Param 1 is not a HASH reference') . '.') unless(
-            ref($filter) eq 'HASH' or !$filter);
-
-    $wantiterator ||= RETURNAS_AUTO;
-
-    ## only return array if wantarray and not explicitly asking for an iterator
-    ## or we've explicitly asked for a list/array
-    if ((wantarray &amp;&amp; $wantiterator != RETURNAS_ITERATOR) || $wantiterator == RETURNAS_LIST) {
-        my @orders = $filter ? $self-&gt;search_like(%{$filter}) :
-            $self-&gt;retrieve_all;
-        return @orders;
-    ## return an iterator if explicitly asked for
-    } elsif ($wantiterator == RETURNAS_ITERATOR) {
-        my $iterator = $filter ?
-            $self-&gt;search_like(%{$filter}) : $self-&gt;retrieve_all;
-
-        return $iterator;
-    ## full out auto
-    } else {
-        my $iterator = $filter ?
-            $self-&gt;search_like(%{$filter}) : $self-&gt;retrieve_all;
+        translate('PARAM2_NOT_HASHREF')
+    ) unless ref($opts) eq 'HASH'; ## no critic
 
-        if ($iterator-&gt;count == 1 &amp;&amp; $wantiterator != RETURNAS_ITERATOR &amp;&amp; $wantiterator != RETURNAS_LIST) {
-            return $iterator-&gt;next;
-        } else {
-            return $iterator;
-        };
+    my $storage = delete $opts-&gt;{'storage'};
+    if (!$storage) {
+        $storage = $self-&gt;storage;
     };
+
+    my $results = $storage-&gt;search($filter, $opts);
+    my $iterator = $self-&gt;result_iterator_class-&gt;new({
+        data         =&gt; $results,
+        result_class =&gt; $class
+    });
+
+    return wantarray ? $iterator-&gt;all : $iterator;
+};
+
+sub save {
+    my $self = shift;
+    $self-&gt;type(ORDER_TYPE_SAVED);
+
+    return;
 };
 
 sub reconcile {
     my ($self, $cart) = @_;
 
-    my $is_uuid = constraint_uuid($cart);
-
-    if (defined $cart) {
-        throw Handel::Exception::Argument( -details =&gt;
-          translate(
-              'Cart reference is not a HASH reference or Handel::Cart') . '.') unless
-                  (ref($cart) eq 'HASH' or UNIVERSAL::isa($cart, 'Handel::Cart') or $is_uuid);
+    throw Handel::Exception::Argument( -details =&gt;
+      translate('CARTPARAM_NOT_HASH_CART')
+    ) if ( ## no critic
+            (ref($cart) &amp;&amp; !blessed($cart) &amp;&amp; ref($cart) ne 'HASH') ||
+            (blessed($cart) &amp;&amp; !$cart-&gt;isa('Handel::Cart'))
+    );
 
-        if (ref $cart eq 'HASH') {
-            $cart = $self-&gt;cart_class-&gt;load($cart, RETURNAS_ITERATOR)-&gt;first;
+    if (ref $cart eq 'HASH') {
+        $cart = $self-&gt;cart_class-&gt;search($cart)-&gt;first;
 
-            throw Handel::Exception::Order( -details =&gt;
-                translate(
-                    'Could not find a cart matching the supplied search criteria') . '.') unless $cart;
-        } elsif ($is_uuid) {
-            $cart = $self-&gt;cart_class-&gt;load({id =&gt; $cart}, RETURNAS_ITERATOR)-&gt;first;
+        throw Handel::Exception::Order( -details =&gt;
+            translate('CART_NOT_FOUND')
+        ) unless $cart; ## no critic
+    } elsif (!blessed($cart)) {
+        my ($primary_key) = $self-&gt;cart_class-&gt;storage-&gt;primary_columns;
 
-            throw Handel::Exception::Order( -details =&gt;
-                translate(
-                    'Could not find a cart matching the supplied search criteria') . '.') unless $cart;
-        };
+        $cart = $self-&gt;cart_class-&gt;search({$primary_key =&gt; $cart})-&gt;first;
 
         throw Handel::Exception::Order( -details =&gt;
-            translate(
-                'Could not create a new order because the supplied cart is empty') . '.') unless
-                    $cart-&gt;count &gt; 0;
+            translate('CART_NOT_FOUND')
+        ) unless $cart; ## no critic
     };
 
+    throw Handel::Exception::Order( -details =&gt;
+        translate('ORDER_CREATE_FAILED_CART_EMPTY')
+    ) unless $cart-&gt;count &gt; 0; ## no critic
+
     if ($self-&gt;subtotal != $cart-&gt;subtotal || $self-&gt;count != $cart-&gt;count) {
         $self-&gt;clear;
         $self-&gt;copy_cart($self, $cart);
         $self-&gt;copy_cart_items($self, $cart);
     };
+
+    return;
 };
 
 1;
@@ -376,10 +302,12 @@ Handel::Order - Module for maintaining order contents
 
 =head1 SYNOPSIS
 
-    my $order = Handel::Order-&gt;new({
+    use Handel::Order;
+    
+    my $order = Handel::Order-&gt;create({
         id =&gt; '12345678-9098-7654-322-345678909876'
     });
-
+    
     my $iterator = $order-&gt;items;
     while (my $item = $iterator-&gt;next) {
         print $item-&gt;sku;
@@ -389,54 +317,40 @@ Handel::Order - Module for maintaining order contents
 
 =head1 DESCRIPTION
 
-C&lt;Handel::Order&gt; is a component for maintaining simple order records.
-
-While C&lt;Handel::Order&gt; subclasses L&lt;Class::DBI&gt;, it is strongly recommended that
-you not use its methods unless it's absolutely necessary. Stick to the
-documented methods here and you'll be safe should I decide to implement some
-other data access mechanism. :-)
+Handel::Order is a component for maintaining simple order records.
 
 =head1 CONSTRUCTOR
 
-There are three ways to create a new order object. You can either pass a hashref
-into C&lt;new&gt; containing all the required values needed to create a new order
-record or pass a hashref into C&lt;load&gt; containing the search criteria to use
-to load an existing order or set of orders.
+=head2 create
 
-B&lt;BREAKING API CHANGE:&gt; Starting in version 0.17_04, new no longer automatically
-creates a checkout process for C&lt;CHECKOUT_PHASE_INITIALIZE&gt;. The C&lt;$noprocess&gt;
-parameter has been renamed to C&lt;$process&gt;. The have the new order automatically
-run a checkout process, set $process to 1.
+=over
 
-B&lt;NOTE:&gt; Starting in version 0.17_02, the cart is no longer required! You can
-create an order record that isn't associated with a current cart.
+=item Arguments: \%data [, \%options]
 
-B&lt;NOTE:&gt; As of version 0.17_02, Order::subtotal and Order::Item:: total are
-calculated once B&lt;only&gt; when creating an order from an existing cart. After that
-order is created, any changes to items price/wuantity/totals and the orders subtotals
-must be calculated manually and put into the database by the user though their methods.
+=back
 
-If the cart key is passed, a new order record will be created from the specified
-carts contents. The cart key can be a cart id (uuid), a cart object, or a has reference
-contain the search criteria to load matching carts.
+Creates a new order object containing the specified data.
 
-=over
+If the cart key is passed, a new order record will be created from the specified
+carts contents. The cart key can be a cart primary key value, a cart object,
+or a hash reference contain the search criteria to load matching carts.
 
-=item C&lt;Handel::Order-E&lt;gt&gt;new(\%data [, $process])&gt;
+By default, new will use Handel::Cart to load the specified cart, unless you
+have set C&lt;cart_class&gt; to use another class.
 
-    my $order = Handel::Order-&gt;new({
+    my $order = Handel::Order-&gt;create({
         shopper =&gt; '10020400-E260-11CF-AE68-00AA004A34D5',
         id =&gt; '111111111-2222-3333-4444-555566667777',
         cart =&gt; $cartobject
     });
-
-    my $order = Handel::Order-&gt;new({
+    
+    my $order = Handel::Order-&gt;create({
         shopper =&gt; '10020400-E260-11CF-AE68-00AA004A34D5',
         id =&gt; '111111111-2222-3333-4444-555566667777',
         cart =&gt; '11112222-3333-4444-5555-666677778888'
     });
-
-    my $order = Handel::Order-&gt;new({
+    
+    my $order = Handel::Order-&gt;create({
         shopper =&gt; '10020400-E260-11CF-AE68-00AA004A34D5',
         id =&gt; '111111111-2222-3333-4444-555566667777',
         cart =&gt; {
@@ -445,48 +359,36 @@ contain the search criteria to load matching carts.
         }
     });
 
-=item C&lt;Handel::Order-E&lt;gt&gt;load([\%filter, $wantiterator])&gt;
-
-    my $order = Handel::Order-&gt;load({
-        id =&gt; 'D597DEED-5B9F-11D1-8DD2-00AA004ABD5E'
-    });
-
-You can also omit \%filter to load all available orders.
+The following options are available:
 
-    my @orders = Handel::Order-&gt;load();
+=over
 
-In scalar context C&lt;load&gt; returns a C&lt;Handel::Order&gt; object if there is a single
-result, or a L&lt;Handel::Iterator&gt; object if there are multiple results. You can
-force C&lt;load&gt; to always return an iterator even if only one cart exists by
-setting the C&lt;$wantiterator&gt; parameter to C&lt;RETURNAS_ITERATOR&gt;.
+=item process
 
-    my $iterator = Handel::Order-&gt;load(undef, RETURNAS_ITERATOR);
-    while (my $item = $iterator-&gt;next) {
-        print $item-&gt;sku;
-    };
+When true, the newly created order will be run through the
+C&lt;CHECKOUT_PHASE_INITIALIZE&gt; process before it is returned.
 
-See L&lt;Handel::Constants&gt; for the available C&lt;RETURNAS&gt; options.
+=item storage
 
-A C&lt;Handel::Exception::Argument&gt; exception is thrown if the first parameter is
-not a hashref.
+A storage object to use to create a new order object. Currently, this storage
+object B&lt;must&gt; have the same columns as the default storage object for the
+current order class.
 
 =back
 
 =head1 METHODS
 
-=head2 add(\%data)
+=head2 add
 
-You can add items to the order by supplying a hashref containing the
-required name/values or by passing in a newly create Handel::Order::Item
-object. If successful, C&lt;add&gt; will return a L&lt;Handel::Order::Item&gt; object
-reference.
+=over
 
-Yes, I know. Why a hashref and not just a hash? So I can add new params
-later if need be. Oh yeah, and &quot;Because I Can&quot;. :-P
+=item Arguments: \%data | $item
 
-=over
+=back
 
-=item C&lt;$cart-E&lt;gt&gt;add(\%data)&gt;
+Adds a new item to the current order and returns an instance of the item class
+specified in order object storage. You can either pass the item data as a hash
+reference:
 
     my $item = $cart-&gt;add({
         shopper  =&gt; '10020400-E260-11CF-AE68-00AA004A34D5',
@@ -495,43 +397,94 @@ later if need be. Oh yeah, and &quot;Because I Can&quot;. :-P
         price    =&gt; 1.25
     });
 
-=item C&lt;$cart-E&lt;gt&gt;add($object)&gt;
+or pass an existing item:
 
-    my $item = Handel::Cart::Item-&gt;new({
-        sku      =&gt; 'SKU1234',
-        quantity =&gt; 1,
-        price    =&gt; 1.25
-    });
-    ...
-    $cart-&gt;add($item);
+    $order-&gt;add(
+        $cart-&gt;items-&gt;first
+    );
+
+When passing an existing cart/order item to add, all columns in the source item
+will be copied into the destination item if the column exists in both the
+destination and source, and the column isn't the primary key or the foreign
+key of the item relationship.
 
 A C&lt;Handel::Exception::Argument&gt; exception is thrown if the first parameter
-isn't a hashref or a C&lt;Handel::Cart::Item&gt; object.
+isn't a hashref or an object that subclasses Handel::Cart::Item.
+
+=head2 cart_class
+
+=over
+
+=item Arguments: $order_class
 
 =back
 
+Gets/sets the name of the class to use when loading existing cart into the
+new order. By default, it loads carts using Handel::Cart. While you can set this
+directly in your application, it's best to set it in a custom subclass of
+Handel::Order.
+
+    package CustomOrder;
+    use strict;
+    use warnings;
+    use base qw/Handel::Order/;
+    __PACKAGE__-&gt;cart_class('CustomCart');
+
+=head2 checkout_class
+
+=over
+
+=item Arguments: $checkout_class
+
+=back
+
+Gets/sets the name of the checkout class to use when processing the new order
+through the INITIALIZE phase if the C&lt;process&gt; flag is on. By default, it uses
+Handel::Checkout. While you can set this directly in your application, it's best
+to set it in a custom subclass of Handel::Order.
+
+    package CustomOrder;
+    use strict;
+    use warnings;
+    use base qw/Handel::Order/;
+    __PACKAGE__-&gt;checkout_class('CustomCheckout');
+
 =head2 clear
 
-This method removes all items from the current cart object.
+Deletes all items from the current order.
 
     $cart-&gt;clear;
 
+=head2 count
+
+Returns the number of items in the order object.
+
+    my $numitems = $order-&gt;count;
+
 =head2 copy_cart
 
+=over
+
+=item Arguments: $order, $cart
+
+=back
+
 When creating a new order from an existing cart, C&lt;copy_cart&gt; will be called to
 copy the carts contents into the new order object. If you are using custom cart
 or order subclasses, the default copy_cart will only copy the fields declared in
 Handel::Cart, ignoring any custom fields you may add.
 
-To fix this, simply subclass Handel::Order and override copy_cart. As its
+To fix this, simply subclass Handel::Order and override C&lt;copy_cart&gt;. As its
 parameters, it will receive the order and cart objects.
 
     package CustomOrder;
-    use base 'Handel::Order';
-
+    use strict;
+    use warnings;
+    use base qw/Handel::Order/;
+    
     sub copy_cart {
         my ($self, $order, $cart) = @_;
-
+    
         # copy stock fields
         $self-&gt;SUPER::copy_cart($order, $cart);
 
@@ -541,126 +494,180 @@ parameters, it will receive the order and cart objects.
 
 =head2 copy_cart_items
 
+=over
+
+=item Arguments: $order, $cart
+
+=back
+
 When creating a new order from an existing cart, C&lt;copy_cart_items&gt; will be
-called to copy the cart items into the new order object items. If you are using
-custom cart or order subclasses, the default copy_cart_item will only copy the
-fields declared in Handel::Cart::Item, ignoring any custom fields you may add.
+called to copy the cart items into the new order object. If you are using
+custom cart or order subclasses, the default C&lt;copy_cart_item&gt; will only copy
+the fields that in both the cart item and the order item schemas.
 
-To fix this, simply subclass Handel::Order and override copy_cart. As its
+To fix this, simply subclass Handel::Order and override C&lt;copy_cart&gt;. As its
 parameters, it will receive the order and cart objects.
 
     package CustomOrder;
-    use base 'Handel::Order';
-
+    use strict;
+    use warnings;
+    use base qw/Handel::Order/;
+    
     __PACKAGE__-&gt;cart_class('CustomCart');
-
+    
     sub copy_cart_items {
         my ($self, $order, $cart) = @_;
         my $items = $cart-&gt;items(undef, RETURNAS_ITERATOR);
-
+    
         while (my $item = $items-&gt;next) {
             my %copy;
-
+    
             foreach (CustomCart::Item-&gt;columns) {
                 next if $_ =~ /^(id|cart)$/i;
                 $copy{$_} = $item-&gt;$_;
             };
-
+    
             $copy{'id'} = $self-&gt;uuid unless constraint_uuid($copy{'id'});
             $copy{'orderid'} = $order-&gt;id;
             $copy{'total'} = $copy{'quantity'}*$copy{'price'};
-
+    
             $order-&gt;add_to__items(\%copy);
         };
     };
 
-=head2 delete(\%filter)
+=head2 delete
 
-This method deletes the order item(s) matching the supplied filter values and
-returns the number of items deleted.
+=over
 
-    if ( $cart-&gt;delete({id =&gt; '8D4B0BE1-C02E-11D2-A33D-00A0C94B8D0E'}) ) {
-        print 'Item deleted';
-    };
+=item Arguments: \%filter
 
-=head2 destroy(\%filter)
+=back
 
-When called used as an instance method, this will delete all items from the
-current cart instance and delete the cart container. C&lt;filter&gt; will be ignored.
+Deletes the item matching the supplied filter from the current order.
 
-When called as a package method, this will delete all carts matching C&lt;filter&gt;.
-A Handel::Exception::Argument exception will be thrown is C&lt;filter&gt; is not a
-HASH reference.
+    $order-&gt;delete({
+        sku =&gt; 'ABC-123'
+    });
 
-=head2 cart_class($orderclass)
+=head2 destroy
 
-Gets/Sets the name of the class to use when loading existing cart into the
-new order. By default, it loads carts using Handel::Cart. While you can set this
-directly in your application, it's best to set it in a custom subclass of
-Handel::Order.
+=over
 
-    package CustomOrder;
-    use base 'Handel::Order';
-    __PACKAGE__-&gt;cart_class('CustomCart');
+=item Arguments: \%filter
 
-=head2 item_class($classname)
+=back
 
-Gets/Sets the name of the class to be used when returning or creating order items.
-While you can set this directly in your application, it's best to set it
-in a custom subclass of Handel::Order.
+Deletes entire orders (and their items) from the database. When called
+as an object method, this will delete all items from the current order object
+and deletes the order object itself. C&lt;filter&gt; will be ignored.
 
-    package CustomOrder;
-    use strict;
-    use warnings;
-    use base 'Handel::Order';
+    $order-&gt;destroy;
 
-    __PACKAGE__-&gt;item_class('CustomOrder::CustomItem';
+When called as a class method, this will delete all orders matching C&lt;filter&gt;.
 
-    1;
+    Handel::Order-&gt;destroy({
+        shopper =&gt; 'D597DEED-5B9F-11D1-8DD2-00AA004ABD5E'
+    });
+
+A L&lt;Handel::Exception::Argument|Handel::Exception::Argument&gt; exception will be
+thrown if C&lt;filter&gt; is not a HASH reference.
+
+=head2 items
+
+=over
 
-=head2 items([\%filter, [$wantiterator])
+=item Arguments: \%filter [, \%options]
 
-You can retrieve all or some of the items contained in the order via the C&lt;items&gt;
-method. In a scalar context, items returns an iterator object which can be used
-to cycle through items one at a time. In list context, it will return an array
-containing all items.
+=back
+
+Loads the current orders items matching the specified filter and returns a
+L&lt;Handel::Iterator|Handel::Iterator&gt; in scalar context, or a list of items in
+list context.
 
     my $iterator = $order-&gt;items;
     while (my $item = $iterator-&gt;next) {
         print $item-&gt;sku;
     };
-
+    
     my @items = $order-&gt;items;
-    ...
-    dosomething(\@items);
-
-When filtering the items in the order in scalar context, a
-C&lt;Handel::Order::Item&gt; object will be returned if there is only one result. If
-there are multiple results, a Handel::Iterator object will be returned
-instead. You can force C&lt;items&gt; to always return a C&lt;Handel::Iterator&gt; object
-even if only one item exists by setting the $wantiterator parameter to
-C&lt;RETURNAS_ITERATOR&gt;.
-
-    my $item = $order-&gt;items({sku =&gt; 'SKU1234'}, RETURNAS_ITERATOR);
-    if ($item-&gt;isa('Handel::Order::Item)) {
-        print $item-&gt;sku;
-    } else {
-        while ($item-&gt;next) {
-            print $_-&gt;sku;
-        };
+
+By default, the items returned as Handel::Order::Item objects. To return
+something different, set C&lt;item_class&gt; in the local C&lt;storage&gt; object.
+
+The following options are available:
+
+=over
+
+=item order_by
+
+Order the items by the column(s) and order specified. This option uses the SQL
+style syntax:
+
+    my $items = $order-&gt;items(undef, {order_by =&gt; 'sku ASC'});
+
+=back
+
+A L&lt;Handel::Exception::Argument|Handel::Exception::Argument&gt; exception is
+thrown if parameter one isn't a hashref or undef.
+
+=head2 search
+
+=over
+
+=item Arguments: \%filter [, \%options]
+
+=back
+
+Loads existing orders matching the specified filter and returns a
+L&lt;Handel::Iterator|Handel::Iterator&gt; in scalar context, or a list of orders in
+list context.
+
+    my $iterator = Handel::Order-&gt;search({
+        shopper =&gt; 'D597DEED-5B9F-11D1-8DD2-00AA004ABD5E',
+        type    =&gt; ORDER_TYPE_SAVED
+    });
+    
+    while (my $order = $iterator-&gt;next) {
+        print $order-&gt;id;
     };
+    
+    my @orders = Handel::Orders-&gt;search();
+
+The following options are available:
+
+=over
+
+=item storage
 
-See the C&lt;RETURNAS&gt; constants in L&lt;Handel::Constants&gt; for other options.
+A storage object to use to load order objects. Currently, this storage
+object B&lt;must&gt; have the same columns as the default storage object for the
+current order class.
+
+=item order_by
+
+Order the items by the column(s) and order specified. This option uses the SQL
+style syntax:
+
+    my $orders = Handel::Order-&gt;search(undef, {order_by =&gt; 'updated DESC'});
+
+=back
 
-In list context, filtered items return an array of items just as when items is
-called without a filter specified.
+A L&lt;Handel::Exception::Argument|Handel::Exception::Argument&gt; exception is
+thrown if the first parameter is not a hashref.
 
-    my @items - $order-&gt;items((sku -&gt; 'SKU1%'});
+=head2 save
 
-A C&lt;Handel::Exception::Argument&gt; exception is thrown if parameter one isn't a
-hashref or undef.
+Marks the current order type as C&lt;ORDER_TYPE_SAVED&gt;.
 
-=head2 reconcile($cart)
+    $order-&gt;save
+
+=head2 reconcile
+
+=over
+
+=item Arguments: $cart_id | $cart | \%filter
+
+=back
 
 This method copies the specified carts items into the order only if the item
 count or the subtotal differ.
@@ -668,233 +675,796 @@ count or the subtotal differ.
 The cart key can be a cart id (uuid), a cart object, or a hash reference
 contain the search criteria to load matching carts.
 
+    $order-&gt;reconcile('11111111-1111-1111-1111-111111111111');
+    $order-&gt;reconcile({name =&gt; 'My Cart'});
+    
+    my $cart = Handel::Cart-&gt;search({
+        id =&gt; '11111111-1111-1111-1111-111111111111'
+    })-&gt;first;
+    $order-&gt;reconcile($cart);
+
+By default, new will use Handel::Cart to load the specified cart, unless you
+have set C&lt;cart_class&gt;on in the local &lt;storage&gt; object to use another class.
+
+=head1 COLUMNS
+
+The following methods are mapped to columns in the default order schema. These
+methods may or may not be available in any subclasses, or in situations where
+a custom schema is being used that has different column names.
+
+=head2 id
+
+Returns the id of the current order.
+
+    print $order-&gt;id;
+
+See L&lt;Handel::Schema::Order/id&gt; for more information about this column.
+
+=head2 shopper
+
+=over
+
+=item Arguments: $shopper
+
+=back
+
+Gets/sets the id of the shopper the order should be associated with.
+
+    $order-&gt;shopper('11111111-1111-1111-1111-111111111111');
+    print $order-&gt;shopper;
+
+See L&lt;Handel::Schema::Order/shopper&gt; for more information about this column.
+
+=head2 type
+
+=over
+
+=item Arguments: $type
+
+=back
+
+Gets/sets the type of the current order. Currently the two types allowed are:
+
+=over
+
+=item C&lt;ORDER_TYPE_TEMP&gt;
+
+The order is temporary and may be purged during any [external] cleanup process
+after the designated amount of inactivity.
+
+=item C&lt;ORDER_TYPE_SAVED&gt;
+
+The order should be left untouched by any cleanup process and is available to
+the shopper at any time.
+
+=back
+
+    $order-&gt;type(ORDER_TYPE_SAVED);
+    print $order-&gt;type;
+
+See L&lt;Handel::Schema::Order/type&gt; for more information about this column.
+
+=head2 number
+
+=over
+
+=item Arguments: $number
+
+=back
+
+Gets/sets the order number.
+
+    $order-&gt;number(1015275);
+    print $order-&gt;number;
+
+See L&lt;Handel::Schema::Order/number&gt; for more information about this column.
+
+=head2 created
+
+=over
+
+=item $datetime
+
+=back
+
+Gets/sets the date/time when the order was created. The date is returned as a
+stringified L&lt;DateTime|DateTime&gt; object.
+
+    $order-&gt;created('2006-04-11T12:34:65');
+    print $order-&gt;created;
+
+See L&lt;Handel::Schema::Order/created&gt; for more information about this column.
+
+=head2 updated
+
+=over
+
+=item $datetime
+
+=back
+
+Gets/sets the date/time when the order was last updated. The date is returned
+as a stringified L&lt;DateTime|DateTime&gt; object.
+
+    $order-&gt;updated('2006-04-11T12:34:65');
+    print $order-&gt;updated;
+
+See L&lt;Handel::Schema::Order/updated&gt; for more information about this column.
+
+=head2 comments
+
+=over
+
+=item $comments
+
+=back
+
+Gets/sets the comments for this order.
+
+    $order-&gt;comments('Handel with care');
+    print $order-&gt;comments;
+
+See L&lt;Handel::Schema::Order/comments&gt; for more information about this column.
+
+=head2 shipmethod
+
+=over
+
+=item $shipmethod
+
+=back
+
+Gets/sets the shipping method for this order.
+
+    $order-&gt;shipmethod('UPS 2nd Day');
+    print $order-&gt;shipmethod;
+
+See L&lt;Handel::Schema::Order/shipmethod&gt; for more information about this column.
+
+=head2 shipping
+
+=over
+
+=item Arguments: $price
+
+=back
+
+Gets/sets the shipping cost for the order item. The price is returned as a
+stringified L&lt;Handel::Currency|Handel::Currency&gt; object.
+
+    $item-&gt;shipping(12.95);
+    print $item-&gt;shipping;
+    print $item-&gt;shipping-&gt;format;
+
+See L&lt;Handel::Schema::Order/shipping&gt; for more information about this column.
+
+=head2 handling
+
+=over
+
+=item Arguments: $price
+
+=back
+
+Gets/sets the handling cost for the order item. The price is returned as a
+stringified L&lt;Handel::Currency|Handel::Currency&gt; object.
+
+    $item-&gt;handling(12.95);
+    print $item-&gt;handling;
+    print $item-&gt;handling-&gt;format;
+
+See L&lt;Handel::Schema::Order/handling&gt; for more information about this column.
+
+=head2 tax
+
+=over
+
+=item Arguments: $price
+
+=back
+
+Gets/sets the tax for the order item. The price is returned as a
+stringified L&lt;Handel::Currency|Handel::Currency&gt; object.
+
+    $item-&gt;tax(12.95);
+    print $item-&gt;tax;
+    print $item-&gt;tax-&gt;format;
+
+See L&lt;Handel::Schema::Order/tax&gt; for more information about this column.
+
+=head2 subtotal
+
+=over
+
+=item Arguments: $price
+
+=back
+
+Gets/sets the subtotal for the order item. The price is returned as a
+stringified L&lt;Handel::Currency|Handel::Currency&gt; object.
+
+    $item-&gt;subtotal(12.95);
+    print $item-&gt;subtotal;
+    print $item-&gt;subtotal-&gt;format;
+
+See L&lt;Handel::Schema::Order/subtotal&gt; for more information about this column.
+
+=head2 total
+
+=over
+
+=item Arguments: $price
+
+=back
+
+Gets/sets the total for the order item. The price is returned as a
+stringified L&lt;Handel::Currency|Handel::Currency&gt; object.
+
+    $item-&gt;total(12.95);
+    print $item-&gt;total;
+    print $item-&gt;total-&gt;format;
+
+See L&lt;Handel::Schema::Order/total&gt; for more information about this column.
+
 =head2 billtofirstname
 
-Gets/sets the bill to first name
+=over
+
+=item Arguments: $firstname
+
+=back
+
+Gets/sets the bill to first name.
+
+    $order-&gt;billtofirstname('Chistopher');
+    print $order-&gt;billtofirstname;
+
+See L&lt;Handel::Schema::Order/billtofirstname&gt; for more information about this
+column.
 
 =head2 billtolastname
 
+=over
+
+=item Arguments: $lastname
+
+=back
+
 Gets/sets the bill to last name
 
+    $order-&gt;billtolastname('Chistopher');
+    print $order-&gt;billtolastname;
+
+See L&lt;Handel::Schema::Order/billtolastname&gt; for more information about this
+column.
+
 =head2 billtoaddress1
 
+=over
+
+=item Arguments: $address1
+
+=back
+
 Gets/sets the bill to address line 1
 
+    $order-&gt;billtoaddress1('1234 Main Street');
+    print $order-&gt;billtoaddress1;
+
+See L&lt;Handel::Schema::Order/billtoaddress1&gt; for more information about this
+column.
+
 =head2 billtoaddress2
 
+=over
+
+=item Arguments: $address2
+
+=back
+
 Gets/sets the bill to address line 2
 
+    $order-&gt;billtoaddress2('Suite 34b');
+    print $order-&gt;billtoaddress2;
+
+See L&lt;Handel::Schema::Order/billtoaddress2&gt; for more information about this
+column.
+
+
 =head2 billtoaddress3
 
+=over
+
+=item Arguments: $address3
+
+=back
+
 Gets/sets the bill to address line 3
 
+    $order-&gt;billtoaddress3('Floor 5');
+    print $order-&gt;billtoaddress3;
+
+See L&lt;Handel::Schema::Order/billtoaddress3&gt; for more information about this
+column.
+
 =head2 billtocity
 
+=over
+
+=item Arguments: $city
+
+=back
+
 Gets/sets the bill to city
 
+    $order-&gt;billtocity('Smallville');
+    print $order-&gt;billtocity;
+
+See L&lt;Handel::Schema::Order/billtocity&gt; for more information about this
+column.
+
 =head2 billtostate
 
+=over
+
+=item Arguments: $state
+
+=back
+
 Gets/sets the bill to state/province
 
+    $order-&gt;billtostate('OH');
+    print $order-&gt;billtostate;
+
+See L&lt;Handel::Schema::Order/billtostate&gt; for more information about this
+column.
+
 =head2 billtozip
 
+=over
+
+=item Arguments: $zip
+
+=back
+
 Gets/sets the bill to zip/postal code
 
+    $order-&gt;billtozip('12345-6500');
+    print $order-&gt;billtozip;
+
+See L&lt;Handel::Schema::Order/billtozip&gt; for more information about this
+column.
+
 =head2 billtocountry
 
+=over
+
+=item Arguments: $country
+
+=back
+
 Gets/sets the bill to country
 
+    $order-&gt;billtocountry('US');
+    print $order-&gt;billtocountry;
+
+See L&lt;Handel::Schema::Order/billtocountry&gt; for more information about this
+column.
+
 =head2 billtodayphone
 
+=over
+
+=item Arguments: $phone
+
+=back
+
 Gets/sets the bill to day phone number
 
+    $order-&gt;billtodayphone('800-867-5309');
+    print $order-&gt;billtodayphone;
+
+See L&lt;Handel::Schema::Order/billtodayphone&gt; for more information about this
+column.
+
 =head2 billtonightphone
 
+=over
+
+=item Arguments: $phone
+
+=back
+
 Gets/sets the bill to night phone number
 
+    $order-&gt;billtonightphone('800-867-5309');
+    print $order-&gt;billtonightphone;
+
+See L&lt;Handel::Schema::Order/billtonightphone&gt; for more information about this
+column.
+
 =head2 billtofax
 
+=over
+
+=item Arguments: $fax
+
+=back
+
 Gets/sets the bill to fax number
 
+    $order-&gt;billtofax('888-132-4335');
+    print $order-&gt;billtofax;
+
+See L&lt;Handel::Schema::Order/billtofax&gt; for more information about this
+column.
+
 =head2 billtoemail
 
+=over
+
+=item Arguments: $email
+
+=back
+
 Gets/sets the bill to email address
 
-=head2 ccn*
+    $order-&gt;billtoemail('claco@chrislaco.com');
+    print $order-&gt;billtoemail;
 
-Gets/sets the credit cart number.
+See L&lt;Handel::Schema::Order/billtoemail&gt; for more information about this
+column.
 
-B&lt;NOTE:&gt; This field is stored in memory for the life of the order instance and
-is not a real database field.
+=head2 shiptosameasbillto
 
-=head2 cctype*
+=over
 
-Gets/sets the credit cart type.
+=item Arguments: 0|1
 
-B&lt;NOTE:&gt; This field is stored in memory for the life of the order instance and
-is not a real database field.
+=back
 
-=head2 ccm*
+When true, the ship address is the same as the bill to address.
 
-Gets/sets the credit cart expiration month.
+    $order-&gt;shiptosameasbillto(1);
+    print $order-&gt;shiptosameasbillto;
 
-B&lt;NOTE:&gt; This field is stored in memory for the life of the order instance and
-is not a real database field.
+See L&lt;Handel::Schema::Order/shiptosameasbillto&gt; for more information about this
+column.
 
-=head2 ccy*
+=head2 shiptofirstname
 
-Gets/sets the credit cart expiration year.
+=over
 
-B&lt;NOTE:&gt; This field is stored in memory for the life of the order instance and
-is not a real database field.
+=item Arguments: $firstname
 
-=head2 ccvn*
+=back
 
-Gets/sets the credit cart verification number.
+Gets/sets the ship to first name.
 
-B&lt;NOTE:&gt; This field is stored in memory for the life of the order instance and
-is not a real database field.
+    $order-&gt;shiptofirstname('Chistopher');
+    print $order-&gt;shiptofirstname;
 
-=head2 ccname*
+See L&lt;Handel::Schema::Order/shiptofirstname&gt; for more information about this
+column.
 
-Gets/sets the credit cart holders name as it appears on the card.
+=head2 shiptolastname
 
-B&lt;NOTE:&gt; This field is stored in memory for the life of the order instance and
-is not a real database field.
+=over
 
-=head2 ccissuenumber*
+=item Arguments: $lastname
 
-Gets/sets the credit cart issue number.
+=back
 
-B&lt;NOTE:&gt; This field is stored in memory for the life of the order instance and
-is not a real database field.
+Gets/sets the ship to last name
 
-=head2 ccstartdate*
+    $order-&gt;shiptolastname('Chistopher');
+    print $order-&gt;shiptolastname;
 
-Gets/sets the credit cart start date.
+See L&lt;Handel::Schema::Order/shiptolastname&gt; for more information about this
+column.
 
-B&lt;NOTE:&gt; This field is stored in memory for the life of the order instance and
-is not a real database field.
+=head2 shiptoaddress1
 
-=head2 ccenddate*
+=over
 
-Gets/sets the credit cart end date.
+=item Arguments: $address1
 
-B&lt;NOTE:&gt; This field is stored in memory for the life of the order instance and
-is not a real database field.
+=back
 
-=head2 comments
+Gets/sets the ship to address line 1
 
-Gets/sets the comments for this order
+    $order-&gt;shiptoaddress1('1234 Main Street');
+    print $order-&gt;shiptoaddress1;
 
-=head2 count
+See L&lt;Handel::Schema::Order/shiptoaddress1&gt; for more information about this
+column.
 
-Gets the number of items in the order
+=head2 shiptoaddress2
 
-=head2 created
+=over
 
-Gets/sets the created date of the order
+=item Arguments: $address2
 
-=head2 handling
+=back
 
-Gets/sets the handling charge
+Gets/sets the ship to address line 2
 
-=head2 id
+    $order-&gt;shiptoaddress2('Suite 34b');
+    print $order-&gt;shiptoaddress2;
 
-Gets/sets the record id
+See L&lt;Handel::Schema::Order/shiptoaddress2&gt; for more information about this
+column.
 
-=head2 number
 
-Gets/sets the order number
+=head2 shiptoaddress3
 
-=head2 shipmethod
+=over
 
-Gets/sets the shipping method
+=item Arguments: $address3
 
-=head2 shipping
+=back
 
-Gets/sets the shipping cost
+Gets/sets the ship to address line 3
 
-=head2 shiptosameasbillto
+    $order-&gt;shiptoaddress3('Floor 5');
+    print $order-&gt;shiptoaddress3;
 
-Gets/sets the ship to same as bill to flag. When set, the ship to information
-will be copied from the bill to
+See L&lt;Handel::Schema::Order/shiptoaddress3&gt; for more information about this
+column.
 
-=head2 shiptofirstname
+=head2 shiptocity
 
-Gets/sets the ship to first name
+=over
 
-=head2 shiptolastname
+=item Arguments: $city
 
-Gets/sets the ship to last name
+=back
 
-=head2 shiptoaddress1
+Gets/sets the ship to city
 
-Gets/sets the ship to address line 1
+    $order-&gt;shiptocity('Smallville');
+    print $order-&gt;shiptocity;
 
-=head2 shiptoaddress2
+See L&lt;Handel::Schema::Order/shiptocity&gt; for more information about this
+column.
 
-Gets/sets the ship to address line 2
+=head2 shiptostate
 
-=head2 shiptoaddress3
+=over
 
-Gets/sets the ship to address line 3
+=item Arguments: $state
 
-=head2 shiptocity
+=back
 
-Gets/sets the ship to city
+Gets/sets the ship to state/province
 
-=head2 shiptostate
+    $order-&gt;shiptostate('OH');
+    print $order-&gt;shiptostate;
 
-Gets/sets the ship to state
+See L&lt;Handel::Schema::Order/shiptostate&gt; for more information about this
+column.
 
 =head2 shiptozip
 
+=over
+
+=item Arguments: $zip
+
+=back
+
 Gets/sets the ship to zip/postal code
 
+    $order-&gt;shiptozip('12345-6500');
+    print $order-&gt;shiptozip;
+
+See L&lt;Handel::Schema::Order/shiptozip&gt; for more information about this
+column.
+
 =head2 shiptocountry
 
+=over
+
+=item Arguments: $country
+
+=back
+
 Gets/sets the ship to country
 
+    $order-&gt;shiptocountry('US');
+    print $order-&gt;shiptocountry;
+
+See L&lt;Handel::Schema::Order/shiptocountry&gt; for more information about this
+column.
+
 =head2 shiptodayphone
 
+=over
+
+=item Arguments: $phone
+
+=back
+
 Gets/sets the ship to day phone number
 
+    $order-&gt;shiptodayphone('800-867-5309');
+    print $order-&gt;shiptodayphone;
+
+See L&lt;Handel::Schema::Order/shiptodayphone&gt; for more information about this
+column.
+
 =head2 shiptonightphone
 
+=over
+
+=item Arguments: $phone
+
+=back
+
 Gets/sets the ship to night phone number
 
+    $order-&gt;shiptonightphone('800-867-5309');
+    print $order-&gt;shiptonightphone;
+
+See L&lt;Handel::Schema::Order/shiptonightphone&gt; for more information about this
+column.
+
 =head2 shiptofax
 
+=over
+
+=item Arguments: $fax
+
+=back
+
 Gets/sets the ship to fax number
 
+    $order-&gt;shiptofax('888-132-4335');
+    print $order-&gt;shiptofax;
+
+See L&lt;Handel::Schema::Order/shiptofax&gt; for more information about this
+column.
+
 =head2 shiptoemail
 
+=over
+
+=item Arguments: $email
+
+=back
+
 Gets/sets the ship to email address
 
-=head2 shopper
+    $order-&gt;shiptoemail('claco@chrislaco.com');
+    print $order-&gt;shiptoemail;
 
-Gets/sets the shopper id
+See L&lt;Handel::Schema::Order/shiptoemail&gt; for more information about this
+column.
 
-=head2 subtotal
+=head1 TEMPORARY COLUMNS
 
-Gets/sets the orders subtotal
+The following columns are really just methods to hold sensitive 
+order data that we don't want to actually store in the database.
 
-=head2 tax
+=head2 ccn
+
+=over
 
-Gets/sets the orders tax
+=item Arguments: $ccn
 
-=head2 total
+=back
 
-Gets/sets the orders total
+Gets/sets the credit cart number.
 
-=head2 type
+    $order-&gt;ccn(4444333322221111);
+    print $order-&gt;ccn;
 
-Gets/sets the order type
+=head2 cctype
 
-=head2 updated
+=over
+
+=item Arguments: $type
+
+=back
+
+Gets/sets the credit cart type.
+
+    $order-&gt;cctype('MasterCard');
+    print $order-&gt;cctype;
+
+=head2 ccm
+
+=over
+
+=item Arguments: $month
+
+=back
+
+Gets/sets the credit cart expiration month.
+
+    $order-&gt;ccm(1);
+    print $order-&gt;ccm;
+
+=head2 ccy
+
+=over
+
+=item Arguments: $year
+
+=back
+
+Gets/sets the credit cart expiration year.
+
+    $order-&gt;ccyear(2010);
+    print $order-&gt;ccyear;
+
+=head2 ccvn
+
+=over
+
+=item Arguments: $cvvn
+
+=back
+
+Gets/sets the credit cart verification number.
+
+    $order-&gt;cvvn(102);
+    print $order-&gt;cvvn;
+
+=head2 ccname
+
+=over
+
+=item Arguments: $name
+
+=back
+
+Gets/sets the credit cart holders name as it appears on the card.
+
+    $order-&gt;ccname('CHRISTOPHER H. LACO');
+    print $order-&gt;ccname;
+
+=head2 ccissuenumber
+
+=over
+
+=item Arguments: $number
+
+=back
+
+Gets/sets the credit cart issue number.
+
+    $order-&gt;ccissuenumber(16544);
+    print $order-&gt;ccissuenumber;
+
+=head2 ccstartdate
+
+=over
+
+=item Arguments: $startdate
+
+=back
+
+Gets/sets the credit cart start date.
+
+    $order-&gt;ccstartdate('1/2/2009');
+    print $order-&gt;ccstartdate;
+
+=head2 ccenddate
+
+=over
+
+=item Arguments: $enddate
+
+=back
+
+Gets/sets the credit cart end date.
+
+    $order-&gt;ccenddate('12/31/2011');
+    print $order-&gt;ccenddate;
+
+=head1 SEE ALSO
 
-Gets/sets the last updated date of the order
+L&lt;Handel::Order::Item&gt;, L&lt;Handel::Schema::Order&gt;, L&lt;Handel::Constants&gt;
 
 =head1 AUTHOR
 </diff>
      <filename>lib/Handel/Order.pm</filename>
    </modified>
    <modified>
      <diff>@@ -4,37 +4,29 @@ use strict;
 use warnings;
 
 BEGIN {
-    use base 'Handel::DBI';
-    use Handel::Constraints qw(:all);
-    use Handel::Currency;
-    use Handel::L10N qw(translate);
+    use base qw/Handel::Base/;
+    use Handel::L10N qw/translate/;
+
+    __PACKAGE__-&gt;storage_class('Handel::Storage::DBIC::Order::Item');
+    __PACKAGE__-&gt;create_accessors;
 };
 
-__PACKAGE__-&gt;table('order_items');
-__PACKAGE__-&gt;autoupdate(1);
-__PACKAGE__-&gt;iterator_class('Handel::Iterator');
-__PACKAGE__-&gt;columns(All =&gt; qw(id orderid sku quantity price description total));
-__PACKAGE__-&gt;columns(Essential =&gt; qw(id orderid sku quantity price description total));
-__PACKAGE__-&gt;has_a(price =&gt; 'Handel::Currency');
-__PACKAGE__-&gt;has_a(total =&gt; 'Handel::Currency');
-__PACKAGE__-&gt;add_constraint('quantity', quantity =&gt; \&amp;constraint_quantity);
-__PACKAGE__-&gt;add_constraint('price',    price    =&gt; \&amp;constraint_price);
-__PACKAGE__-&gt;add_constraint('id',       id       =&gt; \&amp;constraint_uuid);
-__PACKAGE__-&gt;add_constraint('orderid',  orderid  =&gt; \&amp;constraint_uuid);
-__PACKAGE__-&gt;add_constraint('total',    total    =&gt; \&amp;constraint_price);
-
-sub new {
-    my ($self, $data) = @_;
+sub create {
+    my ($self, $data, $opts) = @_;
 
     throw Handel::Exception::Argument( -details =&gt;
-        translate('Param 1 is not a HASH reference') . '.') unless
-            ref($data) eq 'HASH';
+        translate('PARAM1_NOT_HASHREF')
+    ) unless ref($data) eq 'HASH'; ## no critic
 
-    if (!defined($data-&gt;{'id'}) || !constraint_uuid($data-&gt;{'id'})) {
-        $data-&gt;{'id'} = $self-&gt;uuid;
+    no strict 'refs';
+    my $storage = $opts-&gt;{'storage'};
+    if (!$storage) {
+        $storage = $self-&gt;storage;
     };
 
-    return $self-&gt;construct($data);
+    return $self-&gt;create_instance(
+        $storage-&gt;create($data)
+    );
 };
 
 1;
@@ -46,10 +38,12 @@ Handel::Order::Item - Module representing an individual order line item
 
 =head1 SYNOPSIS
 
-    my $order = Handel::Order-&gt;new({
+    use Handel::Order;
+    
+    my $order = Handel::Order-&gt;create({
         id =&gt; '12345678-9098-7654-322-345678909876'
     });
-
+    
     my $iterator = $order-&gt;items;
     while (my $item = $iterator-&gt;next) {
         print $item-&gt;sku;
@@ -57,51 +51,172 @@ Handel::Order::Item - Module representing an individual order line item
         print $item-&gt;total;
     };
 
+=head1 DESCRIPTION
+
+Handel::Order::Item is used in two main ways. First, you can create or edit
+order items individually:
+
+    use Handel::Order::Item;
+    
+    my $item = Handel::Order::Item-&gt;create({
+        cart =&gt; '11111111-1111-1111-1111-111111111111',
+        sku =&gt; '1234',
+        price =&gt; 1.23,
+        quantity =&gt; 1
+    });
+
+As a general rule, you probably want to add/edit items using the order objects
+C&lt;items&gt; and C&lt;add&gt; methods below instead.
+
+Second, the C&lt;items&gt; method of any valid Handel::Order object returns a
+collection of Handel::Order::Item objects:
+
+    my @items = $order-&gt;items;
+    foreach (@items) {
+        print $_-&gt;sku;
+    };
+
 =head1 CONSTRUCTOR
 
-=head2 new
+=head2 create
+
+=over
+
+=item Arguments: \%data [, \%options]
+
+=back
 
 You can create a new C&lt;Handel::Order::Item&gt; object by calling the C&lt;new&gt; method:
 
-    my $item = Handel::Order::Item-&gt;new({
+    my $item = Handel::Order::Item-&gt;create({
         sku =&gt; '1234',
         price =&gt; 1.23,
         quantity =&gt; 1,
         total =&gt; 1.23
     });
-
+    
     $item-&gt;quantity(2);
-
+    
     print $item-&gt;total;
 
-This is a lazy operation. No actual item record is created until the item object
-is passed into the C&lt;add&gt; method of a C&lt;Handel::Order&gt; object.
+The following options are available:
 
-=head1 METHODS
+=over
 
-=head2 description
+=item storage
+
+A storage object to use to create a new item object. Currently, this storage
+object B&lt;must&gt; have the same columns as the default storage object for the
+current item class.
+
+=back
 
-Gets/sets the item description
+=head1 COLUMNS
+
+The following methods are mapped to columns in the default order schema.
+These methods may or may not be available in any subclasses, or in situations
+where a custom schema is being used that has different column names.
 
 =head2 id
 
-Gets/sets the item id
+Returns the id of the current order item.
 
-=head2 price
+    print $item-&gt;id;
 
-Gets/sets the item price
+See L&lt;Handel::Schema::Order::Item/id&gt; for more information about this column.
 
-=head2 quantity
+=head2 orderid
+
+Gets/sets the id of the order this item belongs to.
 
-Gets/sets the item quantity
+    $item-&gt;order('11111111-1111-1111-1111-111111111111');
+    print $item-&gt;order;
+
+See L&lt;Handel::Schema::Order::Item/cart&gt; for more information about this column.
 
 =head2 sku
 
-Gets/sets the item sku
+=over
+
+=item Arguments: $sku
+
+=back
+
+Gets/sets the sku (stock keeping unit/part number) for the order item.
+
+    $item-&gt;sku('ABC123');
+    print $item-&gt;sku;
+
+See L&lt;Handel::Schema::Order::Item/sku&gt; for more information about this column.
+
+=head2 quantity
+
+=over
+
+=item Arguments: $quantity
+
+=back
+
+Gets/sets the quantity, or the number of this item being purchased.
+
+    $item-&gt;quantity(3);
+    print $item-&gt;quantity;
+
+By default, the value supplied will be checked against
+L&lt;Handel::Constraints/constraint_quantity&gt; to verify it is within the valid
+range of values.
+
+See L&lt;Handel::Schema::Order::Item/quantity&gt; for more information about this
+column.
+
+=head2 price
+
+=over
+
+=item Arguments: $price
+
+=back
+
+Gets/sets the price for the order item. The price is returned as a stringified
+L&lt;Handel::Currency|Handel::Currency&gt; object.
+
+    $item-&gt;price(12.95);
+    print $item-&gt;price;
+    print $item-&gt;price-&gt;format;
+
+
+See L&lt;Handel::Schema::Order::Item/price&gt; for more information about this column.
 
 =head2 total
 
-Gets/sets the item total
+Gets/sets the total price for the order item as a stringified
+L&lt;Handel::Currency|Handel::Currency&gt; object.
+
+    $item-&gt;total(12.95);
+    print $item-&gt;total;
+    print $item-&gt;total-&gt;format;
+
+See L&lt;Handel::Schema::Order::Item/total&gt; for more information about this column.
+
+=head2 description
+
+=over
+
+=item Arguments: $description
+
+=back
+
+Gets/sets the description for the current order item.
+
+    $item-&gt;description('Best Item Ever');
+    print $item-&gt;description;
+
+See L&lt;Handel::Schema::Order::Item/description&gt; for more information about this
+column.
+
+=head1 SEE ALSO
+
+L&lt;Handel::Order&gt;, L&lt;Handel::Schema::Order::Item&gt;, L&lt;Handel::Currency&gt;
 
 =head1 AUTHOR
 </diff>
      <filename>lib/Handel/Order/Item.pm</filename>
    </modified>
    <modified>
      <diff>@@ -2,13 +2,12 @@
 package Template::Plugin::Handel::Cart;
 use strict;
 use warnings;
-use base 'Template::Plugin';
-use Handel::Cart;
+use base qw/Template::Plugin/;
 use Handel::Constants ();
 
 sub new {
     my ($class, $context, @params) = @_;
-    my $self = bless {_CONTEXT =&gt; $context}, $class;
+    my $self = bless {_CONTEXT =&gt; $context}, 'Template::Plugin::Handel::Cart::Proxy';
 
     foreach my $const (@Handel::Constants::EXPORT_OK) {
         if ($const =~ /^[A-Z]{1}/) {
@@ -24,25 +23,33 @@ sub load {
     return $class;
 };
 
-sub create {
+package Template::Plugin::Handel::Cart::Proxy;
+use strict;
+use warnings;
+use base qw/Handel::Cart/;
+
+__PACKAGE__-&gt;init_storage;
+
+sub search {
     my ($self, $filter) = @_;
+    my $iterator = $self-&gt;SUPER::search($filter);
 
-    return Handel::Cart-&gt;new($filter);
+    return $iterator;
 };
 
-sub fetch {
-    my ($self, $filter, $wantiterator) = @_;
-    return Handel::Cart-&gt;load($filter, $wantiterator);
-};
+sub items {
+    my ($self, $filter) = @_;
+    my $iterator = $self-&gt;SUPER::items($filter);
 
-sub guid {
-    return shift-&gt;uuid;
+    return $iterator;
 };
 
 sub uuid {
-    return Handel::Cart-&gt;uuid;
+    return shift-&gt;storage-&gt;new_uuid;
 };
 
+*guid = \&amp;uuid;
+
 1;
 __END__
 
@@ -53,158 +60,26 @@ Template::Plugin::Handel::Cart - Template Toolkit plugin for shopping cart
 =head1 SYNOPSIS
 
     [% USE Handel.Cart %]
-    [% IF (cart = Handel.Cart.fetch(id =&gt; 'A2CCD312-73B5-4EE4-B77E-3D027349A055')) %]
+    [% IF (cart = Handel.Cart.search({id =&gt; 'A2CCD312-73B5-4EE4-B77E-3D027349A055'}).first) %]
         [% cart.name %]
-        [% FOREACH item IN cart.items %]
+        [% FOREACH item IN cart.items.all %]
             [% item.sku %]
         [% END %]
     [% END %]
 
 =head1 DESCRIPTION
 
-C&lt;Template::Plugin::Handel::Cart&gt; is a TT2 (Template Toolkit 2) plugin for
-C&lt;Handel::Cart&gt;. It's API is exactly the same as C&lt;Handel::Cart&gt; with a few
-minor exceptions noted below.
-
-Since C&lt;new&gt; and C&lt;load&gt; are used by TT2 to load plugins, Handel::Carts
-C&lt;new&gt; and C&lt;load&gt; can be accessed using C&lt;create&gt; and C&lt;fetch&gt;.
+Template::Plugin::Handel::Cart is a TT2 (Template Toolkit 2) plugin for
+Handel::Cart. It's API is exactly the same as Handel::Cart.
 
-Starting in version C&lt;0.08&gt;, C&lt;Handel::Constants&gt; are now imported into this
-module automatically. This removes the need to use
-C&lt;Template::Plugin::Handel::Constants&gt; separately when working with carts.
+Handel::Constants are imported into this module automatically. This removes
+the need to use Template::Plugin::Handel::Constants separately when working
+with carts.
 
     [% USE hc = Handel.Cart %]
     [% cart = hc.create(...) %]
     [% cart.type(hc.CART_TYPE_TEMP) %]
 
-=head1 CAVEATS
-
-C&lt;Template Toolkit&gt; handles method params in a smart fashion that
-allows you to pass named parameters into methods and it will convert them
-into HASH references.
-
-For example:
-
-    [% cart.method(name1=val1, name2=val2, otherarg);
-
-is turned into:
-
-    cart-&gt;method(otherarg, {name1=&gt;val1, name2=&gt;val2});
-
-Unfortunately, it looks like TT2 reverses the @ARGS order during translation.
-This causes problems with C&lt;Handel::Cart::load&gt; and C&lt;items&gt; as they expect
-C&lt;($hashref, $wantiterator)&gt; instead.
-
-Do to this, it is recommended that you always use the same explicit form as
-you would use when calling C&lt;Handel::Cart&gt; when calling C&lt;create&gt; and C&lt;items&gt;:
-
-    [% cart.method({name1=&gt;val1, name2=&gt;val2}, $wantiterator) %]
-
-Other issue is how C&lt;Handel::Cart&gt; returns an iterator or an array based on its
-inspection of C&lt;wantarray&gt;. It appears that TT2 thwarts C&lt;wantarray&gt; in some
-manner.
-
-For example:
-
-    [% carts = Handel.Cart.fetch() %]
-
-returns an array reference since it's not clear at this point what you really
-want. To counteract this behavior, you can use C&lt;RETURNAS&gt; constants to
-specify the exact output desired:
-
-    [% carts = Handel.Cart.fetch(undef, Handel.Cart.RETURNAS_ITERATOR) %]
-
-This will force a return of a C&lt;Handel::Iterator&gt; in scalar context. Then you
-can simply loop through the iterator:
-
-    [% WHILE (cart = carts.next) %]
-        ...
-    [% END %]
-
-On the upshot, if you are only expecting a single result, like loading a
-specific cart by C&lt;id&gt;, then it will just do Do What You Want:
-
-    [% cart = Handel.Cart.fetch({id =&gt; '12345678-7654-3212-345678987654'}) %]
-    [% cart.id %]
-    [% cart.name %]
-    ...
-
-You can even use C&lt;FOREACH&gt; without specifying the return type as TT2 appears
-to just Do The Right Thing regardless of whether it receives an array or a
-single C&lt;Handel::Cart&gt; or C&lt;Handel::Cart::Item&gt; object:
-
-    [% FOREACH cart IN Handel.Cart.fetch({id =&gt; '12345678-7654-3212-345678987654'}}) %]
-        [% FOREACH item IN cart.items %]
-            [% item.sku %]
-        [% END %]
-    [% END %]
-
-=head1 CONSTRUCTOR
-
-Unlike using C&lt;Handel::Cart&gt; to create a new cart object using C&lt;new&gt; and
-C&lt;load&gt;, C&lt;Template::Plugin::Handel::Cart&gt; takes a slightly different
-approach to cart objects. Because C&lt;USE&gt;ing in TT2 calls C&lt;new&gt;, we first
-C&lt;USE&gt; or create a new C&lt;Template::Plugin::Handel::Cart&gt; object then
-C&lt;create&gt; or C&lt;load&gt; to return a new cart object, iterator, or array of carts.
-
-=head2 new
-
-This returns a new Handel.Cart object. This is used internally when
-loading TT2 plugins and should not be used directly.
-
-=head1 METHODS
-
-=head2 load
-
-This method is called when TT2 loaded the plugin for the first time.
-This is used internally by TT2 and should not be used directly.
-
-=head2 create(\%filter)
-
-    [% USE Handel.Cart %]
-    [% IF (cart = Handel.Cart.create({
-        shopper =&gt; '12345678-9876-5432-1234-567890987654',
-        name    =&gt; 'My New Cart',
-        description =&gt;'Favorite Items'})) %]
-
-        [% cart.name %]
-        ...
-
-    [% END %]
-
-=head2 fetch(\%filter [, $wantiterator])
-
-The safest way to get a cart is to use FOREACH. This negates the need
-to specify C&lt;$wanteriterator&gt; for C&lt;Handel::Cart::load&gt;. See L&lt;CAVEATS&gt;
-for further info on C&lt;$wantiterator&gt;, Perls C&lt;wantarray&gt; within TT2.
-
-    [% USE Handel.Cart %]
-    [% FOREACH cart IN Handel.Cart.fetch({shopper =&gt; '12345678-9876-5432-1234-567890987654'}) %]
-        [% cart.id %]
-        [% cart.name %]
-        ...
-    [% END %]
-
-=head2 uuid
-
-Returns a new uuid for use in add/create:
-
-    [% USE Handel.Cart %]
-    [% IF (cart = Handel.Cart.create({
-        id      =&gt; Handel.Cart.uuid,
-        shopper =&gt; '12345678-9876-5432-1234-567890987654',
-        name    =&gt; 'My New Cart',
-        description =&gt;'Favorite Items'})) %]
-
-        [% cart.name %]
-        ...
-
-    [% END %]
-
-=head2 guid
-
-Same as C&lt;uuid&gt; above.
-
 =head1 SEE ALSO
 
 L&lt;Template::Plugin::Handel::Constants&gt;, L&lt;Handel::Constants&gt;, L&lt;Handel::Cart&gt;,</diff>
      <filename>lib/Template/Plugin/Handel/Cart.pm</filename>
    </modified>
    <modified>
      <diff>@@ -2,13 +2,12 @@
 package Template::Plugin::Handel::Checkout;
 use strict;
 use warnings;
-use base 'Template::Plugin';
-use Handel::Checkout;
+use base qw/Template::Plugin/;
 use Handel::Constants ();
 
 sub new {
     my ($class, $context, @params) = @_;
-    my $self = bless {_CONTEXT =&gt; $context}, $class;
+    my $self = bless {_CONTEXT =&gt; $context}, 'Template::Plugin::Handel::Checkout::Proxy';
 
     foreach my $const (@Handel::Constants::EXPORT_OK) {
         if ($const =~ /^[A-Z]{1}/) {
@@ -24,10 +23,24 @@ sub load {
     return $class;
 };
 
-sub create {
-    my ($self, $filter) = @_;
+package Template::Plugin::Handel::Checkout::Proxy;
+use strict;
+use warnings;
+use Template::Plugin::Handel::Order;
+use base qw/Handel::Checkout/;
+
+sub new {
+    my $class = ref shift;
+
+    return $class-&gt;SUPER::new(@_);
+};
+
+sub order {
+    my ($self, @args) = @_;
+
+    my $order = $self-&gt;SUPER::order(@args);
 
-    return Handel::Checkout-&gt;new($filter);
+    return bless \%{$order}, 'Template::Plugin::Handel::Order::Proxy';
 };
 
 1;
@@ -40,7 +53,7 @@ Template::Plugin::Handel::Checkout - Template Toolkit plugin for checkout proces
 =head1 SYNOPSIS
 
     [% USE Handel.Checkout %]
-    [% IF (checkout = Handel.Checkout.create(order =&gt; 'A2CCD312-73B5-4EE4-B77E-3D027349A055')) %]
+    [% IF (checkout = Handel.Checkout.new({order =&gt; 'A2CCD312-73B5-4EE4-B77E-3D027349A055'})) %]
         [% checkout.process %]
         [% FOREACH message IN checkout.messages %]
             [% message.text %]
@@ -49,70 +62,16 @@ Template::Plugin::Handel::Checkout - Template Toolkit plugin for checkout proces
 
 =head1 DESCRIPTION
 
-C&lt;Template::Plugin::Handel::Checkout&gt; is a TT2 (Template Toolkit 2) plugin for
-C&lt;Handel::Checkout&gt;. It's API is exactly the same as C&lt;Handel::Checkout&gt; with a few
-minor exceptions noted below.
-
-Since C&lt;new&gt; is used by TT2 to load plugins, Handel::Checkouts
-C&lt;new&gt; can be accessed using C&lt;create&gt;.
-
-Starting in version C&lt;0.08&gt;, C&lt;Handel::Constants&gt; are now imported into this
-module automatically. This removes the need to use
-C&lt;Template::Plugin::Handel::Constants&gt; separately when working with carts.
-
-    [% USE hc = Handel.Constants %]
-    [% cart = hc.create(...) %]
-    [% cart.type(hc.CHECKOUT_PHASE_INITIALIZE) %]
-
-=head1 CAVEATS
-
-C&lt;Template Toolkit&gt; handles method params in a smart fashion that
-allows you to pass named parameters into methods and it will convert them
-into HASH references.
-
-For example:
-
-    [% checkout.method(name1=val1, name2=val2, otherarg);
+Template::Plugin::Handel::Checkout is a TT2 (Template Toolkit 2) plugin for
+Handel::Checkout. It's API is exactly the same as Handel::Checkout.
 
-is turned into:
+Handel::Constants are imported into this module automatically. This removes
+the need to use Template::Plugin::Handel::Constants separately when working
+with checkout processes.
 
-    checkout-&gt;method(otherarg, {name1=&gt;val1, name2=&gt;val2});
-
-Unfortunately, it looks like TT2 reverses the @ARGS order during translation.
-This causes problems with C&lt;Handel::Order::load&gt; and C&lt;items&gt; as they expect
-C&lt;($hashref, $wantiterator)&gt; instead.
-
-Do to this, it is recommended that you always use the same explicit form as
-you would use when calling C&lt;Handel::Checkout&gt; when calling C&lt;create&gt; and C&lt;items&gt;:
-
-    [% checkout.method({name1=&gt;val1, name2=&gt;val2}, $wantiterator) %]
-
-
-=head1 CONSTRUCTOR
-
-Unlike using C&lt;Handel::Checkout&gt; to create a new checkout object using C&lt;new&gt;,
-C&lt;Template::Plugin::Handel::Checkout&gt; takes a slightly different
-approach to checkout objects. Because C&lt;USE&gt;ing in TT2 calls C&lt;new&gt;, we first
-C&lt;USE&gt; or create a new C&lt;Template::Plugin::Handel::Checkout&gt; object then
-C&lt;create&gt; to return a new checkout object.
-
-=head2 new
-
-This returns a new Handel.Checkout object. This is used internally when
-loading TT2 plugins and should not be used directly.
-
-=head1 METHODS
-
-=head2 create(\%options)
-
-    [% USE Handel.Checkout %]
-    [% IF (checkout = Handel.Checkout.create({
-        order =&gt; '12345678-9876-5432-1234-567890987654'})) %]
-
-        [% order.process %]
-        ...
-
-    [% END %]
+    [% USE hc = Handel.Checkout %]
+    [% checkout = hc.new(...) %]
+    [% checkout.order.type(hc.CHECKOUT_PHASE_INITIALIZE) %]
 
 =head1 SEE ALSO
 </diff>
      <filename>lib/Template/Plugin/Handel/Checkout.pm</filename>
    </modified>
    <modified>
      <diff>@@ -2,12 +2,12 @@
 package Template::Plugin::Handel::Constants;
 use strict;
 use warnings;
-use base 'Template::Plugin';
+use base qw/Template::Plugin/;
 use Handel::Constants ();
 
 sub new {
     my ($class, $context, @params) = @_;
-    my $self = bless {_CONTEXT =&gt; $context}, ref($class) || $class;
+    my $self = bless {_CONTEXT =&gt; $context}, $class;
 
     foreach my $const (@Handel::Constants::EXPORT_OK) {
         if ($const =~ /^[A-Z]{1}/) {
@@ -43,25 +43,11 @@ Template::Plugin::Handel::Constants - Template Toolkit plugin for constants
 
 =head1 DESCRIPTION
 
-C&lt;Template::Plugin::Handel::Constants&gt; is a TT2 (Template Toolkit 2) plugin to
-access C&lt;Handel::Constants&gt; inside of TT2 pages.
+Template::Plugin::Handel::Constants is a TT2 (Template Toolkit 2) plugin to
+access Handel::Constants inside of TT2 pages.
 
 It contains all of the exportable constants declared in
-C&lt;@Handel::Constants::EXPORT_OK&gt;.
-
-=head1 CONSTRUCTOR
-
-=head2 new
-
-This returns a new Handel.Constants object. This is used internally when
-loading TT2 plugins and should not be used directly.
-
-=head1 METHODS
-
-=head2 load
-
-This method is called when TT2 loaded the plugin for the first time.
-This is used internally by TT2 and should not be used directly.
+Handel::Constants::EXPORT_OK.
 
 =head1 SEE ALSO
 </diff>
      <filename>lib/Template/Plugin/Handel/Constants.pm</filename>
    </modified>
    <modified>
      <diff>@@ -2,13 +2,12 @@
 package Template::Plugin::Handel::Order;
 use strict;
 use warnings;
-use base 'Template::Plugin';
-use Handel::Order;
+use base qw/Template::Plugin/;
 use Handel::Constants ();
 
 sub new {
     my ($class, $context, @params) = @_;
-    my $self = bless {_CONTEXT =&gt; $context}, $class;
+    my $self = bless {_CONTEXT =&gt; $context}, 'Template::Plugin::Handel::Order::Proxy';
 
     foreach my $const (@Handel::Constants::EXPORT_OK) {
         if ($const =~ /^[A-Z]{1}/) {
@@ -24,25 +23,33 @@ sub load {
     return $class;
 };
 
-sub create {
+package Template::Plugin::Handel::Order::Proxy;
+use strict;
+use warnings;
+use base qw/Handel::Order/;
+
+__PACKAGE__-&gt;init_storage;
+
+sub search {
     my ($self, $filter) = @_;
+    my $iterator = $self-&gt;SUPER::search($filter);
 
-    return Handel::Order-&gt;new($filter);
+    return $iterator;
 };
 
-sub fetch {
-    my ($self, $filter, $wantiterator) = @_;
-    return Handel::Order-&gt;load($filter, $wantiterator);
-};
+sub items {
+    my ($self, $filter) = @_;
+    my $iterator = $self-&gt;SUPER::items($filter);
 
-sub guid {
-    return shift-&gt;uuid;
+    return $iterator;
 };
 
 sub uuid {
-    return Handel::Order-&gt;uuid;
+    return shift-&gt;storage-&gt;new_uuid;
 };
 
+*guid = \&amp;uuid;
+
 1;
 __END__
 
@@ -53,155 +60,25 @@ Template::Plugin::Handel::Order - Template Toolkit plugin for orders
 =head1 SYNOPSIS
 
     [% USE Handel.Order %]
-    [% IF (order = Handel.Order.fetch(id =&gt; 'A2CCD312-73B5-4EE4-B77E-3D027349A055')) %]
+    [% IF (order = Handel.Order.search({id =&gt; 'A2CCD312-73B5-4EE4-B77E-3D027349A055'}).first) %]
         [% order.number %]
-        [% FOREACH item IN order.items %]
+        [% FOREACH item IN order.items.all %]
             [% item.sku %]
         [% END %]
     [% END %]
 
 =head1 DESCRIPTION
 
-C&lt;Template::Plugin::Handel::Order&gt; is a TT2 (Template Toolkit 2) plugin for
-C&lt;Handel::Order&gt;. It's API is exactly the same as C&lt;Handel::Order&gt; with a few
-minor exceptions noted below.
-
-Since C&lt;new&gt; and C&lt;load&gt; are used by TT2 to load plugins, Handel::Orders
-C&lt;new&gt; and C&lt;load&gt; can be accessed using C&lt;create&gt; and C&lt;fetch&gt;.
-
-Starting in version C&lt;0.08&gt;, C&lt;Handel::Constants&gt; are now imported into this
-module automatically. This removes the need to use
-C&lt;Template::Plugin::Handel::Constants&gt; separately when working with carts.
-
-    [% USE hc = Handel.Constants %]
-    [% cart = hc.create(...) %]
-    [% cart.type(hc.ORDER_TYPE_TEMP) %]
-
-=head1 CAVEATS
-
-C&lt;Template Toolkit&gt; handles method params in a smart fashion that
-allows you to pass named parameters into methods and it will convert them
-into HASH references.
-
-For example:
-
-    [% order.method(name1=val1, name2=val2, otherarg);
-
-is turned into:
-
-    order-&gt;method(otherarg, {name1=&gt;val1, name2=&gt;val2});
-
-Unfortunately, it looks like TT2 reverses the @ARGS order during translation.
-This causes problems with C&lt;Handel::Order::load&gt; and C&lt;items&gt; as they expect
-C&lt;($hashref, $wantiterator)&gt; instead.
-
-Do to this, it is recommended that you always use the same explicit form as
-you would use when calling C&lt;Handel::Order&gt; when calling C&lt;create&gt; and C&lt;items&gt;:
-
-    [% order.method({name1=&gt;val1, name2=&gt;val2}, $wantiterator) %]
-
-Another issue is how C&lt;Handel::Order&gt; returns an iterator or an array based on its
-inspection of C&lt;wantarray&gt;. It appears that TT2 thwarts C&lt;wantarray&gt; in some
-manner.
-
-For example:
-
-    [% orders = Handel.Order.fetch() %]
-
-returns an array reference since it's not clear at this point what you really
-want. To counteract this behavior, you can use C&lt;RETURNAS&gt; constants to
-specify the exact output desired:
-
-    [% orders = Handel.Order.fetch(undef, Handel.Order.RETURNAS_ITERATOR) %]
-
-This will force a return of a C&lt;Handel::Iterator&gt; in scalar context. Then you
-can simply loop through the iterator:
-
-    [% WHILE (order = orders.next) %]
-        ...
-    [% END %]
-
-On the upshot, if you are only expecting a single result, like loading a
-specific cart by C&lt;id&gt;, then it will just do Do What You Want:
-
-    [% order = Handel.Order.fetch({id =&gt; '12345678-7654-3212-345678987654'}) %]
-    [% order.id %]
-    [% order.number %]
-    ...
-
-You can even use C&lt;FOREACH&gt; without specifying the return type as TT2 appears
-to just Do The Right Thing regardless of whether it receives an array or a
-single C&lt;Handel::Order&gt; or C&lt;Handel::Order::Item&gt; object:
-
-    [% FOREACH order IN Handel.Order.fetch({id =&gt; '12345678-7654-3212-345678987654'}}) %]
-        [% FOREACH item IN order.items %]
-            [% item.sku %]
-        [% END %]
-    [% END %]
-
-=head1 CONSTRUCTOR
-
-Unlike using C&lt;Handel::Order&gt; to create a new order object using C&lt;new&gt; and
-C&lt;load&gt;, C&lt;Template::Plugin::Handel::Order&gt; takes a slightly different
-approach to order objects. Because C&lt;USE&gt;ing in TT2 calls C&lt;new&gt;, we first
-C&lt;USE&gt; or create a new C&lt;Template::Plugin::Handel::Order&gt; object then
-C&lt;create&gt; or C&lt;load&gt; to return a new order object, iterator, or array of orders.
-
-=head2 new
-
-This returns a new Handel.Order object. This is used internally when
-loading TT2 plugins and should not be used directly.
-
-=head1 METHODS
-
-=head2 load
-
-This method is called when TT2 loaded the plugin for the first time.
-This is used internally by TT2 and should not be used directly.
-
-=head2 create(\%filter)
-
-    [% USE Handel.Order %]
-    [% IF (order = Handel.Order.create({
-        shopper =&gt; '12345678-9876-5432-1234-567890987654',
-        number  =&gt; 'O123456789'})) %]
-
-        [% cart.number %]
-        ...
-
-    [% END %]
-
-=head2 fetch(\%filter [, $wantiterator])
-
-The safest way to get a order is to use FOREACH. This negates the need
-to specify C&lt;$wanteriterator&gt; for C&lt;Handel::Order::load&gt;. See L&lt;CAVEATS&gt;
-for further info on C&lt;$wantiterator&gt;, Perls C&lt;wantarray&gt; within TT2.
-
-    [% USE Handel.Order %]
-    [% FOREACH order IN Handel.Order.fetch({shopper =&gt; '12345678-9876-5432-1234-567890987654'}) %]
-        [% order.id %]
-        [% order.number %]
-        ...
-    [% END %]
-
-=head2 uuid
-
-Returns a new uuid for use in add/create:
-
-    [% USE Handel.Order %]
-    [% IF (order = Handel.Order.create({
-        id      =&gt; Handel.Cart.uuid,
-        shopper =&gt; '12345678-9876-5432-1234-567890987654',
-        number  =&gt; ')123456789'})) %]
-
-        [% order.number %]
-        ...
-
-    [% END %]
+Template::Plugin::Handel::Order is a TT2 (Template Toolkit 2) plugin for
+Handel::Order. It's API is exactly the same as Handel::Order.
 
-=head2 guid
+Handel::Constants are imported into this module automatically. This removes
+the need to use Template::Plugin::Handel::Constants separately when working
+with orders.
 
-Same as C&lt;uuid&gt; above.
+    [% USE ho = Handel.Order %]
+    [% order = ho.create(...) %]
+    [% order.type(ho.ORDER_TYPE_TEMP) %]
 
 =head1 SEE ALSO
 </diff>
      <filename>lib/Template/Plugin/Handel/Order.pm</filename>
    </modified>
    <modified>
      <diff>@@ -43,8 +43,9 @@ CREATE TABLE orders (
 	billtocountry varchar(25) NULL,
 	billtodayphone varchar(25) NULL,
 	billtonightphone varchar(25) NULL,
-	billtofax varchar(25) NULL,billtoemail varchar(50) NULL,
-	shiptosameasbillto tinyint NOT NULL  default '0',
+	billtofax varchar(25) NULL,
+	billtoemail varchar(50) NULL,
+	shiptosameasbillto tinyint(3) NOT NULL  default '0',
 	shiptofirstname varchar(25) NULL,
 	shiptolastname varchar(25) NULL,
 	shiptoaddress1 varchar(50) NULL,</diff>
      <filename>sql/handel.sqlite.sql</filename>
    </modified>
    <modified>
      <diff>@@ -2,26 +2,70 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More tests =&gt; 30;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 63;
+
     use_ok('Handel');
+    use_ok('Handel::Base');
     use_ok('Handel::Cart');
     use_ok('Handel::Cart::Item');
+    use_ok('Handel::Cart::Schema');
     use_ok('Handel::Checkout');
+    use_ok('Handel::Checkout::Message');
     use_ok('Handel::Checkout::Plugin');
+    use_ok('Handel::Checkout::Plugin::MarkOrderSaved');
+    use_ok('Handel::Checkout::Plugin::AssignOrderNumber');
     use_ok('Handel::Checkout::Stash');
+    use_ok('Handel::Compat::Currency');
+    use_ok('Handel::Components::Constraints');
+    use_ok('Handel::Components::DefaultValues');
+    use_ok('Handel::Components::Validation');
+    use_ok('Handel::ConfigReader');
     use_ok('Handel::Constants');
     use_ok('Handel::Constraints');
     use_ok('Handel::Currency');
-    use_ok('Handel::DBI');
     use_ok('Handel::Exception');
     use_ok('Handel::Iterator');
+    use_ok('Handel::Iterator::DBIC');
+    use_ok('Handel::Iterator::List');
+    use_ok('Handel::Iterator::Results');
     use_ok('Handel::L10N');
     use_ok('Handel::L10N::en_us');
+    use_ok('Handel::L10N::es_es');
     use_ok('Handel::L10N::fr');
+    use_ok('Handel::L10N::zh_tw');
     use_ok('Handel::Order');
     use_ok('Handel::Order::Item');
+    use_ok('Handel::Order::Schema');
+    use_ok('Handel::Schema');
+    use_ok('Handel::Schema::DBIC::Cart');
+    use_ok('Handel::Schema::DBIC::Cart::Item');
+    use_ok('Handel::Schema::DBIC::Order');
+    use_ok('Handel::Schema::DBIC::Order::Item');
+    use_ok('Handel::Storage');
+    use_ok('Handel::Storage::Result');
+    use_ok('Handel::Storage::DBIC');
+    use_ok('Handel::Storage::DBIC::Result');
+    use_ok('Handel::Storage::DBIC::Cart');
+    use_ok('Handel::Storage::DBIC::Cart::Item');
+    use_ok('Handel::Storage::DBIC::Order');
+    use_ok('Handel::Storage::DBIC::Order::Item');
+
+    {
+        ## no need for the deprected warnings here
+        local $SIG{__WARN__} = sub{};
+
+        use_ok('Handel::Compat');
+    };
+
+    SKIP: {
+        eval 'use Module::Starter';
+        skip 'Module::Starter not installed', 1 if $@;
+
+        use_ok('Module::Starter::Handel');
+    };
 
     SKIP: {
         eval 'use Apache::AxKit::Language::XSP';
@@ -48,14 +92,17 @@ BEGIN {
     };
 
     SKIP: {
-        eval 'use Catalyst 5.56';
-        skip 'Catalyst 5.56 not installed', 6 if $@;
+        eval 'use Catalyst 5.7001';
+        skip 'Catalyst 5.7001 not installed', 9 if $@;
 
+        use_ok('Catalyst::Helper::Handel');
         use_ok('Catalyst::Helper::Handel::Scaffold');
         use_ok('Catalyst::Helper::Controller::Handel::Cart');
         use_ok('Catalyst::Helper::Controller::Handel::Checkout');
         use_ok('Catalyst::Helper::Controller::Handel::Order');
         use_ok('Catalyst::Helper::Model::Handel::Cart');
         use_ok('Catalyst::Helper::Model::Handel::Order');
+        use_ok('Catalyst::Model::Handel::Cart');
+        use_ok('Catalyst::Model::Handel::Order');
     };
 };</diff>
      <filename>t/basic.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,20 +2,22 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 156;
+        plan tests =&gt; 252;
     };
 
     use_ok('Handel::Cart');
+    use_ok('Handel::Cart::Item');
     use_ok('Handel::Subclassing::Cart');
+    use_ok('Handel::Subclassing::CartItem');
     use_ok('Handel::Subclassing::CartOnly');
     use_ok('Handel::Constants', ':cart');
     use_ok('Handel::Exception', ':try');
@@ -23,6 +25,8 @@ BEGIN {
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,34 +34,23 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/cart_add_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
-
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
 
     ## test for Handel::Exception::Argument where first param is not a hashref
     ## or Handle::Cart::Item subclass
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $newitem = $subclass-&gt;add(id =&gt; '1234');
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not a hash/i, 'not a hash ref in message');
         } otherwise {
-            fail;
+            fail('caught other exception');
         };
     };
 
@@ -66,23 +59,29 @@ sub run {
     ## or Handle::Cart::Item subclass
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $fakeitem = bless {}, 'FakeItem';
             my $newitem = $subclass-&gt;add($fakeitem);
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not a hash.*Handel::Cart::Item/i, 'not a cart in message');
         } otherwise {
-            fail;
+            fail('caught other exception');
         };
     };
 
 
     ## add a new item by passing a hashref
     {
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'returned 1 item');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
 
@@ -99,37 +98,45 @@ sub run {
         my $item = $cart-&gt;add($data);
         isa_ok($item, 'Handel::Cart::Item');
         isa_ok($item, $itemclass);
-        is($item-&gt;cart, $cart-&gt;id);
-        is($item-&gt;sku, 'SKU9999');
-        is($item-&gt;quantity, 2);
-        is($item-&gt;price, 1.11);
-        is($item-&gt;description, 'Line Item SKU 9');
-        is($item-&gt;total, 2.22);
+        is($item-&gt;cart, $cart-&gt;id, 'cart is set');
+        is($item-&gt;sku, 'SKU9999', 'got sku');
+        is($item-&gt;quantity, 2, 'quantity is 2');
+        is($item-&gt;price+0, 1.11, 'price is 1.11');
+        is($item-&gt;description, 'Line Item SKU 9', 'got description');
+        is($item-&gt;total+0, 2.22, 'total is 2.22');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item-&gt;custom, 'custom');
+            is($item-&gt;custom, 'custom', 'got custom');
         };
 
 
-        is($cart-&gt;count, 3);
-        is($cart-&gt;subtotal, 7.77);
+        is($cart-&gt;count, 3, 'count is 3');
+        is($cart-&gt;subtotal+0, 7.77, 'subtotal is 7.77');
 
-        my $recart = $subclass-&gt;load({
+        my $reit = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($reit, 'Handel::Iterator');
+        is($reit, 1, 'got 1 cart');
+
+        my $recart = $reit-&gt;first;
         isa_ok($recart, $subclass);
-        is($recart-&gt;count, 3);
+        is($recart-&gt;count, 3, 'has 3 items');
 
-        my $reitem = $cart-&gt;items({sku =&gt; 'SKU9999'});
-        isa_ok($item, 'Handel::Cart::Item');
-        isa_ok($item, $itemclass);
-        is($reitem-&gt;cart, $cart-&gt;id);
-        is($reitem-&gt;sku, 'SKU9999');
-        is($reitem-&gt;quantity, 2);
-        is($reitem-&gt;price, 1.11);
-        is($reitem-&gt;description, 'Line Item SKU 9');
-        is($reitem-&gt;total, 2.22);
+        my $reitemit = $cart-&gt;items({sku =&gt; 'SKU9999'});
+        isa_ok($reitemit, 'Handel::Iterator');
+        is($reitemit, 1, 'got 1 item');
+
+        my $reitem = $reitemit-&gt;first;
+        isa_ok($reitem, 'Handel::Cart::Item');
+        isa_ok($reitem, $itemclass);
+        is($reitem-&gt;cart, $cart-&gt;id, 'cart is set');
+        is($reitem-&gt;sku, 'SKU9999', 'got sku');
+        is($reitem-&gt;quantity, 2, 'quantity is 2');
+        is($reitem-&gt;price+0, 1.11, 'price is 1.11');
+        is($reitem-&gt;description, 'Line Item SKU 9', 'got description');
+        is($reitem-&gt;total+0, 2.22, 'total is 2.22');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item-&gt;custom, 'custom');
+            is($item-&gt;custom, 'custom', 'got custom');
         };
     };
 
@@ -140,57 +147,199 @@ sub run {
             sku         =&gt; 'SKU8888',
             quantity    =&gt; 1,
             price       =&gt; 1.11,
-            description =&gt; 'Line Item SKU 8'
+            description =&gt; 'Line Item SKU 8',
+            cart        =&gt; '00000000-0000-0000-0000-000000000000'
         };
         if ($itemclass ne 'Handel::Cart::Item') {
             $data-&gt;{'custom'} = 'custom';
         };
 
-        my $newitem = $itemclass-&gt;new($data);
+        my $newitem = $itemclass-&gt;create($data);
         isa_ok($newitem, 'Handel::Cart::Item');
         isa_ok($newitem, $itemclass);
 
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '22222222-2222-2222-2222-222222222222'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'got 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
 
         my $item = $cart-&gt;add($newitem);
         isa_ok($item, 'Handel::Cart::Item');
         isa_ok($item, $itemclass);
-        is($item-&gt;cart, $cart-&gt;id, &quot;koo&quot;);
-        is($item-&gt;sku, 'SKU8888');
-        is($item-&gt;quantity, 1);
-        is($item-&gt;price, 1.11);
-        is($item-&gt;description, 'Line Item SKU 8');
-        is($item-&gt;total, 1.11);
+        is($item-&gt;cart, $cart-&gt;id, 'cart is set');
+        is($item-&gt;sku, 'SKU8888', 'got sku');
+        is($item-&gt;quantity, 1, 'quantity is 1');
+        is($item-&gt;price+0, 1.11, 'price is 1.11');
+        is($item-&gt;description, 'Line Item SKU 8', 'got description');
+        is($item-&gt;total+0, 1.11, 'total is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item-&gt;custom, 'custom');
+            is($item-&gt;custom, 'custom', 'got custom');
         };
 
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 11.10);
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 11.10, 'subtotal is 11.10');
 
-        my $recart = $subclass-&gt;load({
+        my $recartit = $subclass-&gt;search({
             id =&gt; '22222222-2222-2222-2222-222222222222'
         });
+        isa_ok($recartit, 'Handel::Iterator');
+        is($recartit, 1, 'got 1 cart');
+
+        my $recart = $recartit-&gt;first;
         isa_ok($recart, $subclass);
         isa_ok($recart, 'Handel::Cart');
-        is($recart-&gt;count, 2);
+        is($recart-&gt;count, 2, 'has 2 items');
+
+        my $reitemit = $cart-&gt;items({sku =&gt; 'SKU8888'});
+        isa_ok($reitemit, 'Handel::Iterator');
+        is($reitemit, 1, 'have 1 cart');
 
-        my $reitem = $cart-&gt;items({sku =&gt; 'SKU8888'});
+        my $reitem = $reitemit-&gt;first;
         isa_ok($reitem, 'Handel::Cart::Item');
         isa_ok($reitem, $itemclass);
-        is($reitem-&gt;cart, $cart-&gt;id);
-        is($reitem-&gt;sku, 'SKU8888');
-        is($reitem-&gt;quantity, 1);
-        is($reitem-&gt;price, 1.11);
-        is($reitem-&gt;description, 'Line Item SKU 8');
-        is($reitem-&gt;total, 1.11);
+        is($reitem-&gt;cart, $cart-&gt;id, 'cart is set');
+        is($reitem-&gt;sku, 'SKU8888', 'sku is set');
+        is($reitem-&gt;quantity, 1, 'quantity is 1');
+        is($reitem-&gt;price+0, 1.11, 'price is 1.11');
+        is($reitem-&gt;description, 'Line Item SKU 8', 'got description');
+        is($reitem-&gt;total+0, 1.11, 'total is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item-&gt;custom, 'custom');
+            is($item-&gt;custom, 'custom', 'got custom');
         };
     };
+};
+
+
+## add a new item by passing a Handel::Cart::Item where object has no column
+## accessor methods, but the result does
+{
+    local *Handel::Cart::Item::can = sub {};
+
+    my $data = {
+        sku         =&gt; 'SKU8888',
+        quantity    =&gt; 1,
+        price       =&gt; 1.11,
+        description =&gt; 'Line Item SKU 8',
+        cart        =&gt; '00000000-0000-0000-0000-000000000001'
+    };
+
+    my $newitem = Handel::Cart::Item-&gt;create($data);
+    isa_ok($newitem, 'Handel::Cart::Item');
+
+    my $it = Handel::Cart-&gt;search({
+        id =&gt; '22222222-2222-2222-2222-222222222222'
+    });
+    isa_ok($it, 'Handel::Iterator');
+    is($it, 1, 'got 1 cart');
+
+    my $cart = $it-&gt;first;
+    isa_ok($cart, 'Handel::Cart');
+
+
+    my $item = $cart-&gt;add($newitem);
+    isa_ok($item, 'Handel::Cart::Item');
+    is($item-&gt;cart, $cart-&gt;id, 'cart is set');
+    is($item-&gt;sku, 'SKU8888', 'got sku');
+    is($item-&gt;quantity, 1, 'quantity is 1');
+    is($item-&gt;price+0, 1.11, 'price is 1.11');
+    is($item-&gt;description, 'Line Item SKU 8', 'got description');
+    is($item-&gt;total+0, 1.11, 'total is 1.11');
+
+    is($cart-&gt;count, 3, 'has 3 items');
+    is($cart-&gt;subtotal+0, 12.21, 'subtotal is 12.21');
+
+    my $recartit = Handel::Cart-&gt;search({
+        id =&gt; '22222222-2222-2222-2222-222222222222'
+    });
+    isa_ok($recartit, 'Handel::Iterator');
+    is($recartit, 1, 'got 1 cart');
+
+    my $recart = $recartit-&gt;first;
+    isa_ok($recart, 'Handel::Cart');
+    is($recart-&gt;count, 3, 'has 3 items');
+
+    my $reitemit = $cart-&gt;items({sku =&gt; 'SKU8888'});
+    isa_ok($reitemit, 'Handel::Iterator');
+    is($reitemit, 2, 'has 2 items');
+
+    my $reitem = $reitemit-&gt;first;
+    isa_ok($reitem, 'Handel::Cart::Item');
+    is($reitem-&gt;cart, $cart-&gt;id, 'cart is set');
+    is($reitem-&gt;sku, 'SKU8888', 'got sku');
+    is($reitem-&gt;quantity, 1, 'quantity is 1');
+    is($reitem-&gt;price+0, 1.11, 'price is 1.11');
+    is($reitem-&gt;description, 'Line Item SKU 8', 'got description');
+    is($reitem-&gt;total+0, 1.11, 'total is 1.11');
+};
+
+
+## add a new item by passing a Handel::Cart::Item where object has no column
+## accessor methods and no result accessor methods
+{
+    no warnings 'once';
+    no warnings 'redefine';
+
+    local *Handel::Cart::Item::can = sub {};
+    local *Handel::Storage::DBIC::Result::can = sub {return 1 if $_[1] eq 'sku'};
+
+    my $data = {
+        sku         =&gt; 'SKU8888',
+        quantity    =&gt; 1,
+        price       =&gt; 1.11,
+        description =&gt; 'Line Item SKU 8',
+        cart        =&gt; '00000000-0000-0000-0000-000000000002'
+    };
 
+    my $newitem = Handel::Cart::Item-&gt;create($data);
+    isa_ok($newitem, 'Handel::Cart::Item');
+
+    my $it = Handel::Cart-&gt;search({
+        id =&gt; '22222222-2222-2222-2222-222222222222'
+    });
+    isa_ok($it, 'Handel::Iterator');
+    is($it, 1, 'got 1 cart');
+
+    my $cart = $it-&gt;first;
+    isa_ok($cart, 'Handel::Cart');
+
+
+    my $item = $cart-&gt;add($newitem);
+    isa_ok($item, 'Handel::Cart::Item');
+    is($item-&gt;cart, $cart-&gt;id, 'cart is set');
+    is($item-&gt;sku, 'SKU8888', 'got sku');
+    is($item-&gt;quantity, 1, 'quantity is 1');
+    is($item-&gt;price+0, 0, 'price is 0');
+    is($item-&gt;description, undef, 'no description');
+    is($item-&gt;total+0, 0, 'total is 0');
+
+    is($cart-&gt;count, 4, 'has 4 items');
+    is($cart-&gt;subtotal+0, 12.21, 'subtotal 12.21');
+
+    my $recartit = Handel::Cart-&gt;search({
+        id =&gt; '22222222-2222-2222-2222-222222222222'
+    });
+    isa_ok($recartit, 'Handel::Iterator');
+    is($recartit, 1, 'got 1 cart');
+
+    my $recart = $recartit-&gt;first;
+    isa_ok($recart, 'Handel::Cart');
+    is($recart-&gt;count, 4, 'has 4 items');
+
+    my $reitemit = $cart-&gt;items();
+    isa_ok($reitemit, 'Handel::Iterator');
+    is($reitemit, 4, 'has 4 items');
+
+    my $reitem = $reitemit-&gt;last;
+    isa_ok($reitem, 'Handel::Cart::Item');
+    is($reitem-&gt;cart, $cart-&gt;id, 'cart is set');
+    is($reitem-&gt;sku, 'SKU8888', 'got sku');
+    is($reitem-&gt;quantity, 1, 'quantity is 1');
+    is($reitem-&gt;price+0, 0, 'price is 0');
+    is($reitem-&gt;description, undef, 'no description');
+    is($reitem-&gt;total+0, 0, 'total is 0');
 };</diff>
      <filename>t/cart_add.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,16 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 23;
+        plan tests =&gt; 41;
     };
 
     use_ok('Handel::Cart');
@@ -23,6 +23,8 @@ BEGIN {
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,41 +32,43 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/cart_clear_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
-
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
 
     ## Clear cart contents and validate counts
     {
-        my $cart = $subclass-&gt;load({
+        my $total_items = $subclass-&gt;storage-&gt;schema_instance-&gt;resultset('Items')-&gt;count;
+        ok($total_items, 'has items');
+
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'got 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        ok($cart-&gt;count &gt;= 1);
 
+        my $related_items = $cart-&gt;count;
+        ok($related_items &gt;= 1, 'has more than 1 item');
         $cart-&gt;clear;
-        is($cart-&gt;count, 0);
+        is($cart-&gt;count, 0, 'items cleared');
 
-        my $recart = $subclass-&gt;load({
+        my $reit = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($reit, 'Handel::Iterator');
+        is($reit, 1, 'got 1 cart');
+
+        my $recart = $reit-&gt;first;
         isa_ok($recart, $subclass);
 
-        is($recart-&gt;count, 0);
+        is($recart-&gt;count, 0, 'have no items');
+
+        my $remaining_items = $subclass-&gt;storage-&gt;schema_instance-&gt;resultset('Items')-&gt;count;
+        is($remaining_items, $total_items - $related_items, 'deleted appropriate items');
     };
 
 };</diff>
      <filename>t/cart_clear.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,16 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 74;
+        plan tests =&gt; 110;
     };
 
     use_ok('Handel::Cart');
@@ -23,6 +23,8 @@ BEGIN {
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,82 +32,100 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/cart_delete_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
-
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
-
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
     ## test for Handel::Exception::Argument where first param is not a hashref
     {
         try {
+            local $ENV{'LANG'} = 'en';
             $subclass-&gt;delete(id =&gt; '1234');
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not a hash/i, 'not a hash in message');
         } otherwise {
-            fail;
+            fail('caught other exception');
         };
     };
 
 
+    my $total_items = $subclass-&gt;storage-&gt;schema_instance-&gt;resultset('Items')-&gt;count;
+    ok($total_items, 'has items in table');
+
+
     ## Delete a single cart item contents and validate counts
     {
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '22222222-2222-2222-2222-222222222222'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;count, 1);
-        is($cart-&gt;subtotal, 9.99);
 
-        is($cart-&gt;delete({sku =&gt; 'SKU3333'}), 1);
-        is($cart-&gt;count, 0);
-        is($cart-&gt;subtotal, 0);
+        my $related_items = $cart-&gt;count;
+        is($related_items, 1, 'has 1 item');
+        is($cart-&gt;subtotal+0, 9.99, 'subtotal is 9.99');
+        is($cart-&gt;delete({sku =&gt; 'SKU3333'}), 1, 'deleted sku3333');
+        is($cart-&gt;count, 0, 'has 0 items');
+        is($cart-&gt;subtotal+0, 0, 'subtotal is 0');
 
-        my $recart = $subclass-&gt;load({
+        my $reit = $subclass-&gt;search({
             id =&gt; '22222222-2222-2222-2222-222222222222'
         });
+        isa_ok($reit, 'Handel::Iterator');
+        is($reit, 1, 'loaded 1 cart');
+
+        my $recart = $reit-&gt;first;
         isa_ok($recart, 'Handel::Cart');
         isa_ok($recart, $subclass);
-        is($recart-&gt;count, 0);
-        is($recart-&gt;subtotal, 0.00);
+        is($recart-&gt;count, 0, 'has 0 items');
+        is($recart-&gt;subtotal+0, 0.00, 'subtotal is 0');
+
+        my $remaining_items = $subclass-&gt;storage-&gt;schema_instance-&gt;resultset('Items')-&gt;count;
+        is($remaining_items, $total_items - $related_items, 'other items still in table');
+
+        $total_items -= $related_items;
     };
 
 
-    ## Delete multiple cart item contents with wildcard filter and validate counts
+    ## Delete multiple cart item contents with wildcard filter and validate
+    ## counts using the old style wildcards
     {
-        my $cart = $subclass-&gt;load({
-            id =&gt; '11111111-1111-1111-1111-111111111111'
+        my $it = $subclass-&gt;search({
+            id =&gt; '33333333-3333-3333-3333-333333333333'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
 
-        ok($cart-&gt;delete({sku =&gt; 'SKU%'}));
-        is($cart-&gt;count, 0);
-        is($cart-&gt;subtotal, 0);
+        my $related_items = $cart-&gt;count;
+        is($related_items, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
+        ok($cart-&gt;delete({sku =&gt; 'SKU%'}), 'deleted SKU%');
+        is($cart-&gt;count, 0, 'has 0 items');
+        is($cart-&gt;subtotal+0, 0, 'subtotal is 0');
 
-        my $recart = $subclass-&gt;load({
-            id =&gt; '11111111-1111-1111-1111-111111111111'
+        my $reit = $subclass-&gt;search({
+            id =&gt; '33333333-3333-3333-3333-333333333333'
         });
+        isa_ok($reit, 'Handel::Iterator');
+        is($reit, 1, 'loaded 1 cart');
+
+        my $recart = $reit-&gt;first;
         isa_ok($recart, 'Handel::Cart');
         isa_ok($recart, $subclass);
-        is($recart-&gt;count, 0);
-        is($recart-&gt;subtotal, 0.00);
-    };
+        is($recart-&gt;count, 0, 'has 0 items');
+        is($recart-&gt;subtotal+0, 0.00, 'subtotal is 0');
 
+        my $remaining_items = $subclass-&gt;storage-&gt;schema_instance-&gt;resultset('Items')-&gt;count;
+        is($remaining_items, $total_items - $related_items, 'table still has unrelated items');
+    };
 };</diff>
      <filename>t/cart_delete.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,27 +2,30 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 35;
+        plan tests =&gt; 87;
     };
 
     use_ok('Handel::Cart');
     use_ok('Handel::Subclassing::Cart');
     use_ok('Handel::Subclassing::CartOnly');
-    use_ok('Handel::Constants', qw(:cart :returnas));
+    use_ok('Handel::Constants', qw(:cart));
     use_ok('Handel::Exception', ':try');
 };
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+my $altschema = Handel::Test-&gt;init_schema(db_file =&gt; 'althandel.db', namespace =&gt; 'Handel::AltSchema');
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,70 +33,140 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/cart_destroy_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
-
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
 
     ## Test for Handel::Exception::Argument where first param is not a hashref
     {
         try {
+            local $ENV{'LANG'} = 'en';
             $subclass-&gt;destroy(id =&gt; '1234');
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not a hash/i, 'not a hash in message');
         } otherwise {
-            fail;
+            fail('caught other exception');
         };
     };
 
 
+    my $total_carts = $subclass-&gt;storage-&gt;schema_instance-&gt;resultset('Carts')-&gt;count;
+    ok($total_carts, 'table has carts');
+
+    my $total_items = $subclass-&gt;storage-&gt;schema_instance-&gt;resultset('Items')-&gt;count;
+    ok($total_items, 'table has items');
+
+
     ## Destroy a single cart via instance
     {
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '22222222-2222-2222-2222-222222222222'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;count, 1);
-        is($cart-&gt;subtotal, 9.99);
+
+        my $related_items = $cart-&gt;count;
+        is($related_items, 1, 'has 1 item');
+        is($cart-&gt;subtotal+0, 9.99, 'subtotal is 9.99');
 
         $cart-&gt;destroy;
 
-        my $recart = $subclass-&gt;load({
+        my $reit = $subclass-&gt;search({
             id =&gt; '22222222-2222-2222-2222-222222222222'
         });
+        isa_ok($reit, 'Handel::Iterator');
+        is($reit, 0, 'has no cart');
+
+        my $recart = $reit-&gt;first;
+        is($recart, undef, 'has no cart');
+
+        my $remaining_carts = $subclass-&gt;storage-&gt;schema_instance-&gt;resultset('Carts')-&gt;count;
+        my $remaining_items = $subclass-&gt;storage-&gt;schema_instance-&gt;resultset('Items')-&gt;count;
 
-        is($recart, 0);
+        is($remaining_carts, $total_carts - 1, 'unrelated carts in table');
+        is($remaining_items, $total_items - $related_items, 'unrelated items in table');
+
+        $total_carts--;
+        $total_items -= $related_items;
     };
 
 
     ## Destroy multiple carts with wildcard filter
     {
-        my $carts = $subclass-&gt;load({name =&gt; 'Cart%'}, RETURNAS_ITERATOR);
+        my $carts = $subclass-&gt;search({description =&gt; {like =&gt; 'Saved%'}});
         isa_ok($carts, 'Handel::Iterator');
-        is($carts, 2);
+        is($carts, 1, 'loaded 1 cart');
+
+        my $related_items = $carts-&gt;first-&gt;items-&gt;count;
+        ok($related_items, 'has items');
 
         $subclass-&gt;destroy({
-            name =&gt; 'Cart%'
+            description =&gt; {like =&gt; 'Saved%'}
+        });
+
+        $carts = $subclass-&gt;search({description =&gt; {like =&gt; 'Saved%'}});
+        isa_ok($carts, 'Handel::Iterator');
+        is($carts, 0, 'cart not loaded');
+
+        my $remaining_carts = $subclass-&gt;storage-&gt;schema_instance-&gt;resultset('Carts')-&gt;count;
+        my $remaining_items = $subclass-&gt;storage-&gt;schema_instance-&gt;resultset('Items')-&gt;count;
+
+        is($remaining_carts, $total_carts - 1, 'table has unrelated carts');
+        is($remaining_items, $total_items - $related_items, 'table has unrelated items');
+    };
+
+
+    ## Destroy carts on an instance
+    {
+        my $instance = bless {}, $subclass;
+        my $carts = $subclass-&gt;search;
+        isa_ok($carts, 'Handel::Iterator');
+        is($carts, 1, 'loaded 1 cart');
+
+        $instance-&gt;destroy({
+            description =&gt; {like =&gt; '%'}
         });
 
-        $carts = $subclass-&gt;load({name =&gt; 'Cart%'}, RETURNAS_ITERATOR);
+        $carts = $subclass-&gt;search;
         isa_ok($carts, 'Handel::Iterator');
-        is($carts, 0);
+        is($carts, 0, 'no carts loaded');
     };
+};
+
+
+
+## pass in storage instead
+{
+    my $storage = Handel::Cart-&gt;storage_class-&gt;new;
+    local $ENV{'HandelDBIDSN'} = $altschema-&gt;dsn;
+
+    is($altschema-&gt;resultset('Carts')-&gt;search({id =&gt; '11111111-1111-1111-1111-111111111111'})-&gt;count, 1, 'cart found in alt storage');
+    Handel::Cart-&gt;destroy({
+        id =&gt; '11111111-1111-1111-1111-111111111111'
+    }, {
+        storage =&gt; $storage
+    });
+    is($altschema-&gt;resultset('Carts')-&gt;search({id =&gt; '11111111-1111-1111-1111-111111111111'})-&gt;count, 0, 'cart removed from alt storage');
+};
+
+
+## don't unset self if no result is returned
+{
+    my $storage = Handel::Cart-&gt;storage_class-&gt;new;
+    local $ENV{'HandelDBIDSN'} = $altschema-&gt;dsn;
+
+    my $cart = Handel::Cart-&gt;search({id =&gt; '22222222-2222-2222-2222-222222222222'}, {storage =&gt; $storage})-&gt;first;
+    ok($cart, 'cart still defined if nothing deleted');
 
+    no warnings 'redefine';
+    local *Handel::Storage::DBIC::Result::delete = sub {};
+    $cart-&gt;destroy;
+    ok($cart, 'cart still defined if delete returns nothing');
 };</diff>
      <filename>t/cart_destroy.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,27 +2,29 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 378;
+        plan tests =&gt; 491;
     };
 
     use_ok('Handel::Cart');
     use_ok('Handel::Subclassing::Cart');
     use_ok('Handel::Subclassing::CartOnly');
-    use_ok('Handel::Constants', qw(:cart :returnas));
+    use_ok('Handel::Constants', qw(:cart));
     use_ok('Handel::Exception', ':try');
 };
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,84 +32,78 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/cart_items_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
-
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
 
-    ## load multiple item Handel::Cart object and get items array on RETURNAS_AUTO
+    ## load multiple item Handel::Cart object and get items array
     {
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
         my @items = $cart-&gt;items;
-        is(scalar @items, $cart-&gt;count);
+        is(scalar @items, $cart-&gt;count, 'loaded all items');
 
         my $item1 = $items[0];
         isa_ok($item1, 'Handel::Cart::Item');
         isa_ok($item1, $itemclass);
-        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item1-&gt;cart, $cart-&gt;id);
-        is($item1-&gt;sku, 'SKU1111');
-        is($item1-&gt;quantity, 1);
-        is($item1-&gt;price, 1.11);
-        is($item1-&gt;description, 'Line Item SKU 1');
-        is($item1-&gt;total, 1.11);
+        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item1-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item1-&gt;sku, 'SKU1111', 'got sku');
+        is($item1-&gt;quantity, 1, 'quantity is 1');
+        is($item1-&gt;price+0, 1.11, 'price is 1.11');
+        is($item1-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item1-&gt;total+0, 1.11, 'total is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item1-&gt;custom, 'custom');
+            is($item1-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item2 = $items[1];
         isa_ok($item2, 'Handel::Cart::Item');
         isa_ok($item2, $itemclass);
-        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item2-&gt;cart, $cart-&gt;id);
-        is($item2-&gt;sku, 'SKU2222');
-        is($item2-&gt;quantity, 2);
-        is($item2-&gt;price, 2.22);
-        is($item2-&gt;description, 'Line Item SKU 2');
-        is($item2-&gt;total, 4.44);
+        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item2-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item2-&gt;sku, 'SKU2222', 'got sku');
+        is($item2-&gt;quantity, 2, 'quantity is 2');
+        is($item2-&gt;price+0, 2.22, 'price is 2.22');
+        is($item2-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item2-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item2-&gt;custom, 'custom');
+            is($item2-&gt;custom, 'custom', 'got custom field');
         };
 
         ## While we are here, lets poop out a max quantity exception
-        ## THere should be a better place for this, but I haven't found it yet. :-)
+        ## There should be a better place for this, but I haven't found it yet. :-)
         {
             local $ENV{'HandelMaxQuantity'} = 5;
             local $ENV{'HandelMaxQuantityAction'} = 'Exception';
 
             try {
                 $item2-&gt;quantity(6);
+
+                fail('no exception thrown');
             } catch Handel::Exception::Constraint with {
-                pass;
+                pass('caught constraint exception');
+                like(shift, qr/failed database constraint/i, 'failed constraint in message');
             } otherwise {
-                fail;
+                fail('caught other exception');
             };
         };
 
@@ -118,186 +114,283 @@ sub run {
             local $ENV{'HandelMaxQuantity'} = 2;
 
             $item2-&gt;quantity(6);
-            is($item2-&gt;quantity, 2);
+            is($item2-&gt;quantity, 2, 'quantity is 2');
         };
+
+
+        ## throw exception when filter isn't a hashref
+        {
+            try {
+                local $ENV{'LANG'} = 'en';
+                $cart-&gt;items(['foo']);
+
+                fail('no exception thrown');
+            } catch Handel::Exception::Argument with {
+                pass('Argument exception thrown');
+                like(shift, qr/not a hash/i, 'not a hash ref in message');
+            } otherwise {
+                fail('Other exception thrown');
+            };
+        };
+
+
+        ## throw exception when options isn't a hashref
+        {
+            try {
+                local $ENV{'LANG'} = 'en';
+                $cart-&gt;items({}, []);
+
+                fail('no exception thrown');
+            } catch Handel::Exception::Argument with {
+                pass('Argument exception thrown');
+                like(shift, qr/not a hash/i, 'not a hash ref in message');
+            } otherwise {
+                fail('Other exception thrown');
+            };
+        };
+
+
+        ## test out order_by
+        my @oitems = $cart-&gt;items(undef, {order_by =&gt; 'id DESC'});
+        is(scalar @oitems, 2, 'has 2 ordered items');
+        is($oitems[0]-&gt;id, '22222222-2222-2222-2222-222222222222', 'first item is last');
+        is($oitems[1]-&gt;id, '11111111-1111-1111-1111-111111111111', 'last item is first');
     };
 
 
-    ## load multiple item Handel::Cart object and get items array on RETURNAS_LIST
+    ## load multiple item Handel::Cart object and get items array
     {
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'total is 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
-        my @items = $cart-&gt;items(undef, RETURNAS_LIST);
-        is(scalar @items, $cart-&gt;count);
+        my @items = $cart-&gt;items();
+        is(scalar @items, $cart-&gt;count, 'loaded same items');
 
         my $item1 = $items[0];
         isa_ok($item1, 'Handel::Cart::Item');
         isa_ok($item1, $itemclass);
-        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item1-&gt;cart, $cart-&gt;id);
-        is($item1-&gt;sku, 'SKU1111');
-        is($item1-&gt;quantity, 1);
-        is($item1-&gt;price, 1.11);
-        is($item1-&gt;description, 'Line Item SKU 1');
-        is($item1-&gt;total, 1.11);
+        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item1-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item1-&gt;sku, 'SKU1111', 'got sku');
+        is($item1-&gt;quantity, 1, 'quantity is 1');
+        is($item1-&gt;price+0, 1.11, 'price is 1.11');
+        is($item1-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item1-&gt;total+0, 1.11, 'total is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item1-&gt;custom, 'custom');
+            is($item1-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item2 = $items[1];
         isa_ok($item2, 'Handel::Cart::Item');
         isa_ok($item2, $itemclass);
-        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item2-&gt;cart, $cart-&gt;id);
-        is($item2-&gt;sku, 'SKU2222');
-        is($item2-&gt;quantity, 2);
-        is($item2-&gt;price, 2.22);
-        is($item2-&gt;description, 'Line Item SKU 2');
-        is($item2-&gt;total, 4.44);
+        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item2-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item2-&gt;sku, 'SKU2222', 'got sku');
+        is($item2-&gt;quantity, 2, 'quantity is 2');
+        is($item2-&gt;price+0, 2.22, 'price is 2.22');
+        is($item2-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item2-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item2-&gt;custom, 'custom');
+            is($item2-&gt;custom, 'custom', 'got custom field');
         };
     };
 
 
     ## load multiple item Handel::Cart object and get items Iterator
     {
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
         my $items = $cart-&gt;items;
         isa_ok($items, 'Handel::Iterator');
-        is($items-&gt;count, 2);
+        is($items-&gt;count, 2, 'has 2 items');
     };
 
 
     ## load multiple item Handel::Cart object and get filter single item
     {
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $item2 = $cart-&gt;items({sku =&gt; 'SKU2222'});
+        my $itemit = $cart-&gt;items({sku =&gt; 'SKU2222'});
+        isa_ok($itemit, 'Handel::Iterator');
+        is($itemit, 1, 'has 1 item');
+
+        my $item2 = $itemit-&gt;first;
         isa_ok($item2, 'Handel::Cart::Item');
         isa_ok($item2, $itemclass);
-        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item2-&gt;cart, $cart-&gt;id);
-        is($item2-&gt;sku, 'SKU2222');
-        is($item2-&gt;quantity, 2);
-        is($item2-&gt;price, 2.22);
-        is($item2-&gt;description, 'Line Item SKU 2');
-        is($item2-&gt;total, 4.44);
+        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item2-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item2-&gt;sku, 'SKU2222', 'got sku');
+        is($item2-&gt;quantity, 2, 'quantity is 2');
+        is($item2-&gt;price+0, 2.22, 'price is 2.22');
+        is($item2-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item2-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item2-&gt;custom, 'custom');
+            is($item2-&gt;custom, 'custom', 'got custom field');
         };
     };
 
 
     ## load multiple item Handel::Cart object and get filter single item to Iterator
     {
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
+            id =&gt; '11111111-1111-1111-1111-111111111111'
+        });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
+        isa_ok($cart, 'Handel::Cart');
+        isa_ok($cart, $subclass);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
+        if ($subclass ne 'Handel::Cart') {
+            is($cart-&gt;custom, 'custom', 'got custom field');
+        };
+
+        my $iterator = $cart-&gt;items({sku =&gt; 'SKU2222'});
+        isa_ok($iterator, 'Handel::Iterator');
+    };
+
+
+    ## load multiple item Handel::Cart object and get wildcard filter to Iterator
+    ## using SQL::Abstract wildcard syntax
+    {
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $iterator = $cart-&gt;items({sku =&gt; 'SKU2222'}, 1);
+        my $iterator = $cart-&gt;items({sku =&gt; {like=&gt;'SKU%'}});
         isa_ok($iterator, 'Handel::Iterator');
+        is($iterator, 2, 'has 2 items');
     };
 
 
     ## load multiple item Handel::Cart object and get wildcard filter to Iterator
+    ## using old style wildcard syntax
     {
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal is 2.22');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $iterator = $cart-&gt;items({sku =&gt; 'SKU%'}, 1);
+        my $iterator = $cart-&gt;items({sku =&gt; 'SKU%'});
         isa_ok($iterator, 'Handel::Iterator');
-        is($iterator, 2);
+        is($iterator, 2, 'has 2 items');
     };
 
 
     ## load multiple item Handel::Cart object and get filter bogus item to Iterator
     {
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $iterator = $cart-&gt;items({sku =&gt; 'notfound'}, 1);
+        my $iterator = $cart-&gt;items({sku =&gt; 'notfound'});
         isa_ok($iterator, 'Handel::Iterator');
     };
 </diff>
      <filename>t/cart_items.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,11 +2,11 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
@@ -23,6 +23,8 @@ BEGIN {
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,158 +32,144 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/cart_iterator_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
-
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
-
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
     ## load all carts and iterator all cart and all items
     {
-        my $carts = $subclass-&gt;load(undef, 1);
+        my $carts = $subclass-&gt;search;
         isa_ok($carts, 'Handel::Iterator');
-        is($carts-&gt;count, 3);
+        is($carts-&gt;count, 3, 'loaded 3 ');
 
         my $cart1 = $carts-&gt;next;
         isa_ok($cart1, 'Handel::Cart');
         isa_ok($cart1, $subclass);
-        is($cart1-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart1-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart1-&gt;type, CART_TYPE_TEMP);
-        is($cart1-&gt;name, 'Cart 1');
-        is($cart1-&gt;description, 'Test Temp Cart 1');
-        is($cart1-&gt;count, 2);
-        is($cart1-&gt;subtotal, 5.55);
+        is($cart1-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart1-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart1-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart1-&gt;name, 'Cart 1', 'got name');
+        is($cart1-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart1-&gt;count, 2, 'has 2 items');
+        is($cart1-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart1-&gt;custom, 'custom');
+            is($cart1-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items = $cart1-&gt;items(undef, 1);
+        my $items = $cart1-&gt;items;
         isa_ok($items, 'Handel::Iterator');
-        is($items-&gt;count, 2);
+        is($items-&gt;count, 2, 'has 2 items');
 
         my $item1 = $items-&gt;next;
         isa_ok($item1, 'Handel::Cart::Item');
         isa_ok($item1, $itemclass);
-        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item1-&gt;cart, $cart1-&gt;id);
-        is($item1-&gt;sku, 'SKU1111');
-        is($item1-&gt;quantity, 1);
-        is($item1-&gt;price, 1.11);
-        is($item1-&gt;description, 'Line Item SKU 1');
-        is($item1-&gt;total, 1.11);
+        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item1-&gt;cart, $cart1-&gt;id, 'cart id is set');
+        is($item1-&gt;sku, 'SKU1111', 'got sku');
+        is($item1-&gt;quantity, 1, 'quantity is 1');
+        is($item1-&gt;price+0, 1.11, 'price is 1.11');
+        is($item1-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item1-&gt;total+0, 1.11, 'total is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item1-&gt;custom, 'custom');
+            is($item1-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item2 = $items-&gt;next;
         isa_ok($item2, 'Handel::Cart::Item');
         isa_ok($item2, $itemclass);
-        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item2-&gt;cart, $cart1-&gt;id);
-        is($item2-&gt;sku, 'SKU2222');
-        is($item2-&gt;quantity, 2);
-        is($item2-&gt;price, 2.22);
-        is($item2-&gt;description, 'Line Item SKU 2');
-        is($item2-&gt;total, 4.44);
+        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item2-&gt;cart, $cart1-&gt;id, 'cart id is set');
+        is($item2-&gt;sku, 'SKU2222', 'got sku');
+        is($item2-&gt;quantity, 2, 'quantity is 2');
+        is($item2-&gt;price+0, 2.22, 'price is 2.22');
+        is($item2-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item2-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item2-&gt;custom, 'custom');
+            is($item2-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item3 = $items-&gt;next;
-        is($item3, undef);
+        is($item3, undef, 'no more items');
 
         my $cart2 = $carts-&gt;next;
         isa_ok($cart2, 'Handel::Cart');
         isa_ok($cart2, $subclass);
-        is($cart2-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($cart2-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart2-&gt;type, CART_TYPE_TEMP);
-        is($cart2-&gt;name, 'Cart 2');
-        is($cart2-&gt;description, 'Test Temp Cart 2');
-        is($cart2-&gt;count, 1);
-        is($cart2-&gt;subtotal, 9.99);
+        is($cart2-&gt;id, '22222222-2222-2222-2222-222222222222', 'got cart id');
+        is($cart2-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart2-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart2-&gt;name, 'Cart 2', 'got name');
+        is($cart2-&gt;description, 'Test Temp Cart 2', 'got description');
+        is($cart2-&gt;count, 1, 'has 1 item');
+        is($cart2-&gt;subtotal+0, 9.99, 'subtotal is 9.99');
         if ($subclass ne 'Handel::Cart') {
-            is($cart2-&gt;custom, 'custom');
+            is($cart2-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items2 = $cart2-&gt;items(undef, 1);
+        my $items2 = $cart2-&gt;items;
         isa_ok($items2, 'Handel::Iterator');
-        is($items2-&gt;count, 1);
+        is($items2-&gt;count, 1, 'has 1 item');
 
         my $item4 = $items2-&gt;next;
         isa_ok($item4, 'Handel::Cart::Item');
         isa_ok($item4, $itemclass);
-        is($item4-&gt;id, '33333333-3333-3333-3333-333333333333');
-        is($item4-&gt;cart, $cart2-&gt;id);
-        is($item4-&gt;sku, 'SKU3333');
-        is($item4-&gt;quantity, 3);
-        is($item4-&gt;price, 3.33);
-        is($item4-&gt;description, 'Line Item SKU 3');
-        is($item4-&gt;total, 9.99);
+        is($item4-&gt;id, '33333333-3333-3333-3333-333333333333', 'got item id');
+        is($item4-&gt;cart, $cart2-&gt;id, 'cart id is set');
+        is($item4-&gt;sku, 'SKU3333', 'got sku');
+        is($item4-&gt;quantity, 3, 'quantity is 3');
+        is($item4-&gt;price+0, 3.33, 'price is 3.33');
+        is($item4-&gt;description, 'Line Item SKU 3', 'got description');
+        is($item4-&gt;total+0, 9.99, 'total is 9.99');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item4-&gt;custom, 'custom');
+            is($item4-&gt;custom, 'custom', 'got custom field');
         };
 
         my $cart3 = $carts-&gt;next;
         isa_ok($cart3, 'Handel::Cart');
         isa_ok($cart3, $subclass);
-        is($cart3-&gt;id, '33333333-3333-3333-3333-333333333333');
-        is($cart3-&gt;shopper, '33333333-3333-3333-3333-333333333333');
-        is($cart3-&gt;type, CART_TYPE_SAVED);
-        is($cart3-&gt;name, 'Cart 3');
-        is($cart3-&gt;description, 'Saved Cart 1');
-        is($cart3-&gt;count, 2);
-        is($cart3-&gt;subtotal, 45.51);
+        is($cart3-&gt;id, '33333333-3333-3333-3333-333333333333', 'got cart id');
+        is($cart3-&gt;shopper, '33333333-3333-3333-3333-333333333333', 'got shopper id');
+        is($cart3-&gt;type, CART_TYPE_SAVED, 'got saved type');
+        is($cart3-&gt;name, 'Cart 3', 'got name');
+        is($cart3-&gt;description, 'Saved Cart 1', 'got description');
+        is($cart3-&gt;count, 2, 'has 2 items');
+        is($cart3-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
         if ($subclass ne 'Handel::Cart') {
-            is($cart3-&gt;custom, 'custom');
+            is($cart3-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items3 = $cart3-&gt;items(undef, 1);
+        my $items3 = $cart3-&gt;items;
         isa_ok($items3, 'Handel::Iterator');
-        is($items3-&gt;count, 2);
+        is($items3-&gt;count, 2, 'has 2 items');
 
         my $item5 = $items3-&gt;next;
         isa_ok($item5, 'Handel::Cart::Item');
         isa_ok($item5, $itemclass);
-        is($item5-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item5-&gt;cart, $cart3-&gt;id);
-        is($item5-&gt;sku, 'SKU4444');
-        is($item5-&gt;quantity, 4);
-        is($item5-&gt;price, 4.44);
-        is($item5-&gt;description, 'Line Item SKU 4');
-        is($item5-&gt;total, 17.76);
+        is($item5-&gt;id, '44444444-4444-4444-4444-444444444444', 'got item id');
+        is($item5-&gt;cart, $cart3-&gt;id, 'cart id is set');
+        is($item5-&gt;sku, 'SKU4444', 'got sku');
+        is($item5-&gt;quantity, 4, 'quantity is 4');
+        is($item5-&gt;price+0, 4.44, 'prive is 4.44');
+        is($item5-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item5-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item5-&gt;custom, 'custom');
+            is($item5-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item6 = $items3-&gt;next;
         isa_ok($item6, 'Handel::Cart::Item');
         isa_ok($item6, $itemclass);
-        is($item6-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item6-&gt;cart, $cart3-&gt;id);
-        is($item6-&gt;sku, 'SKU1111');
-        is($item6-&gt;quantity, 5);
-        is($item6-&gt;price, 5.55);
-        is($item6-&gt;description, 'Line Item SKU 5');
-        is($item6-&gt;total, 27.75);
+        is($item6-&gt;id, '55555555-5555-5555-5555-555555555555', 'got item id');
+        is($item6-&gt;cart, $cart3-&gt;id, 'cart id is set');
+        is($item6-&gt;sku, 'SKU1111', 'got sku');
+        is($item6-&gt;quantity, 5, 'quantity is 5');
+        is($item6-&gt;price+0, 5.55, 'price is 5.55');
+        is($item6-&gt;description, 'Line Item SKU 5', 'got sku');
+        is($item6-&gt;total+0, 27.75, 'titak us 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item6-&gt;custom, 'custom');
+            is($item6-&gt;custom, 'custom', 'got custom field');
         };
 
         my $cart4 = $carts-&gt;next;
-        is($cart4, undef);
+        is($cart4, undef, 'no carts left');
     };
 
 };</diff>
      <filename>t/cart_iterator.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,10 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
 
 BEGIN {
-    eval 'require DBD::SQLite';
-    if($@) {
-        plan skip_all =&gt; 'DBD::SQLite not installed';
-    } else {
-        plan tests =&gt; 10;
-    };
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 16;
 
     use_ok('Handel::Cart');
     use_ok('Handel::Subclassing::Cart');
@@ -33,13 +27,15 @@ sub run {
     ## or Handle::Cart subclass
     {
         try {
+            local $ENV{'LANG'} = 'en';
             $subclass-&gt;restore(id =&gt; '1234');
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('Argument exception thrown');
+            like(shift, qr/not a hash/i, 'no a hash ref in message');
         } otherwise {
-            fail;
+            fail('Other exception thrown');
         };
     };
 
@@ -48,15 +44,16 @@ sub run {
     ## or Handle::Cart::Item subclass
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $fakeitem = bless {}, 'FakeItem';
             $subclass-&gt;restore($fakeitem);
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('Argument exception thrown');
+            like(shift, qr/not a hash/i, 'no a hash ref in message');
         } otherwise {
-            fail;
+            fail('Other exception thrown');
         };
     };
-
 };</diff>
      <filename>t/cart_restore.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,16 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 413;
+        plan tests =&gt; 437;
     };
 
     use_ok('Handel::Cart');
@@ -23,6 +23,8 @@ BEGIN {
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,20 +32,27 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
-    ## Setup SQLite DB for tests
+
+    ## test for Handel::Exception::Argument where with unknown restore mode
     {
-        my $dbfile  = &quot;t/cart_restore_append_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
+        my $cart = $subclass-&gt;search({
+            id =&gt; '11111111-1111-1111-1111-111111111111'
+        })-&gt;first;
 
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
+        try {
+            local $ENV{'LANG'} = 'en';
+            $cart-&gt;restore({id =&gt; '1234'}, 42);
 
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
+            fail('no exception thrown');
+        } catch Handel::Exception::Argument with {
+            pass('Argument exception thrown');
+            like(shift, qr/unknown restore mode/i, 'unknown restore more in message');
+        } otherwise {
+            fail('Other exception thrown');
+        };
     };
 
 
@@ -51,223 +60,235 @@ sub run {
     ## just for sanity sake, we're checking all cart and item values
     {
         # load the temp cart
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items = $cart-&gt;items(undef, 1);
+        my $items = $cart-&gt;items;
         isa_ok($items, 'Handel::Iterator');
-        is($items-&gt;count, 2);
+        is($items-&gt;count, 2, 'loaded 2 items');
 
         my $item1 = $items-&gt;next;
         isa_ok($item1, 'Handel::Cart::Item');
         isa_ok($item1, $itemclass);
-        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item1-&gt;cart, $cart-&gt;id);
-        is($item1-&gt;sku, 'SKU1111');
-        is($item1-&gt;quantity, 1);
-        is($item1-&gt;price, 1.11);
-        is($item1-&gt;description, 'Line Item SKU 1');
-        is($item1-&gt;total, 1.11);
+        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item1-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item1-&gt;sku, 'SKU1111', 'got sku');
+        is($item1-&gt;quantity, 1, 'quantity is 1');
+        is($item1-&gt;price+0, 1.11, 'price is 1.11');
+        is($item1-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item1-&gt;total+0, 1.11, 'total is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item1-&gt;custom, 'custom');
+            is($item1-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item2 = $items-&gt;next;
         isa_ok($item2, 'Handel::Cart::Item');
         isa_ok($item2, $itemclass);
-        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item2-&gt;cart, $cart-&gt;id);
-        is($item2-&gt;sku, 'SKU2222');
-        is($item2-&gt;quantity, 2);
-        is($item2-&gt;price, 2.22);
-        is($item2-&gt;description, 'Line Item SKU 2');
-        is($item2-&gt;total, 4.44);
+        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item2-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item2-&gt;sku, 'SKU2222', 'got sku');
+        is($item2-&gt;quantity, 2, 'quantity is 2');
+        is($item2-&gt;price+0, 2.22, 'price is 2.22');
+        is($item2-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item2-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item2-&gt;custom, 'custom');
+            is($item2-&gt;custom, 'custom', 'got custom field');
         };
 
         # load the saved cart
-        my $saved = $subclass-&gt;load({
+        my $sit = $subclass-&gt;search({
             id =&gt; '33333333-3333-3333-3333-333333333333'
         });
+        isa_ok($sit, 'Handel::Iterator');
+        is($sit, 1, 'loaded 1 cart');
+
+        my $saved = $sit-&gt;first;
         isa_ok($saved, 'Handel::Cart');
         isa_ok($saved, $subclass);
-        is($saved-&gt;id, '33333333-3333-3333-3333-333333333333');
-        is($saved-&gt;shopper, '33333333-3333-3333-3333-333333333333');
-        is($saved-&gt;type, CART_TYPE_SAVED);
-        is($saved-&gt;name, 'Cart 3');
-        is($saved-&gt;description, 'Saved Cart 1');
-        is($saved-&gt;count, 2);
-        is($saved-&gt;subtotal, 45.51);
+        is($saved-&gt;id, '33333333-3333-3333-3333-333333333333', 'got cart id');
+        is($saved-&gt;shopper, '33333333-3333-3333-3333-333333333333', 'got shopper id');
+        is($saved-&gt;type, CART_TYPE_SAVED, 'got temp type');
+        is($saved-&gt;name, 'Cart 3', 'got name');
+        is($saved-&gt;description, 'Saved Cart 1', 'got description');
+        is($saved-&gt;count, 2, 'has 2 items');
+        is($saved-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
         if ($subclass ne 'Handel::Cart') {
-            is($saved-&gt;custom, 'custom');
+            is($saved-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items2 = $saved-&gt;items(undef, 1);
+        my $items2 = $saved-&gt;items();
         isa_ok($items2, 'Handel::Iterator');
-        is($items2-&gt;count, 2);
+        is($items2-&gt;count, 2, 'loaded 2 items');
 
         my $item3 = $items2-&gt;next;
         isa_ok($item3, 'Handel::Cart::Item');
         isa_ok($item3, $itemclass);
-        is($item3-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item3-&gt;cart, $saved-&gt;id);
-        is($item3-&gt;sku, 'SKU4444');
-        is($item3-&gt;quantity, 4);
-        is($item3-&gt;price, 4.44);
-        is($item3-&gt;description, 'Line Item SKU 4');
-        is($item3-&gt;total, 17.76);
+        is($item3-&gt;id, '44444444-4444-4444-4444-444444444444', 'got item id');
+        is($item3-&gt;cart, $saved-&gt;id, 'cart id is set');
+        is($item3-&gt;sku, 'SKU4444', 'got sku');
+        is($item3-&gt;quantity, 4, 'quantity is 4');
+        is($item3-&gt;price+0, 4.44, 'price is 4.44');
+        is($item3-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item3-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item3-&gt;custom, 'custom');
+            is($item3-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item4 = $items2-&gt;next;
         isa_ok($item4, 'Handel::Cart::Item');
         isa_ok($item4, $itemclass);
-        is($item4-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item4-&gt;cart, $saved-&gt;id);
-        is($item4-&gt;sku, 'SKU1111');
-        is($item4-&gt;quantity, 5);
-        is($item4-&gt;price, 5.55);
-        is($item4-&gt;description, 'Line Item SKU 5');
-        is($item4-&gt;total, 27.75);
+        is($item4-&gt;id, '55555555-5555-5555-5555-555555555555', 'got item id');
+        is($item4-&gt;cart, $saved-&gt;id, 'cart id is set');
+        is($item4-&gt;sku, 'SKU1111', 'got sku');
+        is($item4-&gt;quantity, 5, 'quantity is 5');
+        is($item4-&gt;price+0, 5.55, 'price is 5.55');
+        is($item4-&gt;description, 'Line Item SKU 5', 'got description');
+        is($item4-&gt;total+0, 27.75, 'total is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item4-&gt;custom, 'custom');
+            is($item4-&gt;custom, 'custom', 'got custom field');
         };
 
 
         # restore the saved cart replacing the temp cart and verify the results
         $cart-&gt;restore($saved, CART_MODE_APPEND);
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 4);
-        is($cart-&gt;subtotal, 51.06);
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 4, 'has 4 items');
+        is($cart-&gt;subtotal+0, 51.06, 'subtotal is 51.06');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items3 = $cart-&gt;items(undef, 1);
+        my $items3 = $cart-&gt;items;
         isa_ok($items3, 'Handel::Iterator');
-        is($items3-&gt;count, 4);
+        is($items3-&gt;count, 4, 'loaded 4 items');
 
         my $item5 = $items3-&gt;next;
         isa_ok($item5, 'Handel::Cart::Item');
         isa_ok($item5, $itemclass);
-        is($item5-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item5-&gt;cart, $cart-&gt;id);
-        is($item5-&gt;sku, 'SKU1111');
-        is($item5-&gt;quantity, 1);
-        is($item5-&gt;price, 1.11);
-        is($item5-&gt;description, 'Line Item SKU 1');
-        is($item5-&gt;total, 1.11);
+        is($item5-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item5-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item5-&gt;sku, 'SKU1111', 'got sku');
+        is($item5-&gt;quantity, 1, 'quantity is 1');
+        is($item5-&gt;price+0, 1.11, 'price is 1.11');
+        is($item5-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item5-&gt;total+0, 1.11, 'price is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item5-&gt;custom, 'custom');
+            is($item5-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item6 = $items3-&gt;next;
         isa_ok($item6, 'Handel::Cart::Item');
         isa_ok($item6, $itemclass);
-        is($item6-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item6-&gt;cart, $cart-&gt;id);
-        is($item6-&gt;sku, 'SKU2222');
-        is($item6-&gt;quantity, 2);
-        is($item6-&gt;price, 2.22);
-        is($item6-&gt;description, 'Line Item SKU 2');
-        is($item6-&gt;total, 4.44);
+        is($item6-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item6-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item6-&gt;sku, 'SKU2222', 'got sku');
+        is($item6-&gt;quantity, 2, 'quantity is 2');
+        is($item6-&gt;price+0, 2.22, 'price is 2.22');
+        is($item6-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item6-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item6-&gt;custom, 'custom');
+            is($item6-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item7 = $items3-&gt;next;
         isa_ok($item7, 'Handel::Cart::Item');
         isa_ok($item7, $itemclass);
-        isnt($item7-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item7-&gt;cart, $cart-&gt;id);
-        is($item7-&gt;sku, 'SKU4444');
-        is($item7-&gt;quantity, 4);
-        is($item7-&gt;price, 4.44);
-        is($item7-&gt;description, 'Line Item SKU 4');
-        is($item7-&gt;total, 17.76);
+        isnt($item7-&gt;id, '44444444-4444-4444-4444-444444444444', 'got different id');
+        is($item7-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item7-&gt;sku, 'SKU4444', 'got sku');
+        is($item7-&gt;quantity, 4, 'quantity is 4');
+        is($item7-&gt;price+0, 4.44, 'price is 4.44');
+        is($item7-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item7-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item7-&gt;custom, 'custom');
+            is($item7-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item8 = $items3-&gt;next;
         isa_ok($item8, 'Handel::Cart::Item');
         isa_ok($item8, $itemclass);
-        isnt($item8-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item8-&gt;cart, $cart-&gt;id);
-        is($item8-&gt;sku, 'SKU1111');
-        is($item8-&gt;quantity, 5);
-        is($item8-&gt;price, 5.55);
-        is($item8-&gt;description, 'Line Item SKU 5');
-        is($item8-&gt;total, 27.75);
+        isnt($item8-&gt;id, '55555555-5555-5555-5555-555555555555', 'got item id');
+        is($item8-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item8-&gt;sku, 'SKU1111', 'got sku');
+        is($item8-&gt;quantity, 5, 'quantity is 5');
+        is($item8-&gt;price+0, 5.55, 'price is 5.55');
+        is($item8-&gt;description, 'Line Item SKU 5', 'got description');
+        is($item8-&gt;total+0, 27.75, 'total is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item8-&gt;custom, 'custom');
+            is($item8-&gt;custom, 'custom', 'got custom field');
         };
 
 
         # load the saved cart again
-        my $saved2 = $subclass-&gt;load({
+        my $saved2it = $subclass-&gt;search({
             id =&gt; '33333333-3333-3333-3333-333333333333'
         });
+        isa_ok($saved2it, 'Handel::Iterator');
+        is($saved2it, 1, 'loaded 1 cart');
+
+        my $saved2 = $saved2it-&gt;first;
         isa_ok($saved2, 'Handel::Cart');
         isa_ok($saved2, $subclass);
-        is($saved2-&gt;id, '33333333-3333-3333-3333-333333333333');
-        is($saved2-&gt;shopper, '33333333-3333-3333-3333-333333333333');
-        is($saved2-&gt;type, CART_TYPE_SAVED);
-        is($saved2-&gt;name, 'Cart 3');
-        is($saved2-&gt;description, 'Saved Cart 1');
-        is($saved2-&gt;count, 2);
-        is($saved2-&gt;subtotal, 45.51);
+        is($saved2-&gt;id, '33333333-3333-3333-3333-333333333333', 'got cart id');
+        is($saved2-&gt;shopper, '33333333-3333-3333-3333-333333333333', 'got shopper id');
+        is($saved2-&gt;type, CART_TYPE_SAVED, 'got saved type');
+        is($saved2-&gt;name, 'Cart 3', 'got name');
+        is($saved2-&gt;description, 'Saved Cart 1', 'got description');
+        is($saved2-&gt;count, 2, 'has 2 items');
+        is($saved2-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
         if ($subclass ne 'Handel::Cart') {
-            is($saved2-&gt;custom, 'custom');
+            is($saved2-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items4 = $saved2-&gt;items(undef, 1);
+        my $items4 = $saved2-&gt;items;
         isa_ok($items4, 'Handel::Iterator');
-        is($items4-&gt;count, 2);
+        is($items4-&gt;count, 2, 'loaded 2 items');
 
         my $item9 = $items4-&gt;next;
         isa_ok($item9, 'Handel::Cart::Item');
         isa_ok($item9, $itemclass);
-        is($item9-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item9-&gt;cart, $saved2-&gt;id);
-        is($item9-&gt;sku, 'SKU4444');
-        is($item9-&gt;quantity, 4);
-        is($item9-&gt;price, 4.44);
-        is($item9-&gt;description, 'Line Item SKU 4');
-        is($item9-&gt;total, 17.76);
+        is($item9-&gt;id, '44444444-4444-4444-4444-444444444444', 'got item id');
+        is($item9-&gt;cart, $saved2-&gt;id, 'cart id is set');
+        is($item9-&gt;sku, 'SKU4444', 'got sku');
+        is($item9-&gt;quantity, 4, 'quantity is 4');
+        is($item9-&gt;price+0, 4.44, 'price is 4.44');
+        is($item9-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item9-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item9-&gt;custom, 'custom');
+            is($item9-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item10 = $items4-&gt;next;
         isa_ok($item10, 'Handel::Cart::Item');
         isa_ok($item10, $itemclass);
-        is($item10-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item10-&gt;cart, $saved2-&gt;id);
-        is($item10-&gt;sku, 'SKU1111');
-        is($item10-&gt;quantity, 5);
-        is($item10-&gt;price, 5.55);
-        is($item10-&gt;description, 'Line Item SKU 5');
-        is($item10-&gt;total, 27.75);
+        is($item10-&gt;id, '55555555-5555-5555-5555-555555555555', 'got item id');
+        is($item10-&gt;cart, $saved2-&gt;id, 'cart id is set');
+        is($item10-&gt;sku, 'SKU1111', 'got sku');
+        is($item10-&gt;quantity, 5, 'quantity is 5');
+        is($item10-&gt;price+0, 5.55, 'price is 5.55');
+        is($item10-&gt;description, 'Line Item SKU 5', 'got description');
+        is($item10-&gt;total+0, 27.75, 'total is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item10-&gt;custom, 'custom');
+            is($item10-&gt;custom, 'custom', 'got custom field');
         };
     };
 </diff>
      <filename>t/cart_restore_append.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,16 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 320;
+        plan tests =&gt; 332;
     };
 
     use_ok('Handel::Cart');
@@ -23,6 +23,8 @@ BEGIN {
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,193 +32,188 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/cart_restore_append_filter_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
-
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
 
     ## restore saved cart appending items to current cart
     ## just for sanity sake, we're checking all cart and item values
     {
         # load the temp cart
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items = $cart-&gt;items(undef, 1);
+        my $items = $cart-&gt;items;
         isa_ok($items, 'Handel::Iterator');
-        is($items-&gt;count, 2);
+        is($items-&gt;count, 2, 'loaded 2 items');
 
         my $item1 = $items-&gt;next;
         isa_ok($item1, 'Handel::Cart::Item');
         isa_ok($item1, $itemclass);
-        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item1-&gt;cart, $cart-&gt;id);
-        is($item1-&gt;sku, 'SKU1111');
-        is($item1-&gt;quantity, 1);
-        is($item1-&gt;price, 1.11);
-        is($item1-&gt;description, 'Line Item SKU 1');
-        is($item1-&gt;total, 1.11);
+        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item1-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item1-&gt;sku, 'SKU1111', 'got sku');
+        is($item1-&gt;quantity, 1, 'quantity is 1');
+        is($item1-&gt;price+0, 1.11, 'price is 1.11');
+        is($item1-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item1-&gt;total+0, 1.11, 'total is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item1-&gt;custom, 'custom');
+            is($item1-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item2 = $items-&gt;next;
         isa_ok($item2, 'Handel::Cart::Item');
         isa_ok($item2, $itemclass);
-        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item2-&gt;cart, $cart-&gt;id);
-        is($item2-&gt;sku, 'SKU2222');
-        is($item2-&gt;quantity, 2);
-        is($item2-&gt;price, 2.22);
-        is($item2-&gt;description, 'Line Item SKU 2');
-        is($item2-&gt;total, 4.44);
+        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item2-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item2-&gt;sku, 'SKU2222', 'got sku');
+        is($item2-&gt;quantity, 2, 'quantiy is 2');
+        is($item2-&gt;price+0, 2.22, 'price is 2.22');
+        is($item2-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item2-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item2-&gt;custom, 'custom');
+            is($item2-&gt;custom, 'custom', 'got custom field');
         };
 
 
         # restore the saved cart replacing the temp cart and verify the results
         $cart-&gt;restore({id =&gt; '33333333-3333-3333-3333-333333333333'},
             CART_MODE_APPEND);
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 4);
-        is($cart-&gt;subtotal, 51.06);
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 4, 'has 4 items');
+        is($cart-&gt;subtotal+0, 51.06, 'subtotal is 51.06');
 
-        my $items3 = $cart-&gt;items(undef, 1);
+        my $items3 = $cart-&gt;items;
         isa_ok($items3, 'Handel::Iterator');
-        is($items3-&gt;count, 4);
+        is($items3-&gt;count, 4, 'loaded 4 items');
 
         my $item5 = $items3-&gt;next;
         isa_ok($item5, 'Handel::Cart::Item');
         isa_ok($item5, $itemclass);
-        is($item5-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item5-&gt;cart, $cart-&gt;id);
-        is($item5-&gt;sku, 'SKU1111');
-        is($item5-&gt;quantity, 1);
-        is($item5-&gt;price, 1.11);
-        is($item5-&gt;description, 'Line Item SKU 1');
-        is($item5-&gt;total, 1.11);
+        is($item5-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item5-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item5-&gt;sku, 'SKU1111', 'got sku');
+        is($item5-&gt;quantity, 1, 'quantity is 1');
+        is($item5-&gt;price+0, 1.11, 'price is 1.11');
+        is($item5-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item5-&gt;total+0, 1.11, 'total is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item5-&gt;custom, 'custom');
+            is($item5-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item6 = $items3-&gt;next;
         isa_ok($item6, 'Handel::Cart::Item');
         isa_ok($item6, $itemclass);
-        is($item6-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item6-&gt;cart, $cart-&gt;id);
-        is($item6-&gt;sku, 'SKU2222');
-        is($item6-&gt;quantity, 2);
-        is($item6-&gt;price, 2.22);
-        is($item6-&gt;description, 'Line Item SKU 2');
-        is($item6-&gt;total, 4.44);
+        is($item6-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item6-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item6-&gt;sku, 'SKU2222', 'got sku');
+        is($item6-&gt;quantity, 2, 'quantity is 2');
+        is($item6-&gt;price+0, 2.22, 'price is 2.22');
+        is($item6-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item6-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item6-&gt;custom, 'custom');
+            is($item6-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item7 = $items3-&gt;next;
         isa_ok($item7, 'Handel::Cart::Item');
         isa_ok($item7, $itemclass);
-        isnt($item7-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item7-&gt;cart, $cart-&gt;id);
-        is($item7-&gt;sku, 'SKU4444');
-        is($item7-&gt;quantity, 4);
-        is($item7-&gt;price, 4.44);
-        is($item7-&gt;description, 'Line Item SKU 4');
-        is($item7-&gt;total, 17.76);
+        isnt($item7-&gt;id, '44444444-4444-4444-4444-444444444444', 'id is different');
+        is($item7-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item7-&gt;sku, 'SKU4444', 'got sku');
+        is($item7-&gt;quantity, 4, 'quantity is 4');
+        is($item7-&gt;price+0, 4.44, 'price is 4.44');
+        is($item7-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item7-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item7-&gt;custom, 'custom');
+            is($item7-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item8 = $items3-&gt;next;
         isa_ok($item8, 'Handel::Cart::Item');
         isa_ok($item8, $itemclass);
-        isnt($item8-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item8-&gt;cart, $cart-&gt;id);
-        is($item8-&gt;sku, 'SKU1111');
-        is($item8-&gt;quantity, 5);
-        is($item8-&gt;price, 5.55);
-        is($item8-&gt;description, 'Line Item SKU 5');
-        is($item8-&gt;total, 27.75);
+        isnt($item8-&gt;id, '55555555-5555-5555-5555-555555555555', 'id is different');
+        is($item8-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item8-&gt;sku, 'SKU1111', 'got sku');
+        is($item8-&gt;quantity, 5, 'quantity is 5');
+        is($item8-&gt;price+0, 5.55, 'price is 5.55');
+        is($item8-&gt;description, 'Line Item SKU 5', 'got description');
+        is($item8-&gt;total+0, 27.75, 'total is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item7-&gt;custom, 'custom');
+            is($item7-&gt;custom, 'custom', 'got custom field');
         };
 
 
         # load the saved cart again
-        my $saved2 = $subclass-&gt;load({
+        my $sit2 = $subclass-&gt;search({
             id =&gt; '33333333-3333-3333-3333-333333333333'
         });
+        isa_ok($sit2, 'Handel::Iterator');
+        is($sit2, 1, 'loaded 1 cart');
+
+        my $saved2 = $sit2-&gt;first;
         isa_ok($saved2, 'Handel::Cart');
         isa_ok($saved2, $subclass);
-        is($saved2-&gt;id, '33333333-3333-3333-3333-333333333333');
-        is($saved2-&gt;shopper, '33333333-3333-3333-3333-333333333333');
-        is($saved2-&gt;type, CART_TYPE_SAVED);
-        is($saved2-&gt;name, 'Cart 3');
-        is($saved2-&gt;description, 'Saved Cart 1');
-        is($saved2-&gt;count, 2);
-        is($saved2-&gt;subtotal, 45.51);
+        is($saved2-&gt;id, '33333333-3333-3333-3333-333333333333', 'got cart id');
+        is($saved2-&gt;shopper, '33333333-3333-3333-3333-333333333333', 'got shopper id');
+        is($saved2-&gt;type, CART_TYPE_SAVED, 'got saved type');
+        is($saved2-&gt;name, 'Cart 3', 'got name');
+        is($saved2-&gt;description, 'Saved Cart 1', 'got description');
+        is($saved2-&gt;count, 2, 'has 2 items');
+        is($saved2-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
         if ($subclass ne 'Handel::Cart') {
-            is($saved2-&gt;custom, 'custom');
+            is($saved2-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items4 = $saved2-&gt;items(undef, 1);
+        my $items4 = $saved2-&gt;items;
         isa_ok($items4, 'Handel::Iterator');
-        is($items4-&gt;count, 2);
+        is($items4-&gt;count, 2, 'loaded 2 items');
 
         my $item9 = $items4-&gt;next;
         isa_ok($item9, 'Handel::Cart::Item');
         isa_ok($item9, $itemclass);
-        is($item9-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item9-&gt;cart, $saved2-&gt;id);
-        is($item9-&gt;sku, 'SKU4444');
-        is($item9-&gt;quantity, 4);
-        is($item9-&gt;price, 4.44);
-        is($item9-&gt;description, 'Line Item SKU 4');
-        is($item9-&gt;total, 17.76);
+        is($item9-&gt;id, '44444444-4444-4444-4444-444444444444', 'got item id');
+        is($item9-&gt;cart, $saved2-&gt;id, 'cart id is set');
+        is($item9-&gt;sku, 'SKU4444', 'got sku');
+        is($item9-&gt;quantity, 4, 'quantity is 4');
+        is($item9-&gt;price+0, 4.44, 'price is 4.44');
+        is($item9-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item9-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item9-&gt;custom, 'custom');
+            is($item9-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item10 = $items4-&gt;next;
         isa_ok($item10, 'Handel::Cart::Item');
         isa_ok($item10, $itemclass);
-        is($item10-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item10-&gt;cart, $saved2-&gt;id);
-        is($item10-&gt;sku, 'SKU1111');
-        is($item10-&gt;quantity, 5);
-        is($item10-&gt;price, 5.55);
-        is($item10-&gt;description, 'Line Item SKU 5');
-        is($item10-&gt;total, 27.75);
+        is($item10-&gt;id, '55555555-5555-5555-5555-555555555555', 'got item id');
+        is($item10-&gt;cart, $saved2-&gt;id, 'cart id is set');
+        is($item10-&gt;sku, 'SKU1111', 'got sku');
+        is($item10-&gt;quantity, 5, 'quantity is 5');
+        is($item10-&gt;price+0, 5.55, 'price is 5.55');
+        is($item10-&gt;description, 'Line Item SKU 5', 'got description');
+        is($item10-&gt;total+0, 27.75, 'total is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item10-&gt;custom, 'custom');
+            is($item10-&gt;custom, 'custom', 'got custom field');
         };
     };
 </diff>
      <filename>t/cart_restore_append_filter.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,16 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 385;
+        plan tests =&gt; 403;
     };
 
     use_ok('Handel::Cart');
@@ -23,6 +23,8 @@ BEGIN {
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,228 +32,227 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/cart_restore_merge_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
-
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
 
     ## restore saved cart appending items to current cart
     ## just for sanity sake, we're checking all cart and item values
     {
         # load the temp cart
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items = $cart-&gt;items(undef, 1);
+        my $items = $cart-&gt;items;
         isa_ok($items, 'Handel::Iterator');
-        is($items-&gt;count, 2);
+        is($items-&gt;count, 2, 'loaded 2 items');
 
         my $item1 = $items-&gt;next;
         isa_ok($item1, 'Handel::Cart::Item');
         isa_ok($item1, $itemclass);
-        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item1-&gt;cart, $cart-&gt;id);
-        is($item1-&gt;sku, 'SKU1111');
-        is($item1-&gt;quantity, 1);
-        is($item1-&gt;price, 1.11);
-        is($item1-&gt;description, 'Line Item SKU 1');
-        is($item1-&gt;total, 1.11);
+        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item1-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item1-&gt;sku, 'SKU1111', 'got sku');
+        is($item1-&gt;quantity, 1, 'quantity is 1');
+        is($item1-&gt;price+0, 1.11, 'price is 1.11');
+        is($item1-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item1-&gt;total+0, 1.11, 'total is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item1-&gt;custom, 'custom');
+            is($item1-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item2 = $items-&gt;next;
         isa_ok($item2, 'Handel::Cart::Item');
         isa_ok($item2, $itemclass);
-        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item2-&gt;cart, $cart-&gt;id);
-        is($item2-&gt;sku, 'SKU2222');
-        is($item2-&gt;quantity, 2);
-        is($item2-&gt;price, 2.22);
-        is($item2-&gt;description, 'Line Item SKU 2');
-        is($item2-&gt;total, 4.44);
+        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item2-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item2-&gt;sku, 'SKU2222', 'got sku');
+        is($item2-&gt;quantity, 2, 'quantity is 2');
+        is($item2-&gt;price+0, 2.22, 'price is 2.22');
+        is($item2-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item2-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item2-&gt;custom, 'custom');
+            is($item2-&gt;custom, 'custom', 'got custom field');
         };
 
         # load the saved cart
-        my $saved = $subclass-&gt;load({
+        my $sit = $subclass-&gt;search({
             id =&gt; '33333333-3333-3333-3333-333333333333'
         });
+        isa_ok($sit, 'Handel::Iterator');
+        is($sit, 1, 'loaded 1 cart');
+
+        my $saved = $sit-&gt;first;
         isa_ok($saved, 'Handel::Cart');
         isa_ok($saved, $subclass);
-        is($saved-&gt;id, '33333333-3333-3333-3333-333333333333');
-        is($saved-&gt;shopper, '33333333-3333-3333-3333-333333333333');
-        is($saved-&gt;type, CART_TYPE_SAVED);
-        is($saved-&gt;name, 'Cart 3');
-        is($saved-&gt;description, 'Saved Cart 1');
-        is($saved-&gt;count, 2);
-        is($saved-&gt;subtotal, 45.51);
+        is($saved-&gt;id, '33333333-3333-3333-3333-333333333333', 'got cart id');
+        is($saved-&gt;shopper, '33333333-3333-3333-3333-333333333333', 'got shopper id');
+        is($saved-&gt;type, CART_TYPE_SAVED, 'got saved type');
+        is($saved-&gt;name, 'Cart 3', 'got name');
+        is($saved-&gt;description, 'Saved Cart 1', 'got description');
+        is($saved-&gt;count, 2, 'has 2 items');
+        is($saved-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
         if ($subclass ne 'Handel::Cart') {
-            is($saved-&gt;custom, 'custom');
+            is($saved-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items2 = $saved-&gt;items(undef, 1);
+        my $items2 = $saved-&gt;items;
         isa_ok($items2, 'Handel::Iterator');
-        is($items2-&gt;count, 2);
+        is($items2-&gt;count, 2, 'loaded 2 items');
 
         my $item3 = $items2-&gt;next;
         isa_ok($item3, 'Handel::Cart::Item');
         isa_ok($item3, $itemclass);
-        is($item3-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item3-&gt;cart, $saved-&gt;id);
-        is($item3-&gt;sku, 'SKU4444');
-        is($item3-&gt;quantity, 4);
-        is($item3-&gt;price, 4.44);
-        is($item3-&gt;description, 'Line Item SKU 4');
-        is($item3-&gt;total, 17.76);
+        is($item3-&gt;id, '44444444-4444-4444-4444-444444444444', 'got item id');
+        is($item3-&gt;cart, $saved-&gt;id, 'cart id is set');
+        is($item3-&gt;sku, 'SKU4444', 'got sku');
+        is($item3-&gt;quantity, 4, 'quantity is 4');
+        is($item3-&gt;price+0, 4.44, 'price is 4.44');
+        is($item3-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item3-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item3-&gt;custom, 'custom');
+            is($item3-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item4 = $items2-&gt;next;
         isa_ok($item4, 'Handel::Cart::Item');
         isa_ok($item4, $itemclass);
-        is($item4-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item4-&gt;cart, $saved-&gt;id);
-        is($item4-&gt;sku, 'SKU1111');
-        is($item4-&gt;quantity, 5);
-        is($item4-&gt;price, 5.55);
-        is($item4-&gt;description, 'Line Item SKU 5');
-        is($item4-&gt;total, 27.75);
+        is($item4-&gt;id, '55555555-5555-5555-5555-555555555555', 'got item id');
+        is($item4-&gt;cart, $saved-&gt;id, 'cart id is set');
+        is($item4-&gt;sku, 'SKU1111', 'got sku');
+        is($item4-&gt;quantity, 5, 'quantiy is 5');
+        is($item4-&gt;price+0, 5.55, 'price is 5.55');
+        is($item4-&gt;description, 'Line Item SKU 5', 'got description');
+        is($item4-&gt;total+0, 27.75, 'total is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item4-&gt;custom, 'custom');
+            is($item4-&gt;custom, 'custom', 'got custom field');
         };
 
         # restore the saved cart merging with the temp cart and verify the results
         $cart-&gt;restore($saved, CART_MODE_MERGE);
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 3);
-        is($cart-&gt;subtotal, 28.86);
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 3, 'has 3 items');
+        is($cart-&gt;subtotal+0, 28.86, 'total is 28.86');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items3 = $cart-&gt;items(undef, 1);
+        my $items3 = $cart-&gt;items;
         isa_ok($items3, 'Handel::Iterator');
-        is($items3-&gt;count, 3);
+        is($items3-&gt;count, 3, 'loaded 3 items');
 
         my $item5 = $items3-&gt;next;
         isa_ok($item5, 'Handel::Cart::Item');
         isa_ok($item5, $itemclass);
-        is($item5-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item5-&gt;cart, $cart-&gt;id);
-        is($item5-&gt;sku, 'SKU1111');
-        is($item5-&gt;quantity, 6);
-        is($item5-&gt;price, 1.11);
-        is($item5-&gt;description, 'Line Item SKU 1');
-        is($item5-&gt;total, 6.66);
+        is($item5-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item5-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item5-&gt;sku, 'SKU1111', 'got sku');
+        is($item5-&gt;quantity, 6, 'quantity is 6');
+        is($item5-&gt;price+0, 1.11, 'price is 1.11');
+        is($item5-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item5-&gt;total+0, 6.66, 'total is 6.66');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item5-&gt;custom, 'custom');
+            is($item5-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item6 = $items3-&gt;next;
         isa_ok($item6, 'Handel::Cart::Item');
         isa_ok($item6, $itemclass);
-        is($item6-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item6-&gt;cart, $cart-&gt;id);
-        is($item6-&gt;sku, 'SKU2222');
-        is($item6-&gt;quantity, 2);
-        is($item6-&gt;price, 2.22);
-        is($item6-&gt;description, 'Line Item SKU 2');
-        is($item6-&gt;total, 4.44);
+        is($item6-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item6-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item6-&gt;sku, 'SKU2222', 'got sku');
+        is($item6-&gt;quantity, 2, 'quantity is 2');
+        is($item6-&gt;price+0, 2.22, 'price is 2.22');
+        is($item6-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item6-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item6-&gt;custom, 'custom');
+            is($item6-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item7 = $items3-&gt;next;
         isa_ok($item7, 'Handel::Cart::Item');
         isa_ok($item7, $itemclass);
-        isnt($item7-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item7-&gt;cart, $cart-&gt;id);
-        is($item7-&gt;sku, 'SKU4444');
-        is($item7-&gt;quantity, 4);
-        is($item7-&gt;price, 4.44);
-        is($item7-&gt;description, 'Line Item SKU 4');
-        is($item7-&gt;total, 17.76);
+        isnt($item7-&gt;id, '44444444-4444-4444-4444-444444444444', 'got item id');
+        is($item7-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item7-&gt;sku, 'SKU4444', 'got sku');
+        is($item7-&gt;quantity, 4, 'quantity is 4');
+        is($item7-&gt;price+0, 4.44, 'price is 4.44');
+        is($item7-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item7-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item7-&gt;custom, 'custom');
+            is($item7-&gt;custom, 'custom', 'got custom field');
         };
 
         # load the saved cart again
-        my $saved2 = $subclass-&gt;load({
+        my $sit2 = $subclass-&gt;search({
             id =&gt; '33333333-3333-3333-3333-333333333333'
         });
+        isa_ok($sit2, 'Handel::Iterator');
+        is($sit2, 1, 'loaded 1 cart');
+
+        my $saved2 = $sit2-&gt;first;
         isa_ok($saved2, 'Handel::Cart');
         isa_ok($saved2, $subclass);
-        is($saved2-&gt;id, '33333333-3333-3333-3333-333333333333');
-        is($saved2-&gt;shopper, '33333333-3333-3333-3333-333333333333');
-        is($saved2-&gt;type, CART_TYPE_SAVED);
-        is($saved2-&gt;name, 'Cart 3');
-        is($saved2-&gt;description, 'Saved Cart 1');
-        is($saved2-&gt;count, 2);
-        is($saved2-&gt;subtotal, 45.51);
+        is($saved2-&gt;id, '33333333-3333-3333-3333-333333333333', 'got cart id');
+        is($saved2-&gt;shopper, '33333333-3333-3333-3333-333333333333', 'got shopper id');
+        is($saved2-&gt;type, CART_TYPE_SAVED, 'got saved type');
+        is($saved2-&gt;name, 'Cart 3', 'got name');
+        is($saved2-&gt;description, 'Saved Cart 1', 'got description');
+        is($saved2-&gt;count, 2, 'has 2 items');
+        is($saved2-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
         if ($subclass ne 'Handel::Cart') {
-            is($saved2-&gt;custom, 'custom');
+            is($saved2-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items4 = $saved2-&gt;items(undef, 1);
+        my $items4 = $saved2-&gt;items;
         isa_ok($items4, 'Handel::Iterator');
-        is($items4-&gt;count, 2);
+        is($items4-&gt;count, 2, 'loaded 2 items');
 
         my $item9 = $items4-&gt;next;
         isa_ok($item9, 'Handel::Cart::Item');
         isa_ok($item9, $itemclass);
-        is($item9-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item9-&gt;cart, $saved2-&gt;id);
-        is($item9-&gt;sku, 'SKU4444');
-        is($item9-&gt;quantity, 4);
-        is($item9-&gt;price, 4.44);
-        is($item9-&gt;description, 'Line Item SKU 4');
-        is($item9-&gt;total, 17.76);
+        is($item9-&gt;id, '44444444-4444-4444-4444-444444444444', 'got item id');
+        is($item9-&gt;cart, $saved2-&gt;id, 'cart id is set');
+        is($item9-&gt;sku, 'SKU4444', 'got sku');
+        is($item9-&gt;quantity, 4, 'quantity is 4');
+        is($item9-&gt;price+0, 4.44, 'price is 4.44');
+        is($item9-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item9-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item9-&gt;custom, 'custom');
+            is($item9-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item10 = $items4-&gt;next;
         isa_ok($item10, 'Handel::Cart::Item');
         isa_ok($item10, $itemclass);
-        is($item10-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item10-&gt;cart, $saved2-&gt;id);
-        is($item10-&gt;sku, 'SKU1111');
-        is($item10-&gt;quantity, 5);
-        is($item10-&gt;price, 5.55);
-        is($item10-&gt;description, 'Line Item SKU 5');
-        is($item10-&gt;total, 27.75);
+        is($item10-&gt;id, '55555555-5555-5555-5555-555555555555', 'got item id');
+        is($item10-&gt;cart, $saved2-&gt;id, 'cart id is set');
+        is($item10-&gt;sku, 'SKU1111', 'got sku');
+        is($item10-&gt;quantity, 5, 'quantity is 5');
+        is($item10-&gt;price+0, 5.55, 'price is 5.55');
+        is($item10-&gt;description, 'Line Item SKU 5', 'got description');
+        is($item10-&gt;total+0, 27.75, 'price is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item10-&gt;custom, 'custom');
+            is($item10-&gt;custom, 'custom', 'got custom field');
         };
     };
 </diff>
      <filename>t/cart_restore_merge.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,16 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 292;
+        plan tests =&gt; 304;
     };
 
     use_ok('Handel::Cart');
@@ -23,6 +23,8 @@ BEGIN {
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,181 +32,176 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/cart_restore_merge_filter_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
-
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
 
     ## restore saved cart appending items to current cart
     ## just for sanity sake, we're checking all cart and item values
     {
         # load the temp cart
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
 
-        my $items = $cart-&gt;items(undef, 1);
+        my $items = $cart-&gt;items;
         isa_ok($items, 'Handel::Iterator');
-        is($items-&gt;count, 2);
+        is($items-&gt;count, 2, 'loaded 2 items');
 
         my $item1 = $items-&gt;next;
         isa_ok($item1, 'Handel::Cart::Item');
         isa_ok($item1, $itemclass);
-        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item1-&gt;cart, $cart-&gt;id);
-        is($item1-&gt;sku, 'SKU1111');
-        is($item1-&gt;quantity, 1);
-        is($item1-&gt;price, 1.11);
-        is($item1-&gt;description, 'Line Item SKU 1');
-        is($item1-&gt;total, 1.11);
+        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item1-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item1-&gt;sku, 'SKU1111', 'got sku');
+        is($item1-&gt;quantity, 1, 'quantity is 1');
+        is($item1-&gt;price+0, 1.11, 'price is 1.11');
+        is($item1-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item1-&gt;total+0, 1.11, 'total is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item1-&gt;custom, 'custom');
+            is($item1-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item2 = $items-&gt;next;
         isa_ok($item2, 'Handel::Cart::Item');
         isa_ok($item2, $itemclass);
-        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item2-&gt;cart, $cart-&gt;id);
-        is($item2-&gt;sku, 'SKU2222');
-        is($item2-&gt;quantity, 2);
-        is($item2-&gt;price, 2.22);
-        is($item2-&gt;description, 'Line Item SKU 2');
-        is($item2-&gt;total, 4.44);
+        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item2-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item2-&gt;sku, 'SKU2222', 'got sku');
+        is($item2-&gt;quantity, 2, 'quantity is 2');
+        is($item2-&gt;price+0, 2.22, 'price is 2.22');
+        is($item2-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item2-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item2-&gt;custom, 'custom');
+            is($item2-&gt;custom, 'custom', 'got custom field');
         };
 
 
         # restore the saved cart merging with the temp cart and verify the results
         $cart-&gt;restore({id =&gt; '33333333-3333-3333-3333-333333333333'},
             CART_MODE_MERGE);
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 3);
-        is($cart-&gt;subtotal, 28.86);
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 3, 'has 3 items');
+        is($cart-&gt;subtotal+0, 28.86, 'subtotal is 28.56');
 
-        my $items3 = $cart-&gt;items(undef, 1);
+        my $items3 = $cart-&gt;items;
         isa_ok($items3, 'Handel::Iterator');
-        is($items3-&gt;count, 3);
+        is($items3-&gt;count, 3, 'loaded 3 items');
 
         my $item5 = $items3-&gt;next;
         isa_ok($item5, 'Handel::Cart::Item');
         isa_ok($item5, $itemclass);
-        is($item5-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item5-&gt;cart, $cart-&gt;id);
-        is($item5-&gt;sku, 'SKU1111');
-        is($item5-&gt;quantity, 6);
-        is($item5-&gt;price, 1.11);
-        is($item5-&gt;description, 'Line Item SKU 1');
-        is($item5-&gt;total, 6.66);
+        is($item5-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item5-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item5-&gt;sku, 'SKU1111', 'got sku');
+        is($item5-&gt;quantity, 6, 'quantity is 6');
+        is($item5-&gt;price+0, 1.11, 'price is 1.11');
+        is($item5-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item5-&gt;total+0, 6.66, 'total is 6.66');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item5-&gt;custom, 'custom');
+            is($item5-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item6 = $items3-&gt;next;
         isa_ok($item6, 'Handel::Cart::Item');
         isa_ok($item6, $itemclass);
-        is($item6-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item6-&gt;cart, $cart-&gt;id);
-        is($item6-&gt;sku, 'SKU2222');
-        is($item6-&gt;quantity, 2);
-        is($item6-&gt;price, 2.22);
-        is($item6-&gt;description, 'Line Item SKU 2');
-        is($item6-&gt;total, 4.44);
+        is($item6-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item6-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item6-&gt;sku, 'SKU2222', 'got sku');
+        is($item6-&gt;quantity, 2, 'quantity is 2');
+        is($item6-&gt;price+0, 2.22, 'price is 2.22');
+        is($item6-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item6-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item6-&gt;custom, 'custom');
+            is($item6-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item7 = $items3-&gt;next;
         isa_ok($item7, 'Handel::Cart::Item');
         isa_ok($item7, $itemclass);
-        isnt($item7-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item7-&gt;cart, $cart-&gt;id);
-        is($item7-&gt;sku, 'SKU4444');
-        is($item7-&gt;quantity, 4);
-        is($item7-&gt;price, 4.44);
-        is($item7-&gt;description, 'Line Item SKU 4');
-        is($item7-&gt;total, 17.76);
+        isnt($item7-&gt;id, '44444444-4444-4444-4444-444444444444', 'id is different');
+        is($item7-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item7-&gt;sku, 'SKU4444', 'got sku');
+        is($item7-&gt;quantity, 4, 'quantity is 4');
+        is($item7-&gt;price+0, 4.44, 'price is 4.44');
+        is($item7-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item7-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item7-&gt;custom, 'custom');
+            is($item7-&gt;custom, 'custom', 'got custom field');
         };
 
 
         # load the saved cart again
-        my $saved2 = $subclass-&gt;load({
+        my $sit2 = $subclass-&gt;search({
             id =&gt; '33333333-3333-3333-3333-333333333333'
         });
+        isa_ok($sit2, 'Handel::Iterator');
+        is($sit2, 1, 'loaded 1 cart');
+
+        my $saved2 = $sit2-&gt;first;
         isa_ok($saved2, 'Handel::Cart');
         isa_ok($saved2, $subclass);
-        is($saved2-&gt;id, '33333333-3333-3333-3333-333333333333');
-        is($saved2-&gt;shopper, '33333333-3333-3333-3333-333333333333');
-        is($saved2-&gt;type, CART_TYPE_SAVED);
-        is($saved2-&gt;name, 'Cart 3');
-        is($saved2-&gt;description, 'Saved Cart 1');
-        is($saved2-&gt;count, 2);
-        is($saved2-&gt;subtotal, 45.51);
+        is($saved2-&gt;id, '33333333-3333-3333-3333-333333333333', 'got cart id');
+        is($saved2-&gt;shopper, '33333333-3333-3333-3333-333333333333', 'got shopper id');
+        is($saved2-&gt;type, CART_TYPE_SAVED, 'got saved type');
+        is($saved2-&gt;name, 'Cart 3', 'got name');
+        is($saved2-&gt;description, 'Saved Cart 1', 'got description');
+        is($saved2-&gt;count, 2, 'has 2 items');
+        is($saved2-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
         if ($subclass ne 'Handel::Cart') {
-            is($saved2-&gt;custom, 'custom');
+            is($saved2-&gt;custom, 'custom', 'got custom field');
         };
 
 
-        my $items4 = $saved2-&gt;items(undef, 1);
+        my $items4 = $saved2-&gt;items;
         isa_ok($items4, 'Handel::Iterator');
-        is($items4-&gt;count, 2);
+        is($items4-&gt;count, 2, 'loaded 2 items');
 
         my $item9 = $items4-&gt;next;
         isa_ok($item9, 'Handel::Cart::Item');
         isa_ok($item9, $itemclass);
-        is($item9-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item9-&gt;cart, $saved2-&gt;id);
-        is($item9-&gt;sku, 'SKU4444');
-        is($item9-&gt;quantity, 4);
-        is($item9-&gt;price, 4.44);
-        is($item9-&gt;description, 'Line Item SKU 4');
-        is($item9-&gt;total, 17.76);
+        is($item9-&gt;id, '44444444-4444-4444-4444-444444444444', 'got item id');
+        is($item9-&gt;cart, $saved2-&gt;id, 'cart id is set');
+        is($item9-&gt;sku, 'SKU4444', 'got sku');
+        is($item9-&gt;quantity, 4, 'quantity is 4');
+        is($item9-&gt;price+0, 4.44, 'price is 4.44');
+        is($item9-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item9-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item9-&gt;custom, 'custom');
+            is($item9-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item10 = $items4-&gt;next;
         isa_ok($item10, 'Handel::Cart::Item');
         isa_ok($item10, $itemclass);
-        is($item10-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item10-&gt;cart, $saved2-&gt;id);
-        is($item10-&gt;sku, 'SKU1111');
-        is($item10-&gt;quantity, 5);
-        is($item10-&gt;price, 5.55);
-        is($item10-&gt;description, 'Line Item SKU 5');
-        is($item10-&gt;total, 27.75);
+        is($item10-&gt;id, '55555555-5555-5555-5555-555555555555', 'got item id');
+        is($item10-&gt;cart, $saved2-&gt;id, 'cart id is set');
+        is($item10-&gt;sku, 'SKU1111', 'got sku');
+        is($item10-&gt;quantity, 5, 'quantity is 5');
+        is($item10-&gt;price+0, 5.55, 'price is 5.55');
+        is($item10-&gt;description, 'Line Item SKU 5', 'got description');
+        is($item10-&gt;total+0, 27.75, 'total is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item10-&gt;custom, 'custom');
+            is($item10-&gt;custom, 'custom', 'got custom field');
         };
     };
 </diff>
      <filename>t/cart_restore_merge_filter.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,16 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 352;
+        plan tests =&gt; 370;
     };
 
     use_ok('Handel::Cart');
@@ -23,6 +23,8 @@ BEGIN {
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,213 +32,212 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/cart_restore_replace_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
-
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
 
     ## restore saved cart replacing current cart
     ## just for sanity sake, we're checking all cart and item values
     {
         # load the temp cart
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items = $cart-&gt;items(undef, 1);
+        my $items = $cart-&gt;items;
         isa_ok($items, 'Handel::Iterator');
-        is($items-&gt;count, 2);
+        is($items-&gt;count, 2, 'loaded 2 items');
 
         my $item1 = $items-&gt;next;
         isa_ok($item1, 'Handel::Cart::Item');
         isa_ok($item1, $itemclass);
-        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item1-&gt;cart, $cart-&gt;id);
-        is($item1-&gt;sku, 'SKU1111');
-        is($item1-&gt;quantity, 1);
-        is($item1-&gt;price, 1.11);
-        is($item1-&gt;description, 'Line Item SKU 1');
-        is($item1-&gt;total, 1.11);
+        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item1-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item1-&gt;sku, 'SKU1111', 'got sku');
+        is($item1-&gt;quantity, 1, 'quantity is 1');
+        is($item1-&gt;price+0, 1.11, 'price is 1.11');
+        is($item1-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item1-&gt;total+0, 1.11, 'total is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item1-&gt;custom, 'custom');
+            is($item1-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item2 = $items-&gt;next;
         isa_ok($item2, 'Handel::Cart::Item');
         isa_ok($item2, $itemclass);
-        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item2-&gt;cart, $cart-&gt;id);
-        is($item2-&gt;sku, 'SKU2222');
-        is($item2-&gt;quantity, 2);
-        is($item2-&gt;price, 2.22);
-        is($item2-&gt;description, 'Line Item SKU 2');
-        is($item2-&gt;total, 4.44);
+        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item2-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item2-&gt;sku, 'SKU2222', 'got sku');
+        is($item2-&gt;quantity, 2, 'quantity is 2');
+        is($item2-&gt;price+0, 2.22, 'price is 2.22');
+        is($item2-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item2-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item2-&gt;custom, 'custom');
+            is($item2-&gt;custom, 'custom', 'got custom field');
         };
 
 
         # load the saved cart
-        my $saved = $subclass-&gt;load({
+        my $sit = $subclass-&gt;search({
             id =&gt; '33333333-3333-3333-3333-333333333333'
         });
+        isa_ok($sit, 'Handel::Iterator');
+        is($sit, 1, 'loaded 1 cart');
+
+        my $saved = $sit-&gt;first;
         isa_ok($saved, 'Handel::Cart');
         isa_ok($saved, $subclass);
-        is($saved-&gt;id, '33333333-3333-3333-3333-333333333333');
-        is($saved-&gt;shopper, '33333333-3333-3333-3333-333333333333');
-        is($saved-&gt;type, CART_TYPE_SAVED);
-        is($saved-&gt;name, 'Cart 3');
-        is($saved-&gt;description, 'Saved Cart 1');
-        is($saved-&gt;count, 2);
-        is($saved-&gt;subtotal, 45.51);
+        is($saved-&gt;id, '33333333-3333-3333-3333-333333333333', 'got cart id');
+        is($saved-&gt;shopper, '33333333-3333-3333-3333-333333333333', 'got shopper id');
+        is($saved-&gt;type, CART_TYPE_SAVED, 'got saved type');
+        is($saved-&gt;name, 'Cart 3', 'got name');
+        is($saved-&gt;description, 'Saved Cart 1', 'got description');
+        is($saved-&gt;count, 2, 'has 2 items');
+        is($saved-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
         if ($subclass ne 'Handel::Cart') {
-            is($saved-&gt;custom, 'custom');
+            is($saved-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items2 = $saved-&gt;items(undef, 1);
+        my $items2 = $saved-&gt;items;
         isa_ok($items2, 'Handel::Iterator');
-        is($items2-&gt;count, 2);
+        is($items2-&gt;count, 2, 'loaded 2 items');
 
         my $item3 = $items2-&gt;next;
         isa_ok($item3, 'Handel::Cart::Item');
         isa_ok($item3, $itemclass);
-        is($item3-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item3-&gt;cart, $saved-&gt;id);
-        is($item3-&gt;sku, 'SKU4444');
-        is($item3-&gt;quantity, 4);
-        is($item3-&gt;price, 4.44);
-        is($item3-&gt;description, 'Line Item SKU 4');
-        is($item3-&gt;total, 17.76);
+        is($item3-&gt;id, '44444444-4444-4444-4444-444444444444', 'got item id');
+        is($item3-&gt;cart, $saved-&gt;id, 'cart id is set');
+        is($item3-&gt;sku, 'SKU4444', 'got sku');
+        is($item3-&gt;quantity, 4, 'quantity is 4');
+        is($item3-&gt;price+0, 4.44, 'price 4.44');
+        is($item3-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item3-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item3-&gt;custom, 'custom');
+            is($item3-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item4 = $items2-&gt;next;
         isa_ok($item4, 'Handel::Cart::Item');
         isa_ok($item4, $itemclass);
-        is($item4-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item4-&gt;cart, $saved-&gt;id);
-        is($item4-&gt;sku, 'SKU1111');
-        is($item4-&gt;quantity, 5);
-        is($item4-&gt;price, 5.55);
-        is($item4-&gt;description, 'Line Item SKU 5');
-        is($item4-&gt;total, 27.75);
+        is($item4-&gt;id, '55555555-5555-5555-5555-555555555555', 'got item id');
+        is($item4-&gt;cart, $saved-&gt;id, 'cart id is set');
+        is($item4-&gt;sku, 'SKU1111', 'got sku');
+        is($item4-&gt;quantity, 5, 'quantity is 5');
+        is($item4-&gt;price+0, 5.55, 'price is 5.55');
+        is($item4-&gt;description, 'Line Item SKU 5', 'got descirption');
+        is($item4-&gt;total+0, 27.75, 'total is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item4-&gt;custom, 'custom');
+            is($item4-&gt;custom, 'custom', 'got custom field');
         };
 
 
         # restore te saved cart replacing the temp cart and verify the results
         $cart-&gt;restore($saved, CART_MODE_REPLACE);
-        is($cart-&gt;name, 'Cart 3');
-        is($cart-&gt;description, 'Saved Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 45.51);
+        is($cart-&gt;name, 'Cart 3', 'name is set');
+        is($cart-&gt;description, 'Saved Cart 1', 'description is set');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
 
-        my $items3 = $cart-&gt;items(undef, 1);
+        my $items3 = $cart-&gt;items;
         isa_ok($items3, 'Handel::Iterator');
-        is($items3-&gt;count, 2);
+        is($items3-&gt;count, 2, 'loaded 2 items');
 
         my $item5 = $items3-&gt;next;
         isa_ok($item5, 'Handel::Cart::Item');
         isa_ok($item5, $itemclass);
-        isnt($item5-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item5-&gt;cart, $cart-&gt;id);
-        is($item5-&gt;sku, 'SKU4444');
-        is($item5-&gt;quantity, 4);
-        is($item5-&gt;price, 4.44);
-        is($item5-&gt;description, 'Line Item SKU 4');
-        is($item5-&gt;total, 17.76);
+        isnt($item5-&gt;id, '44444444-4444-4444-4444-444444444444', 'item is different id');
+        is($item5-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item5-&gt;sku, 'SKU4444', 'got sku');
+        is($item5-&gt;quantity, 4, 'quantity is 4');
+        is($item5-&gt;price+0, 4.44, 'price is 4.44');
+        is($item5-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item5-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item5-&gt;custom, 'custom');
+            is($item5-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item6 = $items3-&gt;next;
         isa_ok($item6, 'Handel::Cart::Item');
         isa_ok($item6, $itemclass);
-        isnt($item6-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item6-&gt;cart, $cart-&gt;id);
-        is($item6-&gt;sku, 'SKU1111');
-        is($item6-&gt;quantity, 5);
-        is($item6-&gt;price, 5.55);
-        is($item6-&gt;description, 'Line Item SKU 5');
-        is($item6-&gt;total, 27.75);
+        isnt($item6-&gt;id, '55555555-5555-5555-5555-555555555555', 'item is different id');
+        is($item6-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item6-&gt;sku, 'SKU1111', 'got sku');
+        is($item6-&gt;quantity, 5, 'quantity is 5');
+        is($item6-&gt;price+0, 5.55, 'price is 5.55');
+        is($item6-&gt;description, 'Line Item SKU 5', 'got description');
+        is($item6-&gt;total+0, 27.75, 'total is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item6-&gt;custom, 'custom');
+            is($item6-&gt;custom, 'custom', 'got custom field');
         };
 
 
         # load the saved cart again
-        my $saved2 = $subclass-&gt;load({
+        my $sit2 = $subclass-&gt;search({
             id =&gt; '33333333-3333-3333-3333-333333333333'
         });
+        isa_ok($sit2, 'Handel::Iterator');
+        is($sit2, 1, 'loaded 1 cart');
+
+        my $saved2 = $sit2-&gt;first;
         isa_ok($saved2, 'Handel::Cart');
         isa_ok($saved2, $subclass);
-        is($saved2-&gt;id, '33333333-3333-3333-3333-333333333333');
-        is($saved2-&gt;shopper, '33333333-3333-3333-3333-333333333333');
-        is($saved2-&gt;type, CART_TYPE_SAVED);
-        is($saved2-&gt;name, 'Cart 3');
-        is($saved2-&gt;description, 'Saved Cart 1');
-        is($saved2-&gt;count, 2);
-        is($saved2-&gt;subtotal, 45.51);
+        is($saved2-&gt;id, '33333333-3333-3333-3333-333333333333', 'got cart id');
+        is($saved2-&gt;shopper, '33333333-3333-3333-3333-333333333333', 'got shopper id');
+        is($saved2-&gt;type, CART_TYPE_SAVED, 'got saved type');
+        is($saved2-&gt;name, 'Cart 3', 'got name');
+        is($saved2-&gt;description, 'Saved Cart 1', 'got description');
+        is($saved2-&gt;count, 2, 'has 2 items');
+        is($saved2-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
         if ($subclass ne 'Handel::Cart') {
-            is($saved2-&gt;custom, 'custom');
+            is($saved2-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items4 = $saved2-&gt;items(undef, 1);
+        my $items4 = $saved2-&gt;items;
         isa_ok($items4, 'Handel::Iterator');
-        is($items4-&gt;count, 2);
+        is($items4-&gt;count, 2, 'loaded 4 items');
 
         my $item7 = $items4-&gt;next;
         isa_ok($item7, 'Handel::Cart::Item');
         isa_ok($item7, $itemclass);
-        is($item7-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item7-&gt;cart, $saved2-&gt;id);
-        is($item7-&gt;sku, 'SKU4444');
-        is($item7-&gt;quantity, 4);
-        is($item7-&gt;price, 4.44);
-        is($item7-&gt;description, 'Line Item SKU 4');
-        is($item7-&gt;total, 17.76);
+        is($item7-&gt;id, '44444444-4444-4444-4444-444444444444', 'got item id');
+        is($item7-&gt;cart, $saved2-&gt;id, 'cart id is set');
+        is($item7-&gt;sku, 'SKU4444', 'got sku');
+        is($item7-&gt;quantity, 4, 'quantity is 4');
+        is($item7-&gt;price+0, 4.44, 'price is 4.44');
+        is($item7-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item7-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item7-&gt;custom, 'custom');
+            is($item7-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item8 = $items4-&gt;next;
         isa_ok($item8, 'Handel::Cart::Item');
         isa_ok($item8, $itemclass);
-        is($item8-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item8-&gt;cart, $saved2-&gt;id);
-        is($item8-&gt;sku, 'SKU1111');
-        is($item8-&gt;quantity, 5);
-        is($item8-&gt;price, 5.55);
-        is($item8-&gt;description, 'Line Item SKU 5');
-        is($item8-&gt;total, 27.75);
+        is($item8-&gt;id, '55555555-5555-5555-5555-555555555555', 'got item id');
+        is($item8-&gt;cart, $saved2-&gt;id, 'cart id is set');
+        is($item8-&gt;sku, 'SKU1111', 'got sku');
+        is($item8-&gt;quantity, 5, 'quantity is 5');
+        is($item8-&gt;price+0, 5.55, 'price is 5.55');
+        is($item8-&gt;description, 'Line Item SKU 5', 'got description');
+        is($item8-&gt;total+0, 27.75, 'total is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item8-&gt;custom, 'custom');
+            is($item8-&gt;custom, 'custom', 'got custom field');
         };
     };
 </diff>
      <filename>t/cart_restore_replace.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,16 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 261;
+        plan tests =&gt; 273;
     };
 
     use_ok('Handel::Cart');
@@ -23,6 +23,8 @@ BEGIN {
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,163 +32,158 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/cart_restore_replace_filter_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
-
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
 
     ## restore saved cart replacing current cart
     ## just for sanity sake, we're checking all cart and item values
     {
         # load the temp cart
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'loaded 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($cart-&gt;type, CART_TYPE_TEMP);
-        is($cart-&gt;name, 'Cart 1');
-        is($cart-&gt;description, 'Test Temp Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 5.55);
+        is($cart-&gt;id, '11111111-1111-1111-1111-111111111111', 'got cart id');
+        is($cart-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
+        is($cart-&gt;name, 'Cart 1', 'got name');
+        is($cart-&gt;description, 'Test Temp Cart 1', 'got description');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
         if ($subclass ne 'Handel::Cart') {
-            is($cart-&gt;custom, 'custom');
+            is($cart-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items = $cart-&gt;items(undef, 1);
+        my $items = $cart-&gt;items;
         isa_ok($items, 'Handel::Iterator');
-        is($items-&gt;count, 2);
+        is($items-&gt;count, 2, 'loaded 2 items');
 
         my $item1 = $items-&gt;next;
         isa_ok($item1, 'Handel::Cart::Item');
         isa_ok($item1, $itemclass);
-        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($item1-&gt;cart, $cart-&gt;id);
-        is($item1-&gt;sku, 'SKU1111');
-        is($item1-&gt;quantity, 1);
-        is($item1-&gt;price, 1.11);
-        is($item1-&gt;description, 'Line Item SKU 1');
-        is($item1-&gt;total, 1.11);
+        is($item1-&gt;id, '11111111-1111-1111-1111-111111111111', 'got item id');
+        is($item1-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item1-&gt;sku, 'SKU1111', 'got sku');
+        is($item1-&gt;quantity, 1, 'quantity is 1');
+        is($item1-&gt;price+0, 1.11, 'price is 1.11');
+        is($item1-&gt;description, 'Line Item SKU 1', 'got description');
+        is($item1-&gt;total+0, 1.11, 'totla is 1.11');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item1-&gt;custom, 'custom');
+            is($item1-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item2 = $items-&gt;next;
         isa_ok($item2, 'Handel::Cart::Item');
         isa_ok($item2, $itemclass);
-        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222');
-        is($item2-&gt;cart, $cart-&gt;id);
-        is($item2-&gt;sku, 'SKU2222');
-        is($item2-&gt;quantity, 2);
-        is($item2-&gt;price, 2.22);
-        is($item2-&gt;description, 'Line Item SKU 2');
-        is($item2-&gt;total, 4.44);
+        is($item2-&gt;id, '22222222-2222-2222-2222-222222222222', 'got item id');
+        is($item2-&gt;cart, $cart-&gt;id, 'cat id is set');
+        is($item2-&gt;sku, 'SKU2222', 'got sku');
+        is($item2-&gt;quantity, 2, 'quantity is 2');
+        is($item2-&gt;price+0, 2.22, 'price is 2.22');
+        is($item2-&gt;description, 'Line Item SKU 2', 'got description');
+        is($item2-&gt;total+0, 4.44, 'total is 4.44');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item2-&gt;custom, 'custom');
+            is($item2-&gt;custom, 'custom', 'got custom field');
         };
 
         # restore te saved cart replacing the temp cart and verify the results
         $cart-&gt;restore({id =&gt; '33333333-3333-3333-3333-333333333333'},
             CART_MODE_REPLACE);
-        is($cart-&gt;name, 'Cart 3');
-        is($cart-&gt;description, 'Saved Cart 1');
-        is($cart-&gt;count, 2);
-        is($cart-&gt;subtotal, 45.51);
+        is($cart-&gt;name, 'Cart 3', 'name is set');
+        is($cart-&gt;description, 'Saved Cart 1', 'descirption is set');
+        is($cart-&gt;count, 2, 'has 2 items');
+        is($cart-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
 
-        my $items3 = $cart-&gt;items(undef, 1);
+        my $items3 = $cart-&gt;items;
         isa_ok($items3, 'Handel::Iterator');
-        is($items3-&gt;count, 2);
+        is($items3-&gt;count, 2, 'loaded 2 items');
 
         my $item5 = $items3-&gt;next;
         isa_ok($item5, 'Handel::Cart::Item');
         isa_ok($item5, $itemclass);
-        isnt($item5-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item5-&gt;cart, $cart-&gt;id);
-        is($item5-&gt;sku, 'SKU4444');
-        is($item5-&gt;quantity, 4);
-        is($item5-&gt;price, 4.44);
-        is($item5-&gt;description, 'Line Item SKU 4');
-        is($item5-&gt;total, 17.76);
+        isnt($item5-&gt;id, '44444444-4444-4444-4444-444444444444', 'not the same item id');
+        is($item5-&gt;cart, $cart-&gt;id, 'cart is is set');
+        is($item5-&gt;sku, 'SKU4444', 'got sku');
+        is($item5-&gt;quantity, 4, 'quantity is 4');
+        is($item5-&gt;price+0, 4.44, 'price is 4.44');
+        is($item5-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item5-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item5-&gt;custom, 'custom');
+            is($item5-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item6 = $items3-&gt;next;
         isa_ok($item6, 'Handel::Cart::Item');
         isa_ok($item6, $itemclass);
-        isnt($item6-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item6-&gt;cart, $cart-&gt;id);
-        is($item6-&gt;sku, 'SKU1111');
-        is($item6-&gt;quantity, 5);
-        is($item6-&gt;price, 5.55);
-        is($item6-&gt;description, 'Line Item SKU 5');
-        is($item6-&gt;total, 27.75);
+        isnt($item6-&gt;id, '55555555-5555-5555-5555-555555555555', 'items has different it');
+        is($item6-&gt;cart, $cart-&gt;id, 'cart id is set');
+        is($item6-&gt;sku, 'SKU1111', 'got sku');
+        is($item6-&gt;quantity, 5, 'quantity is 5');
+        is($item6-&gt;price+0, 5.55, 'price is 5.55');
+        is($item6-&gt;description, 'Line Item SKU 5', 'got description');
+        is($item6-&gt;total+0, 27.75, 'total is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item6-&gt;custom, 'custom');
+            is($item6-&gt;custom, 'custom', 'got custom field');
         };
 
 
         # load the saved cart again
-        my $saved2 = $subclass-&gt;load({
+        my $sit2 = $subclass-&gt;search({
             id =&gt; '33333333-3333-3333-3333-333333333333'
         });
+        isa_ok($sit2, 'Handel::Iterator');
+        is($sit2, 1, 'loaded 1 item');
+
+        my $saved2 = $sit2-&gt;first;
         isa_ok($saved2, 'Handel::Cart');
         isa_ok($saved2, $subclass);
-        is($saved2-&gt;id, '33333333-3333-3333-3333-333333333333');
-        is($saved2-&gt;shopper, '33333333-3333-3333-3333-333333333333');
-        is($saved2-&gt;type, CART_TYPE_SAVED);
-        is($saved2-&gt;name, 'Cart 3');
-        is($saved2-&gt;description, 'Saved Cart 1');
-        is($saved2-&gt;count, 2);
-        is($saved2-&gt;subtotal, 45.51);
+        is($saved2-&gt;id, '33333333-3333-3333-3333-333333333333', 'got cart id');
+        is($saved2-&gt;shopper, '33333333-3333-3333-3333-333333333333', 'got shopper id');
+        is($saved2-&gt;type, CART_TYPE_SAVED, 'got saved type');
+        is($saved2-&gt;name, 'Cart 3', 'got name');
+        is($saved2-&gt;description, 'Saved Cart 1', 'got description');
+        is($saved2-&gt;count, 2, 'has 2 items');
+        is($saved2-&gt;subtotal+0, 45.51, 'subtotal is 45.51');
         if ($subclass ne 'Handel::Cart') {
-            is($saved2-&gt;custom, 'custom');
+            is($saved2-&gt;custom, 'custom', 'got custom field');
         };
 
-        my $items4 = $saved2-&gt;items(undef, 1);
+        my $items4 = $saved2-&gt;items;
         isa_ok($items4, 'Handel::Iterator');
-        is($items4-&gt;count, 2);
+        is($items4-&gt;count, 2, 'loaded 2 items');
 
         my $item7 = $items4-&gt;next;
         isa_ok($item7, 'Handel::Cart::Item');
         isa_ok($item7, $itemclass);
-        is($item7-&gt;id, '44444444-4444-4444-4444-444444444444');
-        is($item7-&gt;cart, $saved2-&gt;id);
-        is($item7-&gt;sku, 'SKU4444');
-        is($item7-&gt;quantity, 4);
-        is($item7-&gt;price, 4.44);
-        is($item7-&gt;description, 'Line Item SKU 4');
-        is($item7-&gt;total, 17.76);
+        is($item7-&gt;id, '44444444-4444-4444-4444-444444444444', 'got item id');
+        is($item7-&gt;cart, $saved2-&gt;id, 'cart id is set');
+        is($item7-&gt;sku, 'SKU4444', 'got sku');
+        is($item7-&gt;quantity, 4, 'quantity is 4');
+        is($item7-&gt;price+0, 4.44, 'price is 4.44');
+        is($item7-&gt;description, 'Line Item SKU 4', 'got description');
+        is($item7-&gt;total+0, 17.76, 'total is 17.76');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item7-&gt;custom, 'custom');
+            is($item7-&gt;custom, 'custom', 'got custom field');
         };
 
         my $item8 = $items4-&gt;next;
         isa_ok($item8, 'Handel::Cart::Item');
         isa_ok($item8, $itemclass);
-        is($item8-&gt;id, '55555555-5555-5555-5555-555555555555');
-        is($item8-&gt;cart, $saved2-&gt;id);
-        is($item8-&gt;sku, 'SKU1111');
-        is($item8-&gt;quantity, 5);
-        is($item8-&gt;price, 5.55);
-        is($item8-&gt;description, 'Line Item SKU 5');
-        is($item8-&gt;total, 27.75);
+        is($item8-&gt;id, '55555555-5555-5555-5555-555555555555', 'got item id');
+        is($item8-&gt;cart, $saved2-&gt;id, 'cart id is set');
+        is($item8-&gt;sku, 'SKU1111', 'got sku');
+        is($item8-&gt;quantity, 5, 'quantity is 5');
+        is($item8-&gt;price+0, 5.55, 'price is 5.55');
+        is($item8-&gt;description, 'Line Item SKU 5', 'got description');
+        is($item8-&gt;total+0, 27.75, 'total is 27.75');
         if ($itemclass ne 'Handel::Cart::Item') {
-            is($item8-&gt;custom, 'custom');
+            is($item8-&gt;custom, 'custom', 'got custom field');
         };
     };
 </diff>
      <filename>t/cart_restore_replace_filter.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,16 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 32;
+        plan tests =&gt; 71;
     };
 
     use_ok('Handel::Cart');
@@ -23,6 +23,8 @@ BEGIN {
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -30,60 +32,87 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
+
 
-    ## Setup SQLite DB for tests
+    ## test for Handel::Exception::Constraint for invalid type
     {
-        my $dbfile  = &quot;t/cart_save_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/cart_create_table.sql';
-        my $data    = 't/sql/cart_fake_data.sql';
+        my $it = $subclass-&gt;search({
+            id =&gt; '11111111-1111-1111-1111-111111111111'
+        });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'got 1 cart');
 
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
+        my $cart = $it-&gt;first;
+        isa_ok($cart, 'Handel::Cart');
+        isa_ok($cart, $subclass);
+
+        try {
+            local $ENV{'LANG'} = 'en';
+            $cart-&gt;type('abc');
 
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
+            fail('no exception thrown');
+        } catch Handel::Exception::Constraint with {
+            pass('caught constraint exception');
+            like(shift, qr/failed database constraint/i, 'failed constraint in message');
+        } otherwise {
+            fail('caught other exception');
+        };
     };
 
 
-    ## test for Handel::Exception::Constraint for invalid type
+    ## test for Handel::Exception::Constraint for blank name
     {
-        my $cart = $subclass-&gt;load({
-            id =&gt; '11111111-1111-1111-1111-111111111111'
+        my $it = $subclass-&gt;search({
+            id =&gt; '22222222-2222-2222-2222-222222222222'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'got 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
 
         try {
-            $cart-&gt;type('abc');
+            local $ENV{'LANG'} = 'en';
+            $cart-&gt;name(undef);
+            $cart-&gt;save;
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Constraint with {
-            pass;
+            pass('caught constraint exception');
+	    like(shift, qr/failed database constraint/i, 'failed constraint in message');
         } otherwise {
-            fail;
+            fail('caught other exception');
         };
     };
 
-
     ## Load a cart, save it and validate type
     {
-        my $cart = $subclass-&gt;load({
+        my $it = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($it, 'Handel::Iterator');
+        is($it, 1, 'got 1 cart');
+
+        my $cart = $it-&gt;first;
         isa_ok($cart, 'Handel::Cart');
         isa_ok($cart, $subclass);
-        is($cart-&gt;type, CART_TYPE_TEMP);
+        is($cart-&gt;type, CART_TYPE_TEMP, 'got temp type');
 
         $cart-&gt;save;
 
-        my $recart = $subclass-&gt;load({
+        my $reit = $subclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111'
         });
+        isa_ok($reit, 'Handel::Iterator');
+        is($reit, 1, 'got 1 cart');
+
+        my $recart = $reit-&gt;first;
         isa_ok($recart, 'Handel::Cart');
         isa_ok($recart, $subclass);
-        is($cart-&gt;type, CART_TYPE_SAVED);
+        is($cart-&gt;type, CART_TYPE_SAVED, 'got saved type');
     };
 
 };</diff>
      <filename>t/cart_save.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,15 +2,21 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use Cwd;
-use File::Path;
-use File::Spec::Functions;
 
 BEGIN {
-    eval 'use Catalyst 5.56';
+    use lib 't/lib';
+    use Handel::Test;
+    use Cwd;
+    use File::Path;
+    use File::Spec::Functions;
+
+    eval 'use Catalyst 5.7001';
+    plan(skip_all =&gt;
+        'Catalyst 5.7001 not installed') if $@;
+
+    eval 'use Catalyst::Devel 1.0';
     plan(skip_all =&gt;
-        'Catalyst 5.56 not installed') if $@;
+        'Catalyst::Devel 1.0 not installed') if $@;
 
     eval 'use Test::File 1.10';
     plan(skip_all =&gt;
@@ -20,19 +26,24 @@ BEGIN {
     plan(skip_all =&gt;
         'Test::File::Contents 0.02 not installed') if $@;
 
-    plan tests =&gt; 101;
+    plan tests =&gt; 126;
 
     use_ok('Catalyst::Helper');
 };
 
-my $helper = Catalyst::Helper-&gt;new({short =&gt; 1});
+my $helper = Catalyst::Helper-&gt;new;
 my $app = 'TestApp';
 
 
+## setup var
+chdir('t');
+mkdir('var') unless -d 'var';
+chdir('var');
+
+
 ## create test app
 {
-    chdir('t');
-    rmtree('TestApp');
+    rmtree($app);
     $helper-&gt;mk_app($app);
     $FindBin::Bin = catdir(cwd, $app, 'lib');
 };
@@ -40,199 +51,261 @@ my $app = 'TestApp';
 
 ## create the default cart controller
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'Cart.pm');
-    my $list   = catfile($app, 'root', 'cart', 'list.tt');
-    my $view   = catfile($app, 'root', 'cart', 'view.tt');
+    my $module   = catfile($app, 'lib', $app, 'Controller', 'Cart.pm');
+    my $list     = catfile($app, 'root', 'cart', 'list');
+    my $view     = catfile($app, 'root', 'cart', 'default');
+    my $messages = catfile($app, 'root', 'cart', 'messages.yml');
+    my $profiles = catfile($app, 'root', 'cart', 'profiles.yml');
 
     $helper-&gt;mk_component($app, 'controller', 'Cart', 'Handel::Cart');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('Cart'\)-&gt;uuid/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'cart\/view.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'cart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'cart\/list.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'cart\/list\/'\);/);
-    file_contents_like($view, qr/\[% base _ 'cart\/list\/' %\]/);
-    file_contents_like($view, qr/\[% base  _ 'checkout\/' %\]/);
+    file_exists_ok($messages);
+    file_exists_ok($profiles);
+    file_contents_like($module, qr/-&gt;model\('Cart'\)-&gt;storage-&gt;new_uuid/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'cart\/default';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/cart\/'\)\);/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'cart\/list';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/cart\/list\/'\)\);/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/cart\/save\/'\) %\]/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/checkout\/'\) %\]/);
+    file_contents_like($messages, qr/^cart\/save:/);
+    file_contents_like($profiles, qr/^cart\/save:/);
+};
+
+
+## load it up
+{
+    my $lib = catfile(cwd, $app, 'lib');
+    eval &quot;use lib '$lib';use $app\:\:Controller\:\:Cart&quot;;
+    ok(!$@, 'loaded new class');
 };
 
 
 ## create a two part default cart controller
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'My', 'Cart.pm');
-    my $list   = catfile($app, 'root', 'my', 'cart', 'list.tt');
-    my $view   = catfile($app, 'root', 'my', 'cart', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'My', 'Cart.pm');
+    my $list   = catfile($app, 'root', 'my', 'cart', 'list');
+    my $view   = catfile($app, 'root', 'my', 'cart', 'default');
 
     $helper-&gt;mk_component($app, 'controller', 'My::Cart', 'Handel::Cart');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('Cart'\)-&gt;uuid/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'my\/cart\/view.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'my\/cart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'my\/cart\/list.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'my\/cart\/list\/'\);/);
-    file_contents_like($view, qr/\[% base _ 'my\/cart\/list\/' %\]/);
-    file_contents_like($view, qr/\[% base  _ 'checkout\/' %\]/);
+    file_contents_like($module, qr/-&gt;model\('Cart'\)-&gt;storage-&gt;new_uuid/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'my\/cart\/default';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/my\/cart\/'\)\);/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'my\/cart\/list';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/my\/cart\/list\/'\)\);/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/my\/cart\/save\/'\) %\]/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/checkout\/'\) %\]/);
 };
 
 
 ## create a controller with a non-default model class name
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'MyCart.pm');
-    my $list   = catfile($app, 'root', 'mycart', 'list.tt');
-    my $view   = catfile($app, 'root', 'mycart', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'MyCart.pm');
+    my $list   = catfile($app, 'root', 'mycart', 'list');
+    my $view   = catfile($app, 'root', 'mycart', 'default');
 
     $helper-&gt;mk_component($app, 'controller', 'MyCart', 'Handel::Cart', 'MyCartModel');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('MyCartModel'\)-&gt;uuid/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycart\/view.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mycart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycart\/list.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mycart\/list\/'\);/);
-    file_contents_like($view, qr/\[% base _ 'mycart\/list\/' %\]/);
-    file_contents_like($view, qr/\[% base  _ 'checkout\/' %\]/);
+    file_contents_like($module, qr/-&gt;model\('MyCartModel'\)-&gt;storage-&gt;new_uuid/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycart\/default';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mycart\/'\)\);/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycart\/list';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mycart\/list\/'\)\);/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/mycart\/save\/'\) %\]/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/checkout\/'\) %\]/);
 };
 
 
 ## create a controller with a non-default two part model class name
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'MyOtherCart.pm');
-    my $list   = catfile($app, 'root', 'myothercart', 'list.tt');
-    my $view   = catfile($app, 'root', 'myothercart', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'MyOtherCart.pm');
+    my $list   = catfile($app, 'root', 'myothercart', 'list');
+    my $view   = catfile($app, 'root', 'myothercart', 'default');
 
     $helper-&gt;mk_component($app, 'controller', 'MyOtherCart', 'Handel::Cart', 'My::Cart::Model');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('My::Cart::Model'\)-&gt;uuid/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myothercart\/view.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'myothercart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myothercart\/list.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'myothercart\/list\/'\);/);
-    file_contents_like($view, qr/\[% base _ 'myothercart\/list\/' %\]/);
-    file_contents_like($view, qr/\[% base  _ 'checkout\/' %\]/);
+    file_contents_like($module, qr/-&gt;model\('My::Cart::Model'\)-&gt;storage-&gt;new_uuid/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myothercart\/default';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/myothercart\/'\)\);/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myothercart\/list';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/myothercart\/list\/'\)\);/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/myothercart\/save\/'\) %\]/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/checkout\/'\) %\]/);
 };
 
 
 ## create a controller with a non-default fully qualified model class name
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'MyNewCart.pm');
-    my $list   = catfile($app, 'root', 'mynewcart', 'list.tt');
-    my $view   = catfile($app, 'root', 'mynewcart', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'MyNewCart.pm');
+    my $list   = catfile($app, 'root', 'mynewcart', 'list');
+    my $view   = catfile($app, 'root', 'mynewcart', 'default');
 
     $helper-&gt;mk_component($app, 'controller', 'MyNewCart', 'Handel::Cart', 'TestApp::M::MyNewCartModel');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('MyNewCartModel'\)-&gt;uuid/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mynewcart\/view.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mynewcart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mynewcart\/list.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mynewcart\/list\/'\);/);
-    file_contents_like($view, qr/\[% base _ 'mynewcart\/list\/' %\]/);
-    file_contents_like($view, qr/\[% base  _ 'checkout\/' %\]/);
+    file_contents_like($module, qr/-&gt;model\('MyNewCartModel'\)-&gt;storage-&gt;new_uuid/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mynewcart\/default';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mynewcart\/'\)\);/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mynewcart\/list';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mynewcart\/list\/'\)\);/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/mynewcart\/save\/'\) %\]/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/checkout\/'\) %\]/);
 };
 
 
 ## create a controller with a non-default fully qualified model class name
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'MyThirdCart.pm');
-    my $list   = catfile($app, 'root', 'mythirdcart', 'list.tt');
-    my $view   = catfile($app, 'root', 'mythirdcart', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'MyThirdCart.pm');
+    my $list   = catfile($app, 'root', 'mythirdcart', 'list');
+    my $view   = catfile($app, 'root', 'mythirdcart', 'default');
 
     $helper-&gt;mk_component($app, 'controller', 'MyThirdCart', 'Handel::Cart', 'TestApp::Model::MyNewCartModel');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('MyNewCartModel'\)-&gt;uuid/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mythirdcart\/view.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mythirdcart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mythirdcart\/list.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mythirdcart\/list\/'\);/);
-    file_contents_like($view, qr/\[% base _ 'mythirdcart\/list\/' %\]/);
-    file_contents_like($view, qr/\[% base  _ 'checkout\/' %\]/);
+    file_contents_like($module, qr/-&gt;model\('MyNewCartModel'\)-&gt;storage-&gt;new_uuid/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mythirdcart\/default';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mythirdcart\/'\)\);/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mythirdcart\/list';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mythirdcart\/list\/'\)\);/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/mythirdcart\/save\/'\) %\]/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/checkout\/'\) %\]/);
 };
 
 
 ## create a controller with a non-default checkout class name
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'MyCustomCart.pm');
-    my $list   = catfile($app, 'root', 'mycustomcart', 'list.tt');
-    my $view   = catfile($app, 'root', 'mycustomcart', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'MyCustomCart.pm');
+    my $list   = catfile($app, 'root', 'mycustomcart', 'list');
+    my $view   = catfile($app, 'root', 'mycustomcart', 'default');
 
     $helper-&gt;mk_component($app, 'controller', 'MyCustomCart', 'Handel::Cart', 'MyCart', 'MyCheckout');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('MyCart'\)-&gt;uuid/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycustomcart\/view.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mycustomcart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycustomcart\/list.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mycustomcart\/list\/'\);/);
-    file_contents_like($view, qr/\[% base _ 'mycustomcart\/list\/' %\]/);
-    file_contents_like($view, qr/\[% base  _ 'mycheckout\/' %\]/);
+    file_contents_like($module, qr/-&gt;model\('MyCart'\)-&gt;storage-&gt;new_uuid/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycustomcart\/default';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mycustomcart\/'\)\);/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycustomcart\/list';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mycustomcart\/list\/'\)\);/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/mycustomcart\/save\/'\) %\]/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/mycheckout\/'\) %\]/);
 };
 
 
 ## create a controller with a two part checkout class name
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'MyBestCart.pm');
-    my $list   = catfile($app, 'root', 'mybestcart', 'list.tt');
-    my $view   = catfile($app, 'root', 'mybestcart', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'MyBestCart.pm');
+    my $list   = catfile($app, 'root', 'mybestcart', 'list');
+    my $view   = catfile($app, 'root', 'mybestcart', 'default');
 
     $helper-&gt;mk_component($app, 'controller', 'MyBestCart', 'Handel::Cart', 'MyCart', 'My::Checkout');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('MyCart'\)-&gt;uuid/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mybestcart\/view.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mybestcart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mybestcart\/list.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mybestcart\/list\/'\);/);
-    file_contents_like($view, qr/\[% base _ 'mybestcart\/list\/' %\]/);
-    file_contents_like($view, qr/\[% base  _ 'my\/checkout\/' %\]/);
+    file_contents_like($module, qr/-&gt;model\('MyCart'\)-&gt;storage-&gt;new_uuid/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mybestcart\/default';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mybestcart\/'\)\);/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mybestcart\/list';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mybestcart\/list\/'\)\);/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/mybestcart\/save\/'\) %\]/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/my\/checkout\/'\) %\]/);
 };
 
 
 ## create a controller with a fully qualified checkout class name
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'MyWorstCart.pm');
-    my $list   = catfile($app, 'root', 'myworstcart', 'list.tt');
-    my $view   = catfile($app, 'root', 'myworstcart', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'MyWorstCart.pm');
+    my $list   = catfile($app, 'root', 'myworstcart', 'list');
+    my $view   = catfile($app, 'root', 'myworstcart', 'default');
 
     $helper-&gt;mk_component($app, 'controller', 'MyWorstCart', 'Handel::Cart', 'MyCart', 'TestApp::C::My::Checkout');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('MyCart'\)-&gt;uuid/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myworstcart\/view.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'myworstcart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myworstcart\/list.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'myworstcart\/list\/'\);/);
-    file_contents_like($view, qr/\[% base _ 'myworstcart\/list\/' %\]/);
-    file_contents_like($view, qr/\[% base  _ 'my\/checkout\/' %\]/);
+    file_contents_like($module, qr/-&gt;model\('MyCart'\)-&gt;storage-&gt;new_uuid/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myworstcart\/default';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/myworstcart\/'\)\);/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myworstcart\/list';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/myworstcart\/list\/'\)\);/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/myworstcart\/save\/'\) %\]/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/my\/checkout\/'\) %\]/);
 };
 
 
 ## create a controller with a fully qualified checkout class name
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'MyFQCart.pm');
-    my $list   = catfile($app, 'root', 'myfqcart', 'list.tt');
-    my $view   = catfile($app, 'root', 'myfqcart', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'MyFQCart.pm');
+    my $list   = catfile($app, 'root', 'myfqcart', 'list');
+    my $view   = catfile($app, 'root', 'myfqcart', 'default');
 
     $helper-&gt;mk_component($app, 'controller', 'MyFQCart', 'Handel::Cart', 'MyCart', 'TestApp::Controller::My::Checkout');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('MyCart'\)-&gt;uuid/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myfqcart\/view.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'myfqcart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myfqcart\/list.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'myfqcart\/list\/'\);/);
-    file_contents_like($view, qr/\[% base _ 'myfqcart\/list\/' %\]/);
-    file_contents_like($view, qr/\[% base  _ 'my\/checkout\/' %\]/);
+    file_contents_like($module, qr/-&gt;model\('MyCart'\)-&gt;storage-&gt;new_uuid/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myfqcart\/default';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/myfqcart\/'\)\);/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myfqcart\/list';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/myfqcart\/list\/'\)\);/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/myfqcart\/save\/'\) %\]/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/my\/checkout\/'\) %\]/);
+};
+
+
+## create a controller with a faulty model
+{
+    my $module = catfile($app, 'lib', $app, 'Controller', 'My', 'Cart.pm');
+    my $list   = catfile($app, 'root', 'my', 'cart', 'list');
+    my $view   = catfile($app, 'root', 'my', 'cart', 'default');
+
+    unlink $module;
+    unlink $list;
+    unlink $view;
+
+    $helper-&gt;mk_component($app, 'controller', 'My::Cart', 'Handel::Cart', 'TestApp::Model::');
+    file_exists_ok($module);
+    file_exists_ok($list);
+    file_exists_ok($view);
+    file_contents_like($module, qr/-&gt;model\('Cart'\)-&gt;storage-&gt;new_uuid/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'my\/cart\/default';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/my\/cart\/'\)\);/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'my\/cart\/list';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/my\/cart\/list\/'\)\);/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/my\/cart\/save\/'\) %\]/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/checkout\/'\) %\]/);
+};
+
+
+## create a controller with a faulty checkout
+{
+    my $module = catfile($app, 'lib', $app, 'Controller', 'My', 'Cart.pm');
+    my $list   = catfile($app, 'root', 'my', 'cart', 'list');
+    my $view   = catfile($app, 'root', 'my', 'cart', 'default');
+
+    unlink $module;
+    unlink $list;
+    unlink $view;
+
+    $helper-&gt;mk_component($app, 'controller', 'My::Cart', 'Handel::Cart', 'Cart', 'TestApp::Controller::');
+    file_exists_ok($module);
+    file_exists_ok($list);
+    file_exists_ok($view);
+    file_contents_like($module, qr/-&gt;model\('Cart'\)-&gt;storage-&gt;new_uuid/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'my\/cart\/default';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/my\/cart\/'\)\);/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'my\/cart\/list';/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/my\/cart\/list\/'\)\);/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/my\/cart\/save\/'\) %\]/);
+    file_contents_like($view, qr/\[% c.uri_for\('\/checkout\/'\) %\]/);
 };</diff>
      <filename>t/catalyst_helpers_controller_cart.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,15 +2,21 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use Cwd;
-use File::Path;
-use File::Spec::Functions;
 
 BEGIN {
-    eval 'use Catalyst 5.56';
+    use lib 't/lib';
+    use Handel::Test;
+    use Cwd;
+    use File::Path;
+    use File::Spec::Functions;
+
+    eval 'use Catalyst 5.7001';
+    plan(skip_all =&gt;
+        'Catalyst 5.7001 not installed') if $@;
+
+    eval 'use Catalyst::Devel 1.0';
     plan(skip_all =&gt;
-        'Catalyst 5.56 not installed') if $@;
+        'Catalyst::Devel 1.0 not installed') if $@;
 
     eval 'use Test::File 1.10';
     plan(skip_all =&gt;
@@ -20,19 +26,24 @@ BEGIN {
     plan(skip_all =&gt;
         'Test::File::Contents 0.02 not installed') if $@;
 
-    plan tests =&gt; 91;
+    plan tests =&gt; 94;
 
     use_ok('Catalyst::Helper');
 };
 
-my $helper = Catalyst::Helper-&gt;new({short =&gt; 1});
+my $helper = Catalyst::Helper-&gt;new;
 my $app = 'TestApp';
 
 
+## setup var
+chdir('t');
+mkdir('var') unless -d 'var';
+chdir('var');
+
+
 ## create test app
 {
-    chdir('t');
-    rmtree('TestApp');
+    rmtree($app);
     $helper-&gt;mk_app($app);
     $FindBin::Bin = catdir(cwd, $app, 'lib');
 };
@@ -40,11 +51,13 @@ my $app = 'TestApp';
 
 ## create the default checkout controller
 {
-    my $module   = catfile($app, 'lib', $app, 'C', 'Checkout.pm');
-    my $edit     = catfile($app, 'root', 'checkout', 'edit.tt');
-    my $preview  = catfile($app, 'root', 'checkout', 'preview.tt');
-    my $payment  = catfile($app, 'root', 'checkout', 'payment.tt');
-    my $complete = catfile($app, 'root', 'checkout', 'complete.tt');
+    my $module   = catfile($app, 'lib', $app, 'Controller', 'Checkout.pm');
+    my $edit     = catfile($app, 'root', 'checkout', 'billing');
+    my $preview  = catfile($app, 'root', 'checkout', 'preview');
+    my $payment  = catfile($app, 'root', 'checkout', 'payment');
+    my $complete = catfile($app, 'root', 'checkout', 'complete');
+    my $messages = catfile($app, 'root', 'checkout', 'messages.yml');
+    my $profiles = catfile($app, 'root', 'checkout', 'profiles.yml');
 
     $helper-&gt;mk_component($app, 'controller', 'Checkout', 'Handel::Checkout');
     file_exists_ok($module);
@@ -52,30 +65,40 @@ my $app = 'TestApp';
     file_exists_ok($preview);
     file_exists_ok($payment);
     file_exists_ok($complete);
+    file_exists_ok($messages);
+    file_exists_ok($profiles);
+    file_contents_like($module, qr/-&gt;controller\('Cart'\)/);
+    file_contents_like($module, qr/-&gt;controller\('Order'\)/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/checkout\/'\)/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'checkout\/billing';/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'checkout\/payment';/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'checkout\/complete';/);
+    file_contents_like($edit, qr/\[% c.uri_for\('\/checkout\/billing\/'\) %\]/);
+    file_contents_like($preview, qr/\[% c.uri_for\('\/checkout\/payment\/'\) %\]/);
+    file_contents_like($payment, qr/\[% c.uri_for\('\/checkout\/payment\/'\) %\]/);
+    file_contents_like($messages, qr/^checkout\/view:/);
+    file_contents_like($profiles, qr/^checkout\/view:/);
+};
+
 
-    file_contents_like($module, qr/-&gt;model\('Cart'\)-&gt;load/);
-    file_contents_like($module, qr/-&gt;model\('Orders'\)-&gt;load/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'cart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'checkout\/edit.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'checkout\/preview\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'checkout\/payment.tt';/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'checkout\/complete.tt';/);
-    file_contents_like($edit, qr/\[% base _ 'cart\/' %\]/);
-    file_contents_like($edit, qr/\[% base _ 'checkout\/update\/' %\]/);
-    file_contents_like($preview, qr/\[% base _ 'checkout\/edit\/' %\]/);
-    file_contents_like($payment, qr/\[% base _ 'checkout\/preview\/' %\]/);
-    file_contents_like($payment, qr/\[% base _ 'checkout\/payment\/' %\]/);
-    file_contents_like($complete, qr/\[% base _ 'orders\/list\/' %\]/);
+## load it up
+SKIP: {
+    eval 'require HTML::FillInForm';
+    skip 'HTML::FillInForm not installed', 1 if $@;
+
+    my $lib = catfile(cwd, $app, 'lib');
+    eval &quot;use lib '$lib';use $app\:\:Controller\:\:Checkout&quot;;
+    ok(!$@, 'loaded new class');
 };
 
 
 ## create the checkout controller with custom model/controller args
 {
-    my $module   = catfile($app, 'lib', $app, 'C', 'MyCheckout.pm');
-    my $edit     = catfile($app, 'root', 'mycheckout', 'edit.tt');
-    my $preview  = catfile($app, 'root', 'mycheckout', 'preview.tt');
-    my $payment  = catfile($app, 'root', 'mycheckout', 'payment.tt');
-    my $complete = catfile($app, 'root', 'mycheckout', 'complete.tt');
+    my $module   = catfile($app, 'lib', $app, 'Controller', 'MyCheckout.pm');
+    my $edit     = catfile($app, 'root', 'mycheckout', 'billing');
+    my $preview  = catfile($app, 'root', 'mycheckout', 'preview');
+    my $payment  = catfile($app, 'root', 'mycheckout', 'payment');
+    my $complete = catfile($app, 'root', 'mycheckout', 'complete');
 
     $helper-&gt;mk_component($app, 'controller', 'MyCheckout', 'Handel::Checkout', 'MyCartModel', 'MyOrdersModel', 'MyCart', 'MyOrders');
     file_exists_ok($module);
@@ -84,29 +107,25 @@ my $app = 'TestApp';
     file_exists_ok($payment);
     file_exists_ok($complete);
 
-    file_contents_like($module, qr/-&gt;model\('MyCartModel'\)-&gt;load/);
-    file_contents_like($module, qr/-&gt;model\('MyOrdersModel'\)-&gt;load/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mycart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycheckout\/edit.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mycheckout\/preview\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycheckout\/payment.tt';/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycheckout\/complete.tt';/);
-    file_contents_like($edit, qr/\[% base _ 'mycart\/' %\]/);
-    file_contents_like($edit, qr/\[% base _ 'mycheckout\/update\/' %\]/);
-    file_contents_like($preview, qr/\[% base _ 'mycheckout\/edit\/' %\]/);
-    file_contents_like($payment, qr/\[% base _ 'mycheckout\/preview\/' %\]/);
-    file_contents_like($payment, qr/\[% base _ 'mycheckout\/payment\/' %\]/);
-    file_contents_like($complete, qr/\[% base _ 'myorders\/list\/' %\]/);
+    file_contents_like($module, qr/-&gt;controller\('MyCart'\)/);
+    file_contents_like($module, qr/-&gt;controller\('MyOrders'\)/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mycheckout\/'\)/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycheckout\/billing';/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycheckout\/payment';/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mycheckout\/complete';/);
+    file_contents_like($edit, qr/\[% c.uri_for\('\/mycheckout\/billing\/'\) %\]/);
+    file_contents_like($preview, qr/\[% c.uri_for\('\/mycheckout\/payment\/'\) %\]/);
+    file_contents_like($payment, qr/\[% c.uri_for\('\/mycheckout\/payment\/'\) %\]/);
 };
 
 
 ## create the checkout controller with custom two part model/controller args
 {
-    my $module   = catfile($app, 'lib', $app, 'C', 'MyNewCheckout.pm');
-    my $edit     = catfile($app, 'root', 'mynewcheckout', 'edit.tt');
-    my $preview  = catfile($app, 'root', 'mynewcheckout', 'preview.tt');
-    my $payment  = catfile($app, 'root', 'mynewcheckout', 'payment.tt');
-    my $complete = catfile($app, 'root', 'mynewcheckout', 'complete.tt');
+    my $module   = catfile($app, 'lib', $app, 'Controller', 'MyNewCheckout.pm');
+    my $edit     = catfile($app, 'root', 'mynewcheckout', 'billing');
+    my $preview  = catfile($app, 'root', 'mynewcheckout', 'preview');
+    my $payment  = catfile($app, 'root', 'mynewcheckout', 'payment');
+    my $complete = catfile($app, 'root', 'mynewcheckout', 'complete');
 
     $helper-&gt;mk_component($app, 'controller', 'MyNewCheckout', 'Handel::Checkout', 'My::CartModel', 'My::OrdersModel', 'My::Cart', 'My::Orders');
     file_exists_ok($module);
@@ -115,29 +134,25 @@ my $app = 'TestApp';
     file_exists_ok($payment);
     file_exists_ok($complete);
 
-    file_contents_like($module, qr/-&gt;model\('My::CartModel'\)-&gt;load/);
-    file_contents_like($module, qr/-&gt;model\('My::OrdersModel'\)-&gt;load/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'my\/cart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mynewcheckout\/edit.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mynewcheckout\/preview\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mynewcheckout\/payment.tt';/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mynewcheckout\/complete.tt';/);
-    file_contents_like($edit, qr/\[% base _ 'my\/cart\/' %\]/);
-    file_contents_like($edit, qr/\[% base _ 'mynewcheckout\/update\/' %\]/);
-    file_contents_like($preview, qr/\[% base _ 'mynewcheckout\/edit\/' %\]/);
-    file_contents_like($payment, qr/\[% base _ 'mynewcheckout\/preview\/' %\]/);
-    file_contents_like($payment, qr/\[% base _ 'mynewcheckout\/payment\/' %\]/);
-    file_contents_like($complete, qr/\[% base _ 'my\/orders\/list\/' %\]/);
+    file_contents_like($module, qr/-&gt;controller\('My::Cart'\)/);
+    file_contents_like($module, qr/-&gt;controller\('My::Orders'\)/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mynewcheckout\/'\)/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mynewcheckout\/billing';/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mynewcheckout\/payment';/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mynewcheckout\/complete';/);
+    file_contents_like($edit, qr/\[% c.uri_for\('\/mynewcheckout\/billing\/'\) %\]/);
+    file_contents_like($preview, qr/\[% c.uri_for\('\/mynewcheckout\/payment\/'\) %\]/);
+    file_contents_like($payment, qr/\[% c.uri_for\('\/mynewcheckout\/payment\/'\) %\]/);
 };
 
 
 ## create the checkout controller with custom fully qualified part model/controller args
 {
-    my $module   = catfile($app, 'lib', $app, 'C', 'MyOtherCheckout.pm');
-    my $edit     = catfile($app, 'root', 'myothercheckout', 'edit.tt');
-    my $preview  = catfile($app, 'root', 'myothercheckout', 'preview.tt');
-    my $payment  = catfile($app, 'root', 'myothercheckout', 'payment.tt');
-    my $complete = catfile($app, 'root', 'myothercheckout', 'complete.tt');
+    my $module   = catfile($app, 'lib', $app, 'Controller', 'MyOtherCheckout.pm');
+    my $edit     = catfile($app, 'root', 'myothercheckout', 'billing');
+    my $preview  = catfile($app, 'root', 'myothercheckout', 'preview');
+    my $payment  = catfile($app, 'root', 'myothercheckout', 'payment');
+    my $complete = catfile($app, 'root', 'myothercheckout', 'complete');
 
     $helper-&gt;mk_component($app, 'controller', 'MyOtherCheckout', 'Handel::Checkout', 'TestApp::M::My::CartModel', 'TestApp::M::My::OrdersModel', 'TestApp::C::My::Cart', 'TestApp::C::My::Orders');
     file_exists_ok($module);
@@ -146,29 +161,25 @@ my $app = 'TestApp';
     file_exists_ok($payment);
     file_exists_ok($complete);
 
-    file_contents_like($module, qr/-&gt;model\('My::CartModel'\)-&gt;load/);
-    file_contents_like($module, qr/-&gt;model\('My::OrdersModel'\)-&gt;load/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'my\/cart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myothercheckout\/edit.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'myothercheckout\/preview\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myothercheckout\/payment.tt';/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myothercheckout\/complete.tt';/);
-    file_contents_like($edit, qr/\[% base _ 'my\/cart\/' %\]/);
-    file_contents_like($edit, qr/\[% base _ 'myothercheckout\/update\/' %\]/);
-    file_contents_like($preview, qr/\[% base _ 'myothercheckout\/edit\/' %\]/);
-    file_contents_like($payment, qr/\[% base _ 'myothercheckout\/preview\/' %\]/);
-    file_contents_like($payment, qr/\[% base _ 'myothercheckout\/payment\/' %\]/);
-    file_contents_like($complete, qr/\[% base _ 'my\/orders\/list\/' %\]/);
+    file_contents_like($module, qr/-&gt;controller\('My::Cart'\)/);
+    file_contents_like($module, qr/-&gt;controller\('My::Orders'\)/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/myothercheckout\/'\)/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myothercheckout\/billing';/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myothercheckout\/payment';/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'myothercheckout\/complete';/);
+    file_contents_like($edit, qr/\[% c.uri_for\('\/myothercheckout\/billing\/'\) %\]/);
+    file_contents_like($preview, qr/\[% c.uri_for\('\/myothercheckout\/payment\/'\) %\]/);
+    file_contents_like($payment, qr/\[% c.uri_for\('\/myothercheckout\/payment\/'\) %\]/);
 };
 
 
 ## create the checkout controller with custom fully qualified part model/controller args
 {
-    my $module   = catfile($app, 'lib', $app, 'C', 'MyThirdCheckout.pm');
-    my $edit     = catfile($app, 'root', 'mythirdcheckout', 'edit.tt');
-    my $preview  = catfile($app, 'root', 'mythirdcheckout', 'preview.tt');
-    my $payment  = catfile($app, 'root', 'mythirdcheckout', 'payment.tt');
-    my $complete = catfile($app, 'root', 'mythirdcheckout', 'complete.tt');
+    my $module   = catfile($app, 'lib', $app, 'Controller', 'MyThirdCheckout.pm');
+    my $edit     = catfile($app, 'root', 'mythirdcheckout', 'billing');
+    my $preview  = catfile($app, 'root', 'mythirdcheckout', 'preview');
+    my $payment  = catfile($app, 'root', 'mythirdcheckout', 'payment');
+    my $complete = catfile($app, 'root', 'mythirdcheckout', 'complete');
 
     $helper-&gt;mk_component($app, 'controller', 'MyThirdCheckout', 'Handel::Checkout', 'TestApp::Model::My::CartModel', 'TestApp::Model::My::OrdersModel', 'TestApp::Controller::My::Cart', 'TestApp::Controller::My::Orders');
     file_exists_ok($module);
@@ -177,17 +188,53 @@ my $app = 'TestApp';
     file_exists_ok($payment);
     file_exists_ok($complete);
 
-    file_contents_like($module, qr/-&gt;model\('My::CartModel'\)-&gt;load/);
-    file_contents_like($module, qr/-&gt;model\('My::OrdersModel'\)-&gt;load/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'my\/cart\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mythirdcheckout\/edit.tt';/);
-    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;req-&gt;base . 'mythirdcheckout\/preview\/'\);/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mythirdcheckout\/payment.tt';/);
-    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mythirdcheckout\/complete.tt';/);
-    file_contents_like($edit, qr/\[% base _ 'my\/cart\/' %\]/);
-    file_contents_like($edit, qr/\[% base _ 'mythirdcheckout\/update\/' %\]/);
-    file_contents_like($preview, qr/\[% base _ 'mythirdcheckout\/edit\/' %\]/);
-    file_contents_like($payment, qr/\[% base _ 'mythirdcheckout\/preview\/' %\]/);
-    file_contents_like($payment, qr/\[% base _ 'mythirdcheckout\/payment\/' %\]/);
-    file_contents_like($complete, qr/\[% base _ 'my\/orders\/list\/' %\]/);
+    file_contents_like($module, qr/-&gt;controller\('My::Cart'\)/);
+    file_contents_like($module, qr/-&gt;controller\('My::Orders'\)/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/mythirdcheckout\/'\)/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mythirdcheckout\/billing';/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mythirdcheckout\/payment';/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'mythirdcheckout\/complete';/);
+    file_contents_like($edit, qr/\[% c.uri_for\('\/mythirdcheckout\/billing\/'\) %\]/);
+    file_contents_like($preview, qr/\[% c.uri_for\('\/mythirdcheckout\/payment\/'\) %\]/);
+    file_contents_like($payment, qr/\[% c.uri_for\('\/mythirdcheckout\/payment\/'\) %\]/);
+};
+
+
+## create the default checkout controller with bogus controller/models
+{
+    my $module   = catfile($app, 'lib', $app, 'Controller', 'Checkout.pm');
+    my $edit     = catfile($app, 'root', 'checkout', 'billing');
+    my $preview  = catfile($app, 'root', 'checkout', 'preview');
+    my $payment  = catfile($app, 'root', 'checkout', 'payment');
+    my $complete = catfile($app, 'root', 'checkout', 'complete');
+    my $messages = catfile($app, 'root', 'checkout', 'messages.yml');
+    my $profiles = catfile($app, 'root', 'checkout', 'profiles.yml');
+
+    unlink $module;
+    unlink $edit;
+    unlink $preview;
+    unlink $payment;
+    unlink $complete;
+    unlink $messages;
+    unlink $profiles;
+
+    $helper-&gt;mk_component($app, 'controller', 'Checkout', 'Handel::Checkout', 'TestApp::Model::', 'TestApp::Model::', 'TestApp::Controller::', 'TestApp::Controller::');
+    file_exists_ok($module);
+    file_exists_ok($edit);
+    file_exists_ok($preview);
+    file_exists_ok($payment);
+    file_exists_ok($complete);
+    file_exists_ok($messages);
+    file_exists_ok($profiles);
+    file_contents_like($module, qr/-&gt;controller\('Cart'\)/);
+    file_contents_like($module, qr/-&gt;controller\('Order'\)/);
+    file_contents_like($module, qr/\$c-&gt;res-&gt;redirect\(\$c-&gt;uri_for\('\/checkout\/'\)/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'checkout\/billing';/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'checkout\/payment';/);
+    file_contents_like($module, qr/\$c-&gt;stash-&gt;{'template'} = 'checkout\/complete';/);
+    file_contents_like($edit, qr/\[% c.uri_for\('\/checkout\/billing\/'\) %\]/);
+    file_contents_like($preview, qr/\[% c.uri_for\('\/checkout\/payment\/'\) %\]/);
+    file_contents_like($payment, qr/\[% c.uri_for\('\/checkout\/payment\/'\) %\]/);
+    file_contents_like($messages, qr/^checkout\/view:/);
+    file_contents_like($profiles, qr/^checkout\/view:/);
 };</diff>
      <filename>t/catalyst_helpers_controller_checkout.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,15 +2,21 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use Cwd;
-use File::Path;
-use File::Spec::Functions;
 
 BEGIN {
-    eval 'use Catalyst 5.56';
+    use lib 't/lib';
+    use Handel::Test;
+    use Cwd;
+    use File::Path;
+    use File::Spec::Functions;
+
+    eval 'use Catalyst 5.7001';
+    plan(skip_all =&gt;
+        'Catalyst 5.7001 not installed') if $@;
+
+    eval 'use Catalyst::Devel 1.0';
     plan(skip_all =&gt;
-        'Catalyst 5.56 not installed') if $@;
+        'Catalyst::Devel 1.0 not installed') if $@;
 
     eval 'use Test::File 1.10';
     plan(skip_all =&gt;
@@ -20,19 +26,24 @@ BEGIN {
     plan(skip_all =&gt;
         'Test::File::Contents 0.02 not installed') if $@;
 
-    plan tests =&gt; 46;
+    plan tests =&gt; 58;
 
     use_ok('Catalyst::Helper');
 };
 
-my $helper = Catalyst::Helper-&gt;new({short =&gt; 1});
+my $helper = Catalyst::Helper-&gt;new;
 my $app = 'TestApp';
 
 
+## setup var
+chdir('t');
+mkdir('var') unless -d 'var';
+chdir('var');
+
+
 ## create test app
 {
-    chdir('t');
-    rmtree('TestApp');
+    rmtree($app);
     $helper-&gt;mk_app($app);
     $FindBin::Bin = catdir(cwd, $app, 'lib');
 };
@@ -40,94 +51,133 @@ my $app = 'TestApp';
 
 ## create the default order controller
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'Orders.pm');
-    my $list   = catfile($app, 'root', 'orders', 'list.tt');
-    my $view   = catfile($app, 'root', 'orders', 'view.tt');
+    my $module   = catfile($app, 'lib', $app, 'Controller', 'Orders.pm');
+    my $list     = catfile($app, 'root', 'orders', 'default');
+    my $view     = catfile($app, 'root', 'orders', 'view');
+    my $messages = catfile($app, 'root', 'orders', 'messages.yml');
+    my $profiles = catfile($app, 'root', 'orders', 'profiles.yml');
 
     $helper-&gt;mk_component($app, 'controller', 'Orders', 'Handel::Order');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('Orders'\)-&gt;load/);
-    file_contents_like($module, qr/= 'orders\/view.tt'/);
-    file_contents_like($module, qr/= 'orders\/list.tt'/);
-    file_contents_like($view,   qr/\[% base _ 'orders\/' %\]/);
-    file_contents_like($list,   qr/\[% base _ 'orders\/' %\]/);
-    file_contents_like($list,   qr/\[% base _ 'orders\/view\/'/);
+    file_exists_ok($messages);
+    file_exists_ok($profiles);
+    file_contents_like($module,   qr/-&gt;model\('Order'\)/);
+    file_contents_like($module,   qr/= 'orders\/view'/);
+    file_contents_like($module,   qr/= 'orders\/default'/);
+    file_contents_like($view,     qr/INCLUDE orders\/errors/);
+    file_contents_like($list,     qr/\[% c.uri_for\('\/orders\/view'/);
+    file_contents_like($messages, qr/^orders\/view:/);
+    file_contents_like($profiles, qr/^orders\/view:/);
+};
+
+
+## load it up
+{
+    my $lib = catfile(cwd, $app, 'lib');
+    eval &quot;use lib '$lib';use $app\:\:Controller\:\:Orders&quot;;
+    ok(!$@, 'loaded new class');
 };
 
 
 ## create the default order controller with custom model name
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'MyOrders.pm');
-    my $list   = catfile($app, 'root', 'myorders', 'list.tt');
-    my $view   = catfile($app, 'root', 'myorders', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'MyOrders.pm');
+    my $list   = catfile($app, 'root', 'myorders', 'default');
+    my $view   = catfile($app, 'root', 'myorders', 'view');
 
     $helper-&gt;mk_component($app, 'controller', 'MyOrders', 'Handel::Order', 'MyOrderModel');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('MyOrderModel'\)-&gt;load/);
-    file_contents_like($module, qr/= 'myorders\/view.tt'/);
-    file_contents_like($module, qr/= 'myorders\/list.tt'/);
-    file_contents_like($view,   qr/\[% base _ 'myorders\/' %\]/);
-    file_contents_like($list,   qr/\[% base _ 'myorders\/' %\]/);
-    file_contents_like($list,   qr/\[% base _ 'myorders\/view\/'/);
+    file_contents_like($module, qr/-&gt;model\('MyOrderModel'\)/);
+    file_contents_like($module, qr/= 'myorders\/view'/);
+    file_contents_like($module, qr/= 'myorders\/default'/);
+    file_contents_like($view,   qr/INCLUDE myorders\/errors/);
+    file_contents_like($list,   qr/\[% c.uri_for\('\/myorders\/view'/);
 };
 
 
 ## create the default order controller with custom two part model name
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'MyOtherOrders.pm');
-    my $list   = catfile($app, 'root', 'myotherorders', 'list.tt');
-    my $view   = catfile($app, 'root', 'myotherorders', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'MyOtherOrders.pm');
+    my $list   = catfile($app, 'root', 'myotherorders', 'default');
+    my $view   = catfile($app, 'root', 'myotherorders', 'view');
 
     $helper-&gt;mk_component($app, 'controller', 'MyOtherOrders', 'Handel::Order', 'My::OrderModel');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('My::OrderModel'\)-&gt;load/);
-    file_contents_like($module, qr/= 'myotherorders\/view.tt'/);
-    file_contents_like($module, qr/= 'myotherorders\/list.tt'/);
-    file_contents_like($view,   qr/\[% base _ 'myotherorders\/' %\]/);
-    file_contents_like($list,   qr/\[% base _ 'myotherorders\/' %\]/);
-    file_contents_like($list,   qr/\[% base _ 'myotherorders\/view\/'/);
+    file_contents_like($module, qr/-&gt;model\('My::OrderModel'\)/);
+    file_contents_like($module, qr/= 'myotherorders\/view'/);
+    file_contents_like($module, qr/= 'myotherorders\/default'/);
+    file_contents_like($view,   qr/INCLUDE myotherorders\/errors/);
+    file_contents_like($list,   qr/\[% c.uri_for\('\/myotherorders\/view'/);
 };
 
 
 ## create the default order controller with fully qualified model name
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'MyCustomOrder.pm');
-    my $list   = catfile($app, 'root', 'mycustomorder', 'list.tt');
-    my $view   = catfile($app, 'root', 'mycustomorder', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'MyCustomOrder.pm');
+    my $list   = catfile($app, 'root', 'mycustomorder', 'default');
+    my $view   = catfile($app, 'root', 'mycustomorder', 'view');
 
     $helper-&gt;mk_component($app, 'controller', 'MyCustomOrder', 'Handel::Order', 'TestApp::M::My::OrderModel');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('My::OrderModel'\)-&gt;load/);
-    file_contents_like($module, qr/= 'mycustomorder\/view.tt'/);
-    file_contents_like($module, qr/= 'mycustomorder\/list.tt'/);
-    file_contents_like($view,   qr/\[% base _ 'mycustomorder\/' %\]/);
-    file_contents_like($list,   qr/\[% base _ 'mycustomorder\/' %\]/);
-    file_contents_like($list,   qr/\[% base _ 'mycustomorder\/view\/'/);
+    file_contents_like($module, qr/-&gt;model\('My::OrderModel'\)/);
+    file_contents_like($module, qr/= 'mycustomorder\/view'/);
+    file_contents_like($module, qr/= 'mycustomorder\/default'/);
+    file_contents_like($view,   qr/INCLUDE mycustomorder\/errors/);
+    file_contents_like($list,   qr/\[% c.uri_for\('\/mycustomorder\/view'/);
 };
 
 
 ## create the default order controller with fully qualified model name
 {
-    my $module = catfile($app, 'lib', $app, 'C', 'MyThirdOrder.pm');
-    my $list   = catfile($app, 'root', 'mythirdorder', 'list.tt');
-    my $view   = catfile($app, 'root', 'mythirdorder', 'view.tt');
+    my $module = catfile($app, 'lib', $app, 'Controller', 'MyThirdOrder.pm');
+    my $list   = catfile($app, 'root', 'mythirdorder', 'default');
+    my $view   = catfile($app, 'root', 'mythirdorder', 'view');
 
     $helper-&gt;mk_component($app, 'controller', 'MyThirdOrder', 'Handel::Order', 'TestApp::Model::My::OrderModel');
     file_exists_ok($module);
     file_exists_ok($list);
     file_exists_ok($view);
-    file_contents_like($module, qr/-&gt;model\('My::OrderModel'\)-&gt;load/);
-    file_contents_like($module, qr/= 'mythirdorder\/view.tt'/);
-    file_contents_like($module, qr/= 'mythirdorder\/list.tt'/);
-    file_contents_like($view,   qr/\[% base _ 'mythirdorder\/' %\]/);
-    file_contents_like($list,   qr/\[% base _ 'mythirdorder\/' %\]/);
-    file_contents_like($list,   qr/\[% base _ 'mythirdorder\/view\/'/);
+    file_contents_like($module, qr/-&gt;model\('My::OrderModel'\)/);
+    file_contents_like($module, qr/= 'mythirdorder\/view'/);
+    file_contents_like($module, qr/= 'mythirdorder\/default'/);
+    file_contents_like($view,   qr/INCLUDE mythirdorder\/errors/);
+    file_contents_like($list,   qr/\[% c.uri_for\('\/mythirdorder\/view'/);
+};
+
+
+## create the default order controller with bogus order model
+{
+    my $module   = catfile($app, 'lib', $app, 'Controller', 'Orders.pm');
+    my $list     = catfile($app, 'root', 'orders', 'default');
+    my $view     = catfile($app, 'root', 'orders', 'view');
+    my $messages = catfile($app, 'root', 'orders', 'messages.yml');
+    my $profiles = catfile($app, 'root', 'orders', 'profiles.yml');
+
+    unlink $module;
+    unlink $list;
+    unlink $view;
+    unlink $messages;
+    unlink $profiles;
+
+    $helper-&gt;mk_component($app, 'controller', 'Orders', 'Handel::Order', 'TestApp::Model::');
+    file_exists_ok($module);
+    file_exists_ok($list);
+    file_exists_ok($view);
+    file_exists_ok($messages);
+    file_exists_ok($profiles);
+    file_contents_like($module,   qr/-&gt;model\('Order'\)/);
+    file_contents_like($module,   qr/= 'orders\/view'/);
+    file_contents_like($module,   qr/= 'orders\/default'/);
+    file_contents_like($view,     qr/INCLUDE orders\/errors/);
+    file_contents_like($list,     qr/\[% c.uri_for\('\/orders\/view'/);
+    file_contents_like($messages, qr/^orders\/view:/);
+    file_contents_like($profiles, qr/^orders\/view:/);
 };</diff>
      <filename>t/catalyst_helpers_controller_order.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,15 +2,21 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use Cwd;
-use File::Path;
-use File::Spec::Functions;
 
 BEGIN {
-    eval 'use Catalyst 5.56';
+    use lib 't/lib';
+    use Handel::Test;
+    use Cwd;
+    use File::Path;
+    use File::Spec::Functions;
+
+    eval 'use Catalyst 5.7001';
+    plan(skip_all =&gt;
+        'Catalyst 5.7001 not installed') if $@;
+
+    eval 'use Catalyst::Devel 1.0';
     plan(skip_all =&gt;
-        'Catalyst 5.56 not installed') if $@;
+        'Catalyst::Devel 1.0 not installed') if $@;
 
     eval 'use Test::File 1.10';
     plan(skip_all =&gt;
@@ -20,20 +26,24 @@ BEGIN {
     plan(skip_all =&gt;
         'Test::File::Contents 0.02 not installed') if $@;
 
-    plan tests =&gt; 5;
+    plan tests =&gt; 8;
 
     use_ok('Catalyst::Helper');
 };
 
-my $helper = Catalyst::Helper-&gt;new({short =&gt; 1});
+my $helper = Catalyst::Helper-&gt;new;
 my $app = 'TestApp';
 
 
+## setup var
+chdir('t');
+mkdir('var') unless -d 'var';
+chdir('var');
+
+
 ## create the test app
 {
-    chdir('t');
-    rmtree('TestApp');
-
+    rmtree($app);
     $helper-&gt;mk_app($app);
     $FindBin::Bin = catdir(cwd, $app, 'lib');
 };
@@ -41,10 +51,27 @@ my $app = 'TestApp';
 
 ## create the default model
 {
-    my $module = catfile($app, 'lib', $app, 'M', 'Cart.pm');
+    my $module = catfile($app, 'lib', $app, 'Model', 'Cart.pm');
     $helper-&gt;mk_component($app, 'model', 'Cart', 'Handel::Cart', 'testdsn', 'testuser', 'testpass');
     file_exists_ok($module);
     file_contents_like($module, qr/'testdsn'/);
     file_contents_like($module, qr/'testuser'/);
     file_contents_like($module, qr/'testpass'/);
 };
+
+
+## create the default model without defaults
+{
+    my $module = catfile($app, 'lib', $app, 'Model', 'MyCart.pm');
+    $helper-&gt;mk_component($app, 'model', 'MyCart', 'Handel::Cart');
+    file_exists_ok($module);
+    file_contents_like($module, qr/\['', '', ''\]/);
+};
+
+
+## load it up
+{
+    my $lib = catfile(cwd, $app, 'lib');
+    eval &quot;use lib '$lib';use $app\:\:Model\:\:Cart&quot;;
+    ok(!$@, 'loaded new class');
+};</diff>
      <filename>t/catalyst_helpers_model_cart.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,15 +2,21 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use Cwd;
-use File::Path;
-use File::Spec::Functions;
 
 BEGIN {
-    eval 'use Catalyst 5.56';
+    use lib 't/lib';
+    use Handel::Test;
+    use Cwd;
+    use File::Path;
+    use File::Spec::Functions;
+
+    eval 'use Catalyst 5.7001';
+    plan(skip_all =&gt;
+        'Catalyst 5.7001 not installed') if $@;
+
+    eval 'use Catalyst::Devel 1.0';
     plan(skip_all =&gt;
-        'Catalyst 5.56 not installed') if $@;
+        'Catalyst::Devel 1.0 not installed') if $@;
 
     eval 'use Test::File 1.10';
     plan(skip_all =&gt;
@@ -20,20 +26,24 @@ BEGIN {
     plan(skip_all =&gt;
         'Test::File::Contents 0.02 not installed') if $@;
 
-    plan tests =&gt; 5;
+    plan tests =&gt; 8;
 
     use_ok('Catalyst::Helper');
 };
 
-my $helper = Catalyst::Helper-&gt;new({short =&gt; 1});
+my $helper = Catalyst::Helper-&gt;new;
 my $app = 'TestApp';
 
 
+## setup var
+chdir('t');
+mkdir('var') unless -d 'var';
+chdir('var');
+
+
 ## create the test app
 {
-    chdir('t');
-    rmtree('TestApp');
-
+    rmtree($app);
     $helper-&gt;mk_app($app);
     $FindBin::Bin = catdir(cwd, $app, 'lib');
 };
@@ -41,10 +51,27 @@ my $app = 'TestApp';
 
 ## create the default model
 {
-    my $module = catfile($app, 'lib', $app, 'M', 'Order.pm');
-    $helper-&gt;mk_component($app, 'model', 'Order', 'Handel::Cart', 'testdsn', 'testuser', 'testpass');
+    my $module = catfile($app, 'lib', $app, 'Model', 'Order.pm');
+    $helper-&gt;mk_component($app, 'model', 'Order', 'Handel::Order', 'testdsn', 'testuser', 'testpass');
     file_exists_ok($module);
     file_contents_like($module, qr/'testdsn'/);
     file_contents_like($module, qr/'testuser'/);
     file_contents_like($module, qr/'testpass'/);
 };
+
+
+## create the default model without defaults
+{
+    my $module = catfile($app, 'lib', $app, 'Model', 'MyOrder.pm');
+    $helper-&gt;mk_component($app, 'model', 'MyOrder', 'Handel::Order');
+    file_exists_ok($module);
+    file_contents_like($module, qr/\['', '', ''\]/);
+};
+
+
+## load it up
+{
+    my $lib = catfile(cwd, $app, 'lib');
+    eval &quot;use lib '$lib';use $app\:\:Model\:\:Order&quot;;
+    ok(!$@, 'loaded new class');
+};</diff>
      <filename>t/catalyst_helpers_model_order.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,29 +2,31 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 199;
+        plan tests =&gt; 220;
     };
 
     use_ok('Handel::Checkout');
     use_ok('Handel::Cart');
     use_ok('Handel::Subclassing::Cart');
     use_ok('Handel::Subclassing::CartOnly');
-    use_ok('Handel::Constants', qw(:order :returnas));
+    use_ok('Handel::Constants', qw(:order));
     use_ok('Handel::Exception', ':try');
     use_ok('Handel::Order');
 };
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Cart', 'Handel::Cart::Item', 1);
 &amp;run('Handel::Subclassing::CartOnly', 'Handel::Cart::Item', 2);
 &amp;run('Handel::Subclassing::Cart', 'Handel::Subclassing::CartItem', 3);
@@ -32,49 +34,51 @@ BEGIN {
 sub run {
     my ($subclass, $itemclass, $dbsuffix) = @_;
 
+    Handel::Test-&gt;clear_schema($schema);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/checkout_cart_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $createcart   = 't/sql/cart_create_table.sql';
-        my $createorder  = 't/sql/order_create_table.sql';
-
-        unlink $dbfile;
-        executesql($db, $createorder);
-        executesql($db, $createcart);
 
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
+    ## do nothing with nothing
+    {
+        my $checkout = Handel::Checkout-&gt;new;
+        is($checkout-&gt;cart, undef, 'has no cart');
+        is($checkout-&gt;cart(0), undef, 'do nothing');
+        is($checkout-&gt;cart, undef, 'has no cart');
     };
 
 
     ## test for Handel::Exception::Argument where first param is not a hashref
+    ## now tests for order not found since constraint_uuid is gone for subclassing
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = Handel::Checkout-&gt;new;
 
             $checkout-&gt;cart('1234');
 
-            fail;
-        } catch Handel::Exception::Argument with {
-            pass;
+            fail('no exception thrown');
+        } catch Handel::Exception::Order with {
+            pass('caught order exception');
+            like(shift, qr/not find a cart/i, 'not find a cart in message');
         } otherwise {
-            fail;
+            fail('other exception thrown');
         };
     };
 
 
     ## test for Handel::Exception::Argument where cart option is not a hashref
+    ## now tests for order not found since constraint_uuid is gone for subclassing
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = Handel::Checkout-&gt;new({cart =&gt; '1234'});
 
-            fail;
-        } catch Handel::Exception::Argument with {
-            pass;
+            fail('no exception thrown');
+        } catch Handel::Exception::Order with {
+            pass('caught order exception');
+            like(shift, qr/not find a cart/i, 'not find a cart in message');
         } otherwise {
-            fail;
+            fail('other exception thrown');
         };
     };
 
@@ -82,15 +86,17 @@ sub run {
     ## test for Handel::Exception::Argument where cart object is not a Handel::Cart object
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = Handel::Checkout-&gt;new;
             my $fake = bless {}, 'MyObject::Foo';
             $checkout-&gt;cart($fake);
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not.*Handel::Cart/i, 'not cart object in message');
         } otherwise {
-            fail;
+            fail('other exception thrown');
         };
     };
 
@@ -98,21 +104,27 @@ sub run {
     ## test for Handel::Exception::Argument where cart option object is not a Handel::Cart object
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $fake = bless {}, 'MyObject::Foo';
             my $checkout = Handel::Checkout-&gt;new({cart =&gt; $fake});
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not.*Handel::Cart/i, 'not cart object in message');
         } otherwise {
-            fail;
+            fail('other exception thrown');
         };
     };
 
 
     {
         ## create and order from a cart id
-        my $cart = $subclass-&gt;new({id=&gt;'66BFFD29-8FAD-4200-A22F-E0D80979ADBF', name=&gt;'My First Cart'});
+        my $cart = $subclass-&gt;create({
+            id=&gt;'66BFFD29-8FAD-4200-A22F-E0D80979ADBF',
+            shopper=&gt;'66BFFD29-8FAD-4200-A22F-E0D80979ADBF',
+            name=&gt;'My First Cart'
+        });
         my $item = $cart-&gt;add({
             id =&gt; '5A8E0C3D-92C3-49b1-A988-585C792B7529',
             sku =&gt; 'sku1',
@@ -126,23 +138,27 @@ sub run {
 
         my $order = $checkout-&gt;order;
         isa_ok($order, 'Handel::Order');
-        is($order-&gt;count, $cart-&gt;count);
-        is($order-&gt;subtotal, $cart-&gt;subtotal);
+        is($order-&gt;count, $cart-&gt;count, 'has same item count');
+        is($order-&gt;subtotal, $cart-&gt;subtotal, 'has same subtotal');
 
-        my $orderitem = $order-&gt;items;
+        my $orderitem = $order-&gt;items-&gt;first;
         isa_ok($orderitem, 'Handel::Order::Item');
-        is($orderitem-&gt;sku, $item-&gt;sku);
-        is($orderitem-&gt;quantity, $item-&gt;quantity);
-        is($orderitem-&gt;price, $item-&gt;price);
-        is($orderitem-&gt;description, $item-&gt;description);
-        is($orderitem-&gt;total, $item-&gt;total);
-        is($orderitem-&gt;orderid, $order-&gt;id);
+        is($orderitem-&gt;sku, $item-&gt;sku, 'same sku');
+        is($orderitem-&gt;quantity, $item-&gt;quantity, 'same quantity');
+        is($orderitem-&gt;price, $item-&gt;price, 'same price');
+        is($orderitem-&gt;description, $item-&gt;description, 'same description');
+        is($orderitem-&gt;total, $item-&gt;total, 'same total');
+        is($orderitem-&gt;orderid, $order-&gt;id, 'same id');
     };
 
 
     {
         ## create and order from a cart id object as new option
-        my $cart = $subclass-&gt;new({id=&gt;'7B029717-08CC-414d-B3EA-680A5B8BC12C', name=&gt;'My First Cart'});
+        my $cart = $subclass-&gt;create({
+            id=&gt;'7B029717-08CC-414d-B3EA-680A5B8BC12C',
+            shopper=&gt;'7B029717-08CC-414d-B3EA-680A5B8BC12C',
+            name=&gt;'My First Cart'
+        });
         my $item = $cart-&gt;add({
             id =&gt; 'AF8F39D9-D958-4ddf-A688-433DB4B62835',
             sku =&gt; 'sku1',
@@ -155,23 +171,27 @@ sub run {
 
         my $order = $checkout-&gt;order;
         isa_ok($order, 'Handel::Order');
-        is($order-&gt;count, $cart-&gt;count);
-        is($order-&gt;subtotal, $cart-&gt;subtotal);
+        is($order-&gt;count, $cart-&gt;count, 'same count');
+        is($order-&gt;subtotal, $cart-&gt;subtotal, 'same subtotal');
 
-        my $orderitem = $order-&gt;items;
+        my $orderitem = $order-&gt;items-&gt;first;
         isa_ok($orderitem, 'Handel::Order::Item');
-        is($orderitem-&gt;sku, $item-&gt;sku);
-        is($orderitem-&gt;quantity, $item-&gt;quantity);
-        is($orderitem-&gt;price, $item-&gt;price);
-        is($orderitem-&gt;description, $item-&gt;description);
-        is($orderitem-&gt;total, $item-&gt;total);
-        is($orderitem-&gt;orderid, $order-&gt;id);
+        is($orderitem-&gt;sku, $item-&gt;sku, 'same sku');
+        is($orderitem-&gt;quantity, $item-&gt;quantity, 'same quantity');
+        is($orderitem-&gt;price, $item-&gt;price, 'same price');
+        is($orderitem-&gt;description, $item-&gt;description, 'same description');
+        is($orderitem-&gt;total, $item-&gt;total, 'same total');
+        is($orderitem-&gt;orderid, $order-&gt;id, 'same id');
     };
 
 
     {
         ## create and order from a Handel::Cart object
-        my $cart = $subclass-&gt;new({id=&gt;'989935CD-5131-4f50-9D6A-F2192468A817', name=&gt;'My First Cart'});
+        my $cart = $subclass-&gt;create({
+            id=&gt;'989935CD-5131-4f50-9D6A-F2192468A817',
+            shopper=&gt;'989935CD-5131-4f50-9D6A-F2192468A817',
+            name=&gt;'My First Cart'
+        });
         my $item = $cart-&gt;add({
             id =&gt; 'A262096F-E4A7-4c1b-8BAC-01114C68F8FA',
             sku =&gt; 'sku1',
@@ -185,23 +205,27 @@ sub run {
 
         my $order = $checkout-&gt;order;
         isa_ok($order, 'Handel::Order');
-        is($order-&gt;count, $cart-&gt;count);
-        is($order-&gt;subtotal, $cart-&gt;subtotal);
+        is($order-&gt;count, $cart-&gt;count, 'same count');
+        is($order-&gt;subtotal, $cart-&gt;subtotal, 'same subtotal');
 
-        my $orderitem = $order-&gt;items;
+        my $orderitem = $order-&gt;items-&gt;first;
         isa_ok($orderitem, 'Handel::Order::Item');
-        is($orderitem-&gt;sku, $item-&gt;sku);
-        is($orderitem-&gt;quantity, $item-&gt;quantity);
-        is($orderitem-&gt;price, $item-&gt;price);
-        is($orderitem-&gt;description, $item-&gt;description);
-        is($orderitem-&gt;total, $item-&gt;total);
-        is($orderitem-&gt;orderid, $order-&gt;id);
+        is($orderitem-&gt;sku, $item-&gt;sku, 'same sku');
+        is($orderitem-&gt;quantity, $item-&gt;quantity, 'same quantity');
+        is($orderitem-&gt;price, $item-&gt;price, 'same price');
+        is($orderitem-&gt;description, $item-&gt;description, 'same description');
+        is($orderitem-&gt;total, $item-&gt;total, 'same total');
+        is($orderitem-&gt;orderid, $order-&gt;id, 'same id');
     };
 
 
     {
         ## create and order from a Handel::Cart object as new option
-        my $cart = $subclass-&gt;new({id=&gt;'A16A5F16-840D-42d2-B414-39E745326552', name=&gt;'My First Cart'});
+        my $cart = $subclass-&gt;create({
+            id=&gt;'A16A5F16-840D-42d2-B414-39E745326552',
+            shopper=&gt;'A16A5F16-840D-42d2-B414-39E745326552',
+            name=&gt;'My First Cart'
+        });
         my $item = $cart-&gt;add({
             id =&gt; '91F44BE8-F4DD-47e5-859F-884160B96A0B',
             sku =&gt; 'sku1',
@@ -214,23 +238,27 @@ sub run {
 
         my $order = $checkout-&gt;order;
         isa_ok($order, 'Handel::Order');
-        is($order-&gt;count, $cart-&gt;count);
-        is($order-&gt;subtotal, $cart-&gt;subtotal);
+        is($order-&gt;count, $cart-&gt;count, 'same count');
+        is($order-&gt;subtotal, $cart-&gt;subtotal, 'same subtotal');
 
-        my $orderitem = $order-&gt;items;
+        my $orderitem = $order-&gt;items-&gt;first;
         isa_ok($orderitem, 'Handel::Order::Item');
-        is($orderitem-&gt;sku, $item-&gt;sku);
-        is($orderitem-&gt;quantity, $item-&gt;quantity);
-        is($orderitem-&gt;price, $item-&gt;price);
-        is($orderitem-&gt;description, $item-&gt;description);
-        is($orderitem-&gt;total, $item-&gt;total);
-        is($orderitem-&gt;orderid, $order-&gt;id);
+        is($orderitem-&gt;sku, $item-&gt;sku, 'same sku');
+        is($orderitem-&gt;quantity, $item-&gt;quantity, 'same quantity');
+        is($orderitem-&gt;price, $item-&gt;price, 'same price');
+        is($orderitem-&gt;description, $item-&gt;description, 'same description');
+        is($orderitem-&gt;total, $item-&gt;total, 'same total');
+        is($orderitem-&gt;orderid, $order-&gt;id, 'same id');
     };
 
 
     {
         ## create and order from a HASH filter
-        my $cart = $subclass-&gt;new({id=&gt;'D8FD6757-4D8C-4b60-A1AA-AD9D4270480B', name=&gt;'My First Cart'});
+        my $cart = $subclass-&gt;create({
+            id=&gt;'D8FD6757-4D8C-4b60-A1AA-AD9D4270480B',
+            shopper=&gt;'D8FD6757-4D8C-4b60-A1AA-AD9D4270480B',
+            name=&gt;'My First Cart'
+        });
         my $item = $cart-&gt;add({
             id =&gt; '67F4056F-8AC1-4810-96E2-57E1A5BE5DE3',
             sku =&gt; 'sku1',
@@ -244,23 +272,27 @@ sub run {
 
         my $order = $checkout-&gt;order;
         isa_ok($order, 'Handel::Order');
-        is($order-&gt;count, $cart-&gt;count);
-        is($order-&gt;subtotal, $cart-&gt;subtotal);
+        is($order-&gt;count, $cart-&gt;count, 'same count');
+        is($order-&gt;subtotal, $cart-&gt;subtotal, 'same subtotal');
 
-        my $orderitem = $order-&gt;items;
+        my $orderitem = $order-&gt;items-&gt;first;
         isa_ok($orderitem, 'Handel::Order::Item');
-        is($orderitem-&gt;sku, $item-&gt;sku);
-        is($orderitem-&gt;quantity, $item-&gt;quantity);
-        is($orderitem-&gt;price, $item-&gt;price);
-        is($orderitem-&gt;description, $item-&gt;description);
-        is($orderitem-&gt;total, $item-&gt;total);
-        is($orderitem-&gt;orderid, $order-&gt;id);
+        is($orderitem-&gt;sku, $item-&gt;sku, 'same sku');
+        is($orderitem-&gt;quantity, $item-&gt;quantity, 'same quantity');
+        is($orderitem-&gt;price, $item-&gt;price, 'same price');
+        is($orderitem-&gt;description, $item-&gt;description, 'same description');
+        is($orderitem-&gt;total, $item-&gt;total, 'same total');
+        is($orderitem-&gt;orderid, $order-&gt;id, 'same id');
     };
 
 
     {
         ## create and order from a HASH filter as a new option
-        my $cart = $subclass-&gt;new({id=&gt;'255EE4F0-8CB0-42ed-8853-94AB47BDF14E', name=&gt;'My First Cart'});
+        my $cart = $subclass-&gt;create({
+            id=&gt;'255EE4F0-8CB0-42ed-8853-94AB47BDF14E',
+            shopper=&gt;'255EE4F0-8CB0-42ed-8853-94AB47BDF14E',
+            name=&gt;'My First Cart'
+        });
         my $item = $cart-&gt;add({
             id =&gt; 'D399FE0A-87A0-4162-B552-6F161D671684',
             sku =&gt; 'sku1',
@@ -273,17 +305,17 @@ sub run {
 
         my $order = $checkout-&gt;order;
         isa_ok($order, 'Handel::Order');
-        is($order-&gt;count, $cart-&gt;count);
-        is($order-&gt;subtotal, $cart-&gt;subtotal);
+        is($order-&gt;count, $cart-&gt;count, 'same count');
+        is($order-&gt;subtotal, $cart-&gt;subtotal, 'same subtotal');
 
-        my $orderitem = $order-&gt;items;
+        my $orderitem = $order-&gt;items-&gt;first;
         isa_ok($orderitem, 'Handel::Order::Item');
-        is($orderitem-&gt;sku, $item-&gt;sku);
-        is($orderitem-&gt;quantity, $item-&gt;quantity);
-        is($orderitem-&gt;price, $item-&gt;price);
-        is($orderitem-&gt;description, $item-&gt;description);
-        is($orderitem-&gt;total, $item-&gt;total);
-        is($orderitem-&gt;orderid, $order-&gt;id);
+        is($orderitem-&gt;sku, $item-&gt;sku, 'same sku');
+        is($orderitem-&gt;quantity, $item-&gt;quantity, 'same quantity');
+        is($orderitem-&gt;price, $item-&gt;price, 'same price');
+        is($orderitem-&gt;description, $item-&gt;description, 'same description');
+        is($orderitem-&gt;total, $item-&gt;total, 'same total');
+        is($orderitem-&gt;orderid, $order-&gt;id, 'same id');
     };
 
 };</diff>
      <filename>t/checkout_cart.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,17 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More tests =&gt; 131;
-use lib 't/lib';
-use Handel::Checkout::TestMessage;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 180;
+
     use_ok('Handel::Checkout');
     use_ok('Handel::Subclassing::Checkout');
     use_ok('Handel::Subclassing::CheckoutStash');
     use_ok('Handel::Subclassing::Stash');
     use_ok('Handel::Exception', ':try');
+    use_ok('Handel::Checkout::TestMessage');
 };
 
 
@@ -27,15 +28,17 @@ sub run {
     ## test for Handel::Exception::Argument where message is not a scalar
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = $subclass-&gt;new({pluginpaths =&gt; 'Handel::LOADNOTHING'});
 
             $checkout-&gt;add_message([1, 2, 3]);
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not.*text message/i, 'not text message in message');
         } otherwise {
-            fail;
+            fail('other exception thrown');
         };
     };
 
@@ -43,16 +46,18 @@ sub run {
     ## test for Handel::Exception::Argument where message is not a Handel::Checkout;:Message subclass
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $fake = bless {}, 'FakeModule';
             my $checkout = $subclass-&gt;new({pluginpaths =&gt; 'Handel::LOADNOTHING'});
 
             $checkout-&gt;add_message($fake);
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not.*Handel::Checkout::Message/i, 'notmessage object in message');
         } otherwise {
-            fail;
+            fail('other exception thrown');
         };
     };
 
@@ -65,8 +70,31 @@ sub run {
         );
 
         isa_ok($message, 'Handel::Checkout::Message');
-        is($message-&gt;text, 'My Message');
-        is($message-&gt;otherproperty, 'foo');
+        is($message-&gt;text, 'My Message', 'got message');
+        is($message-&gt;otherproperty, 'foo', 'got other property');
+    };
+
+
+    ## add a message that isa Apache::AxKit::Exception::Error
+    {
+        my $checkout = $subclass-&gt;new({pluginpaths =&gt; 'Handel::LOADNOTHING'});
+        my $axkitmessage = bless {text =&gt; 'Foo'}, 'Apache::AxKit::Exception::Error';
+
+        $checkout-&gt;add_message($axkitmessage);
+
+        my @messages = @{$checkout-&gt;messages};
+        is(scalar @messages, 1, 'have 1 message');
+
+        my $message = $messages[0];
+        isa_ok($message, 'Handel::Checkout::Message');
+        is($messages[0]-&gt;text . '', 'Foo', 'got message text');
+
+        ok($message-&gt;filename, 'has filename');
+        ok($message-&gt;line, 'has line');
+
+        $checkout-&gt;clear_messages;
+        @messages = @{$checkout-&gt;messages};
+        is(scalar @messages, 0, 'has 0 messages');
     };
 
 
@@ -77,37 +105,61 @@ sub run {
         $checkout-&gt;add_message('This is a message');
 
         my @messages = @{$checkout-&gt;messages};
-        is(scalar @messages, 1);
+        is(scalar @messages, 1, 'have 1 message');
 
         my $message = $messages[0];
         isa_ok($message, 'Handel::Checkout::Message');
-        is($messages[0]-&gt;text, 'This is a message');
+        is($messages[0]-&gt;text, 'This is a message', 'got text');
 
-        ok($message-&gt;filename);
-        ok($message-&gt;line);
+        ok($message-&gt;filename, 'has filename');
+        ok($message-&gt;line, 'has line');
 
         $checkout-&gt;clear_messages;
         @messages = @{$checkout-&gt;messages};
-        is(scalar @messages, 0);
+        is(scalar @messages, 0, 'has no messsages');
     };
 
 
     ## add a message using Handel::Checkout::Message object
     {
         my $checkout = $subclass-&gt;new({pluginpaths =&gt; 'Handel::LOADNOTHING'});
+        my $newmessage = Handel::Checkout::Message-&gt;new(
+            text =&gt; 'This is a new message',
+            package =&gt; 'package',
+            filename =&gt; 'filename',
+            line =&gt; 'line'
+        );
+
+        $checkout-&gt;add_message($newmessage);
+
+        my @messages = @{$checkout-&gt;messages};
+        is(scalar @messages, 1, 'has 1 message');
+
+        my $message = $messages[0];
+        isa_ok($message, 'Handel::Checkout::Message');
+        is($messages[0]-&gt;text, 'This is a new message', 'has text message');
+        is($messages[0]-&gt;package, 'package', 'has package');
+        is($messages[0]-&gt;filename, 'filename', 'has filename');
+        is($messages[0]-&gt;line, 'line', 'has line');
+    };
+
+
+    ## add a message using Handel::Checkout::Message object with existing package/file/line
+    {
+        my $checkout = $subclass-&gt;new({pluginpaths =&gt; 'Handel::LOADNOTHING'});
         my $newmessage = Handel::Checkout::Message-&gt;new(text =&gt; 'This is a new message');
 
         $checkout-&gt;add_message($newmessage);
 
         my @messages = @{$checkout-&gt;messages};
-        is(scalar @messages, 1);
+        is(scalar @messages, 1, 'has 1 message');
 
         my $message = $messages[0];
         isa_ok($message, 'Handel::Checkout::Message');
-        is($messages[0]-&gt;text, 'This is a new message');
+        is($messages[0]-&gt;text, 'This is a new message', 'has message text');
 
-        ok($message-&gt;filename);
-        ok($message-&gt;line);
+        ok($message-&gt;filename, 'has filename');
+        ok($message-&gt;line, 'has line');
     };
 
 
@@ -119,14 +171,19 @@ sub run {
         $checkout-&gt;add_message($newmessage);
 
         my @messages = @{$checkout-&gt;messages};
-        is(scalar @messages, 1);
+        is(scalar @messages, 1, 'has 1 message');
 
         my $message = $messages[0];
         isa_ok($message, 'Handel::Checkout::Message');
-        is($messages[0]-&gt;text, 'This is a new message');
+        is($messages[0]-&gt;text, 'This is a new message', 'has message text');
+
+        ok($message-&gt;filename, 'has filename');
+        ok($message-&gt;line, 'has line');
 
-        ok($message-&gt;filename);
-        ok($message-&gt;line);
+        is(&quot;$message&quot;, 'This is a new message', 'message stringifies to message text');
+
+        $message-&gt;{'text'} = undef;
+        is(&quot;$message&quot;, ref $message, 'message stringifies to object in lue of text');
     };
 
 
@@ -138,32 +195,42 @@ sub run {
         $checkout-&gt;add_message('Message2');
 
         my @messages = @{$checkout-&gt;messages};
-        is(scalar @messages, 2);
+        is(scalar @messages, 2, 'has 2 messages');
 
         isa_ok($messages[0], 'Handel::Checkout::Message');
-        is($messages[0]-&gt;text, 'Message1');
-        is($messages[0], 'Message1');
-        ok($messages[0]-&gt;filename);
-        ok($messages[0]-&gt;line);
+        is($messages[0]-&gt;text, 'Message1', 'has message text');
+        is($messages[0], 'Message1', 'has message text');
+        ok($messages[0]-&gt;filename, 'has filename');
+        ok($messages[0]-&gt;line, 'has line');
 
         isa_ok($messages[1], 'Handel::Checkout::Message');
-        is($messages[1]-&gt;text, 'Message2');
-        is($messages[1], 'Message2');
-        ok($messages[1]-&gt;filename);
-        ok($messages[1]-&gt;line);
+        is($messages[1]-&gt;text, 'Message2', 'has message text');
+        is($messages[1], 'Message2', 'has message text');
+        ok($messages[1]-&gt;filename, 'has filename');
+        ok($messages[1]-&gt;line, 'has line');
 
         my $messagesref = $checkout-&gt;messages;
         isa_ok($messagesref, 'ARRAY');
         isa_ok($messagesref-&gt;[0], 'Handel::Checkout::Message');
-        is($messagesref-&gt;[0]-&gt;text, 'Message1');
-        is($messagesref-&gt;[0], 'Message1');
-        ok($messagesref-&gt;[0]-&gt;filename);
-        ok($messagesref-&gt;[0]-&gt;line);
-
-        is($messagesref-&gt;[1]-&gt;text, 'Message2');
-        is($messagesref-&gt;[1], 'Message2');
-        ok($messagesref-&gt;[1]-&gt;filename);
-        ok($messagesref-&gt;[1]-&gt;line);
+        is($messagesref-&gt;[0]-&gt;text, 'Message1', 'has message text');
+        is($messagesref-&gt;[0], 'Message1', 'has message text');
+        ok($messagesref-&gt;[0]-&gt;filename, 'has filename');
+        ok($messagesref-&gt;[0]-&gt;line, 'has line');
+
+        is($messagesref-&gt;[1]-&gt;text, 'Message2', 'has message text');
+        is($messagesref-&gt;[1], 'Message2', 'has message text');
+        ok($messagesref-&gt;[1]-&gt;filename, 'has filename');
+        ok($messagesref-&gt;[1]-&gt;line, 'has line');
     };
 
 };
+
+
+package Apache::AxKit::Exception::Error;
+use strict;
+use warnings;
+use overload
+    '&quot;&quot;' =&gt; sub{shift-&gt;{'text'}},
+    fallback =&gt; 1;
+
+1;</diff>
      <filename>t/checkout_messages.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,20 +2,20 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 126;
+        plan tests =&gt; 143;
     };
 
     use_ok('Handel::Checkout');
-    use_ok('Handel::Constants', qw(:order :returnas));
+    use_ok('Handel::Constants', qw(:order));
     use_ok('Handel::Exception', ':try');
     use_ok('Handel::Order');
     use_ok('Handel::Subclassing::Order');
@@ -23,7 +23,35 @@ BEGIN {
 };
 
 
+## throw exception when setting a bogus order class
+{
+    try {
+        local $ENV{'LANG'} = 'en';
+        Handel::Checkout-&gt;order_class('Funklebean');
+
+        fail('no exception thrown');
+    } catch Handel::Exception::Checkout with {
+        pass('caught Handel::Exception::Checkout');
+        like(shift, qr/could not be loaded/i, 'not loaded in message');
+    } otherwise {
+        fail('failed to catch Handel::Exception');
+    };
+};
+
+
+## unset something altogether
+{
+    is(Handel::Checkout-&gt;order_class, 'Handel::Order', 'order class is set');
+    Handel::Checkout-&gt;order_class(undef);
+    is(Handel::Checkout-&gt;order_class, undef, 'order class is unset');
+    Handel::Checkout-&gt;order_class('Handel::Order');
+    is(Handel::Checkout-&gt;order_class, 'Handel::Order', 'order class is reset');
+};
+
+
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Checkout', 'Handel::Order', 1);
 &amp;run('Handel::Checkout', 'Handel::Subclassing::Order', 2);
 &amp;run('Handel::Checkout', 'Handel::Subclassing::OrderOnly', 3);
@@ -31,49 +59,42 @@ BEGIN {
 sub run {
     my ($subclass, $orderclass, $dbsuffix) = @_;
 
-    $subclass-&gt;order_class($orderclass);
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/checkout_order_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $create  = 't/sql/order_create_table.sql';
-        my $data    = 't/sql/order_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $create);
-        executesql($db, $data);
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
+    $subclass-&gt;order_class($orderclass);
 
-    ## test for Handel::Exception::Argument where first param is not a hashref
+    ## test for Handel::Exception::Checkout when no order can be found as a string
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = $subclass-&gt;new;
-
             $checkout-&gt;order('1234');
 
-            fail;
-        } catch Handel::Exception::Argument with {
-            pass;
+            fail('no exception thrown');
+        } catch Handel::Exception::Checkout with {
+            pass('caught checkout exception');
+            like(shift, qr/not find an order/i, 'not find order in message');
         } otherwise {
-            fail;
+            fail('other exception caught');
         };
     };
 
 
-    ## test for Handel::Exception::Argument where order option is not a hashref
+    ## test for Handel::Exception::Chckout when no order is found as hash
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = $subclass-&gt;new({order =&gt; '1234'});
 
-            fail;
-        } catch Handel::Exception::Argument with {
-            pass;
+            ok(!$checkout-&gt;order, 'no order set');
+
+            fail('no exception thrown');
+        } catch Handel::Exception::Checkout with {
+            pass('caught argument exception');
+            like(shift, qr/not find an order/i, 'not find order in message');
         } otherwise {
-            fail;
+            fail('other exception caught');
         };
     };
 
@@ -81,15 +102,17 @@ sub run {
     ## test for Handel::Exception::Argument where order object is not a Handel::Order object
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = $subclass-&gt;new;
             my $fake = bless {}, 'MyObject::Foo';
             $checkout-&gt;order($fake);
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not.*Handel::Order/i, 'not order object in message');
         } otherwise {
-            fail;
+            fail('other exception caught');
         };
     };
 
@@ -97,14 +120,16 @@ sub run {
     ## test for Handel::Exception::Argument where order option object is not a Handel::Order object
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $fake = bless {}, 'MyObject::Foo';
             my $checkout = $subclass-&gt;new({order =&gt; $fake});
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not.*Handel::Order/i, 'not order object in message');
         } otherwise {
-            fail;
+            fail('other exception caught');
         };
     };
 
@@ -118,10 +143,10 @@ sub run {
         my $order = $checkout-&gt;order;
         isa_ok($order, 'Handel::Order');
         isa_ok($order, $orderclass);
-        is($order-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($order-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($order-&gt;type, ORDER_TYPE_TEMP);
-        is($order-&gt;count, 2);
+        is($order-&gt;id, '11111111-1111-1111-1111-111111111111', 'got order id');
+        is($order-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($order-&gt;type, ORDER_TYPE_TEMP, 'got temp type');
+        is($order-&gt;count, 2, 'has 2 items');
     };
 
 
@@ -131,10 +156,10 @@ sub run {
         my $order = $checkout-&gt;order;
         isa_ok($order, 'Handel::Order');
         isa_ok($order, $orderclass);
-        is($order-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($order-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($order-&gt;type, ORDER_TYPE_TEMP);
-        is($order-&gt;count, 2);
+        is($order-&gt;id, '11111111-1111-1111-1111-111111111111', 'got order id');
+        is($order-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($order-&gt;type, ORDER_TYPE_TEMP, 'got temp type');
+        is($order-&gt;count, 2, 'has 2 items');
     };
 
 
@@ -150,10 +175,10 @@ sub run {
         my $order = $checkout-&gt;order;
         isa_ok($order, 'Handel::Order');
         isa_ok($order, $orderclass);
-        is($order-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($order-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($order-&gt;type, ORDER_TYPE_TEMP);
-        is($order-&gt;count, 2);
+        is($order-&gt;id, '11111111-1111-1111-1111-111111111111', 'got order id');
+        is($order-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($order-&gt;type, ORDER_TYPE_TEMP, 'got temp type');
+        is($order-&gt;count, 2, 'has 2 items');
     };
 
 
@@ -167,19 +192,19 @@ sub run {
         my $order = $checkout-&gt;order;
         isa_ok($order, 'Handel::Order');
         isa_ok($order, $orderclass);
-        is($order-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($order-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($order-&gt;type, ORDER_TYPE_TEMP);
-        is($order-&gt;count, 2);
+        is($order-&gt;id, '11111111-1111-1111-1111-111111111111', 'got order id');
+        is($order-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($order-&gt;type, ORDER_TYPE_TEMP, 'got temp type');
+        is($order-&gt;count, 2, 'has 2 items');
     };
 
 
     ## assign the order using a Handel::Order object
     {
-        my $order = $orderclass-&gt;load({
+        my $order = $orderclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111',
             type =&gt; ORDER_TYPE_TEMP
-        });
+        })-&gt;first;
         my $checkout = $subclass-&gt;new;
 
         $checkout-&gt;order($order);
@@ -187,28 +212,28 @@ sub run {
         my $loadedorder = $checkout-&gt;order;
         isa_ok($loadedorder, 'Handel::Order');
         isa_ok($loadedorder, $orderclass);
-        is($loadedorder-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($loadedorder-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($loadedorder-&gt;type, ORDER_TYPE_TEMP);
-        is($loadedorder-&gt;count, 2);
+        is($loadedorder-&gt;id, '11111111-1111-1111-1111-111111111111', 'got order id');
+        is($loadedorder-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($loadedorder-&gt;type, ORDER_TYPE_TEMP, 'got temp type');
+        is($loadedorder-&gt;count, 2, 'has 2 items');
     };
 
 
     ## assign the order using a Handel::Order object as a new option
     {
-        my $order = $orderclass-&gt;load({
+        my $order = $orderclass-&gt;search({
             id =&gt; '11111111-1111-1111-1111-111111111111',
             type =&gt; ORDER_TYPE_TEMP
-        });
+        })-&gt;first;
         my $checkout = $subclass-&gt;new({order =&gt; $order});
 
         my $loadedorder = $checkout-&gt;order;
         isa_ok($loadedorder, 'Handel::Order');
         isa_ok($loadedorder, $orderclass);
-        is($loadedorder-&gt;id, '11111111-1111-1111-1111-111111111111');
-        is($loadedorder-&gt;shopper, '11111111-1111-1111-1111-111111111111');
-        is($loadedorder-&gt;type, ORDER_TYPE_TEMP);
-        is($loadedorder-&gt;count, 2);
+        is($loadedorder-&gt;id, '11111111-1111-1111-1111-111111111111', 'got order id');
+        is($loadedorder-&gt;shopper, '11111111-1111-1111-1111-111111111111', 'got shopper id');
+        is($loadedorder-&gt;type, ORDER_TYPE_TEMP, 'got temp type');
+        is($loadedorder-&gt;count, 2, 'has 2 items');
     };
 
 };</diff>
      <filename>t/checkout_order.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,11 +2,11 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More tests =&gt; 123;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 141;
+
     use_ok('Handel::Checkout');
     use_ok('Handel::Subclassing::Checkout');
     use_ok('Handel::Subclassing::CheckoutStash');
@@ -16,6 +16,15 @@ BEGIN {
 };
 
 
+## add a phase and import
+{
+    is(main-&gt;can('NEWPHASE'), undef, 'new phase does not exists');
+    Handel::Checkout-&gt;add_phase('NEWPHASE', 23, 1);
+    can_ok('main', 'NEWPHASE');
+    is(&amp;main::NEWPHASE, 23, 'new phase in place');
+};
+
+
 ## This is a hack, but it works. :-)
 &amp;run('Handel::Checkout');
 &amp;run('Handel::Subclassing::Checkout');
@@ -29,15 +38,17 @@ sub run {
     ## than an array reference
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = $subclass-&gt;new;
 
             $checkout-&gt;phases({'1234' =&gt; 1});
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not an array/i, 'not array in message');
         } otherwise {
-            fail;
+            fail('other exception caught');
         };
     };
 
@@ -47,13 +58,15 @@ sub run {
     ## than an array reference in news' phases option
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = $subclass-&gt;new({phases =&gt; {'1234' =&gt; 1}});
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not an array/i, 'not array in message');
         } otherwise {
-            fail;
+            fail('other exception caught');
         };
     };
 
@@ -61,13 +74,15 @@ sub run {
     ## Test for Handel::Exception::Constraint if new constant name already exists
     {
         try {
+            local $ENV{'LANG'} = 'en';
             $subclass-&gt;add_phase('CHECKOUT_PHASE_INITIALIZE', 99);
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Constraint with {
-            pass;
+            pass('caught constraint exception');
+            like(shift, qr/already exists/i, 'already exists in message');
         } otherwise {
-            fail;
+            fail('other exception caught');
         };
     };
 
@@ -75,13 +90,15 @@ sub run {
     ## Test for Handel::Exception::Constraint if new constant value already exists
     {
         try {
+            local $ENV{'LANG'} = 'en';
             $subclass-&gt;add_phase('CUSTOM_CHECKOUT_PHASE', CHECKOUT_PHASE_INITIALIZE);
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Constraint with {
-            pass;
+            pass('caught constraint exception');
+            like(shift, qr/already exists/i, 'already exists in message');
         } otherwise {
-            fail;
+            fail('other exception caught');
         };
     };
 
@@ -90,13 +107,15 @@ sub run {
     sub CUSTOM_CHECKOUT_PHASE_TEST {};
     {
         try {
+            local $ENV{'LANG'} = 'en';
             $subclass-&gt;add_phase('CUSTOM_CHECKOUT_PHASE_TEST', 43, 1);
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Constraint with {
-            pass;
+            pass('caught constraint exception');
+            like(shift, qr/already exists/i, 'already exists in message');
         } otherwise {
-            fail;
+            fail('other exception caught');
         };
     };
 
@@ -109,8 +128,8 @@ sub run {
 
         my $phases = $checkout-&gt;phases;
         isa_ok($phases, 'ARRAY');
-        is(scalar @{$phases}, 1);
-        is($phases-&gt;[0], CHECKOUT_PHASE_AUTHORIZE);
+        is(scalar @{$phases}, 1, 'has 1 phase');
+        is($phases-&gt;[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
     };
 
 
@@ -119,8 +138,8 @@ sub run {
         my $checkout = $subclass-&gt;new({phases =&gt; [CHECKOUT_PHASE_DELIVER]});
         my $phases = $checkout-&gt;phases;
         isa_ok($phases, 'ARRAY');
-        is(scalar @{$phases}, 1);
-        is($phases-&gt;[0], CHECKOUT_PHASE_DELIVER);
+        is(scalar @{$phases}, 1, 'has 1 phase');
+        is($phases-&gt;[0], CHECKOUT_PHASE_DELIVER, 'deliver set');
     };
 
 
@@ -128,11 +147,11 @@ sub run {
     {
         my $checkout = $subclass-&gt;new;
         my @phases = $checkout-&gt;phases;
-        ok(scalar @phases &gt;= 1);
+        ok(scalar @phases &gt;= 1, 'has phases');
 
         my $phases = $checkout-&gt;phases;
         isa_ok($phases, 'ARRAY');
-        ok(scalar @{$phases} &gt;= 1);
+        ok(scalar @{$phases} &gt;= 1, 'has more than one phase');
     };
 
 
@@ -140,11 +159,11 @@ sub run {
     {
         my $checkout = $subclass-&gt;new({phases =&gt; [CHECKOUT_PHASE_DELIVER, CHECKOUT_PHASE_INITIALIZE]});
         my @phases = $checkout-&gt;phases;
-        is(scalar @phases, 2);
+        is(scalar @phases, 2, 'has 2 phases');
 
         my $phases = $checkout-&gt;phases;
         isa_ok($phases, 'ARRAY');
-        is(scalar @{$phases}, 2);
+        is(scalar @{$phases}, 2, 'has 2 phases');
     };
 
 
@@ -156,8 +175,8 @@ sub run {
 
         my $phases = $checkout-&gt;phases;
         isa_ok($phases, 'ARRAY');
-        is(scalar @{$phases}, 1);
-        is($phases-&gt;[0], CHECKOUT_PHASE_AUTHORIZE);
+        is(scalar @{$phases}, 1, 'has 1 phase');
+        is($phases-&gt;[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
     };
 
 
@@ -169,9 +188,9 @@ sub run {
 
         my $phases = $checkout-&gt;phases;
         isa_ok($phases, 'ARRAY');
-        is(scalar @{$phases}, 2);
-        is($phases-&gt;[0], CHECKOUT_PHASE_AUTHORIZE);
-        is($phases-&gt;[1], CHECKOUT_PHASE_DELIVER);
+        is(scalar @{$phases}, 2, 'has 2 phases');
+        is($phases-&gt;[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
+        is($phases-&gt;[1], CHECKOUT_PHASE_DELIVER, 'deliver set');
     };
 
 
@@ -183,9 +202,9 @@ sub run {
 
         my $phases = $checkout-&gt;phases;
         isa_ok($phases, 'ARRAY');
-        is(scalar @{$phases}, 2);
-        is($phases-&gt;[0], CHECKOUT_PHASE_AUTHORIZE);
-        is($phases-&gt;[1], CHECKOUT_PHASE_DELIVER);
+        is(scalar @{$phases}, 2, 'has 2 phases');
+        is($phases-&gt;[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
+        is($phases-&gt;[1], CHECKOUT_PHASE_DELIVER, 'deliver set');
     };
 
 
@@ -194,34 +213,32 @@ sub run {
         my $checkout = $subclass-&gt;new({phases =&gt; 'CHECKOUT_PHASE_DELIVER'});
         my $phases = $checkout-&gt;phases;
         isa_ok($phases, 'ARRAY');
-        is(scalar @{$phases}, 1);
-        is($phases-&gt;[0], CHECKOUT_PHASE_DELIVER);
+        is(scalar @{$phases}, 1, 'has 1 phase');
+        is($phases-&gt;[0], CHECKOUT_PHASE_DELIVER, 'deliver set');
     };
 
 
     ## Set the phases using news' phases option as comma seperated string and make
     ## sure they stick
     {
-        my $checkout = $subclass-&gt;new({phases =&gt; 'CHECKOUT_PHASE_AUTHORIZE,
-        CHECKOUT_PHASE_DELIVER'});
+        my $checkout = $subclass-&gt;new({phases =&gt; 'CHECKOUT_PHASE_AUTHORIZE, CHECKOUT_PHASE_DELIVER'});
         my $phases = $checkout-&gt;phases;
         isa_ok($phases, 'ARRAY');
-        is(scalar @{$phases}, 2);
-        is($phases-&gt;[0], CHECKOUT_PHASE_AUTHORIZE);
-        is($phases-&gt;[1], CHECKOUT_PHASE_DELIVER);
+        is(scalar @{$phases}, 2, 'has 2 phases');
+        is($phases-&gt;[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
+        is($phases-&gt;[1], CHECKOUT_PHASE_DELIVER, 'deliver set');
     };
 
 
     ## Set the phases using news' space option as comma seperated string and make
     ## sure they stick
     {
-        my $checkout = $subclass-&gt;new({phases =&gt; 'CHECKOUT_PHASE_AUTHORIZE
-        CHECKOUT_PHASE_DELIVER'});
+        my $checkout = $subclass-&gt;new({phases =&gt; 'CHECKOUT_PHASE_AUTHORIZE CHECKOUT_PHASE_DELIVER'});
         my $phases = $checkout-&gt;phases;
         isa_ok($phases, 'ARRAY');
-        is(scalar @{$phases}, 2);
-        is($phases-&gt;[0], CHECKOUT_PHASE_AUTHORIZE);
-        is($phases-&gt;[1], CHECKOUT_PHASE_DELIVER);
+        is(scalar @{$phases}, 2, 'has 2 phases');
+        is($phases-&gt;[0], CHECKOUT_PHASE_AUTHORIZE, 'authorize set');
+        is($phases-&gt;[1], CHECKOUT_PHASE_DELIVER, 'deliver set');
     };
 
 };</diff>
      <filename>t/checkout_phases.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,11 +2,13 @@
 # $Id$
 use strict;
 use warnings;
-use lib 't/lib';
-use Test::More tests =&gt; 1257;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 1275;
+
     use_ok('Handel::Checkout');
+    use_ok('Handel::Checkout::Plugin');
     use_ok('Handel::Subclassing::Checkout');
     use_ok('Handel::Subclassing::CheckoutStash');
     use_ok('Handel::Subclassing::Stash');
@@ -15,6 +17,53 @@ BEGIN {
 };
 
 
+## make sure no path returns no path
+is(Handel::Checkout::_path_to_array(''), '', 'path to array returns nothing for nothing');
+
+
+
+## name returns class name, others do nothing
+{
+    my $plugin = Handel::Checkout::Plugin-&gt;new;
+    isa_ok($plugin, 'Handel::Checkout::Plugin');
+    is($plugin-&gt;name, 'Handel::Checkout::Plugin', 'name returns class name');
+    is(Handel::Checkout::Plugin-&gt;name, 'Handel::Checkout::Plugin', 'name returns class name');
+    is(Handel::Checkout::Plugin::name, undef, 'function returns nothing');
+
+    is(Handel::Checkout::Plugin-&gt;setup, undef, 'setup does nothing');
+    is(Handel::Checkout::Plugin-&gt;teardown, undef, 'teardown does nothing');
+
+    {
+        my $warning;
+        local $SIG{'__WARN__'} = sub {
+            $warning = shift;
+        };
+        is(Handel::Checkout::Plugin-&gt;register, undef, 'register does nothing');
+        like($warning, qr/plugin .* defined register/i, 'warning was set');
+    };
+};
+
+
+## test for exception when adding the same phase, preference
+{
+    my $checkout = Handel::Checkout-&gt;new({pluginpaths =&gt; 'Handel::LOADNOTHING'});
+    $checkout-&gt;{'plugins'} = [bless {}, 'main'];
+    $checkout-&gt;add_handler(CHECKOUT_PHASE_INITIALIZE, sub{}, 350);
+
+    try {
+        local $ENV{'LANG'} = 'en';
+        $checkout-&gt;add_handler(CHECKOUT_PHASE_INITIALIZE, sub{}, 350);
+
+        fail('no exception thrown');
+    } catch Handel::Exception::Checkout with {
+            pass('caught checkout exception');
+            like(shift, qr/already a handler/i, 'phase exists in message');
+    } otherwise {
+        fail('other exception thrown');
+    };
+};
+
+
 ## This is a hack, but it works. :-)
 &amp;run('Handel::Checkout');
 &amp;run('Handel::Subclassing::Checkout');
@@ -27,15 +76,17 @@ sub run {
     ## test for Handel::Exception::Argument on bad add_handler phase
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = $subclass-&gt;new;
 
             $checkout-&gt;add_handler(42, sub{});
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not a valid checkout_phase/i, 'phase not found in message');
         } otherwise {
-            fail;
+            fail('other exception thrown');
         };
     };
 
@@ -43,15 +94,17 @@ sub run {
     ## test for Handel::Exception::Argument on bad CODE reference
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = $subclass-&gt;new;
 
             $checkout-&gt;add_handler(CHECKOUT_PHASE_INITIALIZE, 'foo');
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not a code/i, 'not a code in message');
         } otherwise {
-            fail;
+            fail('other exception thrown');
         };
     };
 
@@ -59,6 +112,8 @@ sub run {
     ## Add a custom phase and verify it works in add_handler
     {
         try {
+            local $ENV{'LANG'} = 'en';
+
             #clean out the new constant between subclass runs
             {
                 no warnings;
@@ -71,10 +126,9 @@ sub run {
 
             $checkout-&gt;add_handler(Handel::Constants-&gt;CHECKOUT_PHASE_CUSTOM, sub{});
 
-            pass;
+            pass('added custom phase');
         } otherwise {
-        warn shift;
-            fail;
+            fail('other exception thrown');
         };
     };
 
@@ -86,21 +140,21 @@ sub run {
         my $checkout = $subclass-&gt;new;
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 1);
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 1, 'loaded 1 plugin');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin exists');
+        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         my $plugin = $plugins{'Handel::TestPlugins::First'};
         isa_ok($plugin, 'Handel::Checkout::Plugin');
-        ok($plugin-&gt;{'init_called'});
-        ok($plugin-&gt;{'register_called'});
+        ok($plugin-&gt;{'init_called'}, 'init was called');
+        ok($plugin-&gt;{'register_called'}, 'register was called');
 
         isa_ok($checkout-&gt;{'handlers'}-&gt;{1}-&gt;{1}-&gt;[0], 'Handel::TestPlugins::First');
-        is(ref $checkout-&gt;{'handlers'}-&gt;{1}-&gt;{1}-&gt;[1], 'CODE');
+        is(ref $checkout-&gt;{'handlers'}-&gt;{1}-&gt;{1}-&gt;[1], 'CODE', 'stored code ref');
         $checkout-&gt;{'handlers'}-&gt;{1}-&gt;{1}-&gt;[1]-&gt;($plugin);
-        ok($plugin-&gt;{'handler_called'});
+        ok($plugin-&gt;{'handler_called'}, 'handler called');
     };
 
 
@@ -109,21 +163,21 @@ sub run {
         my $checkout = $subclass-&gt;new({pluginpaths =&gt; 'Handel::TestPlugins'});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 1);
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 1, 'loaded 1 plugin');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         my $plugin = $plugins{'Handel::TestPlugins::First'};
         isa_ok($plugin, 'Handel::Checkout::Plugin');
-        ok($plugin-&gt;{'init_called'});
-        ok($plugin-&gt;{'register_called'});
+        ok($plugin-&gt;{'init_called'}, 'init was called');
+        ok($plugin-&gt;{'register_called'}, 'register was called');
 
         isa_ok($checkout-&gt;{'handlers'}-&gt;{1}-&gt;{1}-&gt;[0], 'Handel::TestPlugins::First');
-        is(ref $checkout-&gt;{'handlers'}-&gt;{1}-&gt;{1}-&gt;[1], 'CODE');
+        is(ref $checkout-&gt;{'handlers'}-&gt;{1}-&gt;{1}-&gt;[1], 'CODE', 'registered code ref');
         $checkout-&gt;{'handlers'}-&gt;{1}-&gt;{1}-&gt;[1]-&gt;($plugin);
-        ok($plugin-&gt;{'handler_called'});
+        ok($plugin-&gt;{'handler_called'}, 'handler called');
     };
 
 
@@ -132,21 +186,21 @@ sub run {
         my $checkout = $subclass-&gt;new({pluginpaths =&gt; ['Handel::TestPlugins']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 1);
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 1, 'loaded 1 plugin');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         my $plugin = $plugins{'Handel::TestPlugins::First'};
         isa_ok($plugin, 'Handel::Checkout::Plugin');
-        ok($plugin-&gt;{'init_called'});
-        ok($plugin-&gt;{'register_called'});
+        ok($plugin-&gt;{'init_called'}, 'init called');
+        ok($plugin-&gt;{'init_called'}, 'register called');
 
         isa_ok($checkout-&gt;{'handlers'}-&gt;{1}-&gt;{1}-&gt;[0], 'Handel::TestPlugins::First');
-        is(ref $checkout-&gt;{'handlers'}-&gt;{1}-&gt;{1}-&gt;[1], 'CODE');
+        is(ref $checkout-&gt;{'handlers'}-&gt;{1}-&gt;{1}-&gt;[1], 'CODE', 'has code ref');
         $checkout-&gt;{'handlers'}-&gt;{1}-&gt;{1}-&gt;[1]-&gt;($plugin);
-        ok($plugin-&gt;{'handler_called'});
+        ok($plugin-&gt;{'handler_called'}, 'handler called');
     };
 
 
@@ -157,26 +211,26 @@ sub run {
         my $checkout = $subclass-&gt;new;
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 2);
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 2, 'loaded 2 plugins');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::TestPlugins::First Handel::OtherTestPlugins::Second)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -190,26 +244,26 @@ sub run {
         my $checkout = $subclass-&gt;new({pluginpaths =&gt; 'Handel::TestPlugins Handel::OtherTestPlugins'});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 2);
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 2, 'loaded 2 plugins');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::TestPlugins::First Handel::OtherTestPlugins::Second)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -223,26 +277,26 @@ sub run {
         my $checkout = $subclass-&gt;new({pluginpaths =&gt; 'Handel::TestPlugins, Handel::OtherTestPlugins'});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 2);
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 2, 'loaded 2 plugins');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::TestPlugins::First Handel::OtherTestPlugins::Second)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -256,26 +310,26 @@ sub run {
         my $checkout = $subclass-&gt;new({pluginpaths =&gt; ['Handel::TestPlugins', 'Handel::OtherTestPlugins']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 2);
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 2, 'loaded 2 plugins');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::TestPlugins::First Handel::OtherTestPlugins::Second)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -292,26 +346,26 @@ sub run {
         my $checkout = $subclass-&gt;new({pluginpaths =&gt; ['Handel::TestPlugins', 'Handel::OtherTestPlugins']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 2);
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 2, 'loaded 2 plugins');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::TestPlugins::First Handel::OtherTestPlugins::Second)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -327,26 +381,26 @@ sub run {
         my $checkout = $subclass-&gt;new;
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 2);
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 2, 'loaded 2 plugins');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::TestPlugins::First Handel::OtherTestPlugins::Second)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -362,26 +416,26 @@ sub run {
         my $checkout = $subclass-&gt;new;
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        ok(scalar keys %plugins &gt;= 3);
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        ok(scalar keys %plugins &gt;= 3, 'loaded 3 plugins');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::TestPlugins::First Handel::OtherTestPlugins::Second Handel::Checkout::Plugin::TestPlugin)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -397,26 +451,26 @@ sub run {
         my $checkout = $subclass-&gt;new;
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        ok(scalar keys %plugins &gt;= 2);
-        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        ok(scalar keys %plugins &gt;= 2, 'loaded at least 2 plugins');
+        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin loaded');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::TestPlugins::First'}, 'first plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::OtherTestPlugins::Second Handel::Checkout::Plugin::TestPlugin)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -430,26 +484,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; 'Handel::OtherTestPlugins'});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        ok(scalar keys %plugins &gt;= 2);
-        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        ok(scalar keys %plugins &gt;= 2, 'loaded at least 2 plugins');
+        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin loaded');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::TestPlugins::First'}, 'first plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::OtherTestPlugins::Second Handel::Checkout::Plugin::TestPlugin)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -463,26 +517,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        ok(scalar keys %plugins &gt;= 2);
-        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        ok(scalar keys %plugins &gt;= 2, 'loaded at least 2 plugins');
+        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin loaded');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::TestPlugins::First'}, 'first plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::OtherTestPlugins::Second Handel::Checkout::Plugin::TestPlugin)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -498,26 +552,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        ok(scalar keys %plugins &gt;= 3);
-        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        ok(scalar keys %plugins &gt;= 3, 'loaded at least 3 plugins');
+        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin loaded');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::OtherTestPlugins::Second Handel::Checkout::Plugin::TestPlugin Handel::TestPlugins::First)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -533,26 +587,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins', 'Handel::TestPlugins']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        ok(scalar keys %plugins &gt;= 2);
-        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        ok(scalar keys %plugins &gt;= 2, 'loaded at least 2 plugins');
+        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin loaded');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::Checkout::Plugin::TestPlugin Handel::TestPlugins::First)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -568,26 +622,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins', 'Handel::TestPlugins']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        ok(scalar keys %plugins &gt;= 2);
-        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        ok(scalar keys %plugins &gt;= 2, 'loaded at least 2 plugins');
+        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin loaded');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::Checkout::Plugin::TestPlugin Handel::TestPlugins::First)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -603,26 +657,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins', 'Handel::TestPlugins']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        ok(scalar keys %plugins &gt;= 2);
-        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        ok(scalar keys %plugins &gt;= 2, 'loaded at least 2 plugins');
+        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin loaded');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::Checkout::Plugin::TestPlugin Handel::TestPlugins::First)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -636,26 +690,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins', 'Handel::TestPlugins'], ignoreplugins =&gt; ['Handel::OtherTestPlugins::Second']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        ok(scalar keys %plugins &gt;= 2);
-        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        ok(scalar keys %plugins &gt;= 2, 'loaded at least 2 plugins');
+        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin loaded');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::Checkout::Plugin::TestPlugin Handel::TestPlugins::First)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -669,26 +723,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins', 'Handel::TestPlugins'], ignoreplugins =&gt; 'Handel::OtherTestPlugins::Second'});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        ok(scalar keys %plugins &gt;= 2);
-        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        ok(scalar keys %plugins &gt;= 2, 'loaded at least 2 plugins');
+        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin loaded');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::Checkout::Plugin::TestPlugin Handel::TestPlugins::First)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -702,26 +756,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins', 'Handel::TestPlugins'], ignoreplugins =&gt; qr/^Handel::OtherTestPlugins::Second$/});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        ok(scalar keys %plugins &gt;= 2);
-        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        ok(scalar keys %plugins &gt;= 2, 'loaded at least 2 plugins');
+        ok(exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin loaded');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'first plugin loaded');
+        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::Checkout::Plugin::TestPlugin Handel::TestPlugins::First)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -737,26 +791,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins', 'Handel::TestPlugins']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 1);
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 1, 'loaded 1 plugin');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::TestPlugins::First'}, 'first plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::OtherTestPlugins::Second)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'init_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -772,26 +826,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins', 'Handel::TestPlugins']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 1);
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 1, 'loaded 1 plugin');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::TestPlugins::First'}, 'first plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::OtherTestPlugins::Second)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'register_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'hase code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -807,26 +861,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins', 'Handel::TestPlugins']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 1);
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 1, 'loaded 1 plugin');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::TestPlugins::First'}, 'fist plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::OtherTestPlugins::Second)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'register_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -840,26 +894,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins', 'Handel::TestPlugins'], loadplugins =&gt; ['Handel::OtherTestPlugins::Second']});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 1);
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 1, 'loaded 1 plugin');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::TestPlugins::First'}, 'first plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::OtherTestPlugins::Second)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'register_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -873,26 +927,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins', 'Handel::TestPlugins'], loadplugins =&gt; 'Handel::OtherTestPlugins::Second'});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 1);
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 1, 'loaded 1 plugin');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::TestPlugins::First'}, 'first plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::OtherTestPlugins::Second)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'register_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -906,26 +960,26 @@ sub run {
         my $checkout = $subclass-&gt;new({addpluginpaths =&gt; ['Handel::OtherTestPlugins', 'Handel::TestPlugins'], loadplugins =&gt; qr/^Handel::OtherTestPlugins::Second$/});
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 1);
-        ok(exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 1, 'loaded 1 plugin');
+        ok(exists $plugins{'Handel::OtherTestPlugins::Second'}, 'second plugin loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::TestPlugins::First'}, 'first plugin no loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::OtherTestPlugins::Second)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'register_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -942,26 +996,26 @@ sub run {
         });
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
 
-        is(scalar keys %plugins, 1);
-        ok(exists $plugins{'Handel::TestPlugins::First'});
-        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'});
-        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'});
+        is(scalar keys %plugins, 1, 'loaded 1 plugin');
+        ok(exists $plugins{'Handel::TestPlugins::First'}, 'fist plugin loaded');
+        ok(!exists $plugins{'Handel::OtherTestPlugins::Second'}, 'other plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestPlugin'}, 'test plugin not loaded');
+        ok(!exists $plugins{'Handel::Checkout::Plugin::TestBogusPlugin'}, 'bogus plugin not loaded');
 
         foreach (qw(Handel::TestPlugins::First)) {
             my $package = $_;
             my $plugin = $plugins{$package};
 
             isa_ok($plugin, 'Handel::Checkout::Plugin');
-            ok($plugin-&gt;{'init_called'});
-            ok($plugin-&gt;{'register_called'});
+            ok($plugin-&gt;{'init_called'}, 'init called');
+            ok($plugin-&gt;{'register_called'}, 'register called');
 
             foreach (values %{$checkout-&gt;{'handlers'}-&gt;{1}}) {
                 if (ref $_-&gt;[0] eq $package) {
                     isa_ok($_-&gt;[0], $package);
-                    is(ref $_-&gt;[1], 'CODE');
+                    is(ref $_-&gt;[1], 'CODE', 'has code ref');
                     $_-&gt;[1]-&gt;($plugin);
-                    ok($plugin-&gt;{'handler_called'});
+                    ok($plugin-&gt;{'handler_called'}, 'handler called');
 
                     last;
                 };
@@ -979,11 +1033,10 @@ sub run {
         });
 
         my @plugins = $checkout-&gt;plugins;
-        is(scalar @plugins, 2);
+        is(scalar @plugins, 2, 'loaded 2 plugins');
 
         my $plugins = $checkout-&gt;plugins;
         isa_ok($plugins, 'ARRAY');
-        is(scalar @{$plugins}, 2);
+        is(scalar @{$plugins}, 2, 'loaded 2 plugins');
     };
-
 };</diff>
      <filename>t/checkout_plugins.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,16 +2,16 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test;
+
     eval 'require DBD::SQLite';
     if($@) {
         plan skip_all =&gt; 'DBD::SQLite not installed';
     } else {
-        plan tests =&gt; 92;
+        plan tests =&gt; 196;
     };
 
     use_ok('Handel::Checkout');
@@ -19,13 +19,15 @@ BEGIN {
     use_ok('Handel::Subclassing::Order');
     use_ok('Handel::Subclassing::CheckoutStash');
     use_ok('Handel::Subclassing::Stash');
-    use_ok('Handel::Constants', qw(:checkout));
+    use_ok('Handel::Constants', qw(:checkout :order));
     use_ok('Handel::Exception', ':try');
     use_ok('Handel::Order');
 };
 
 
 ## This is a hack, but it works. :-)
+my $schema = Handel::Test-&gt;init_schema(no_populate =&gt; 1);
+
 &amp;run('Handel::Checkout', 1);
 &amp;run('Handel::Subclassing::Checkout', 2);
 &amp;run('Handel::Subclassing::CheckoutStash', 3);
@@ -33,37 +35,24 @@ BEGIN {
 sub run {
     my ($subclass, $dbsuffix) = @_;
 
-
-    ## Setup SQLite DB for tests
-    {
-        my $dbfile  = &quot;t/checkout_process_$dbsuffix.db&quot;;
-        my $db      = &quot;dbi:SQLite:dbname=$dbfile&quot;;
-        my $createcart   = 't/sql/cart_create_table.sql';
-        my $createorder  = 't/sql/order_create_table.sql';
-        my $data    = 't/sql/order_fake_data.sql';
-
-        unlink $dbfile;
-        executesql($db, $createorder);
-        executesql($db, $createcart);
-        executesql($db, $data);
-
-        local $^W = 0;
-        Handel::DBI-&gt;connection($db);
-    };
+    Handel::Test-&gt;populate_schema($schema, clear =&gt; 1);
+    local $ENV{'HandelDBIDSN'} = $schema-&gt;dsn;
 
 
     ## test for Handel::Exception::Checkout where no order is loaded
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = $subclass-&gt;new;
 
             $checkout-&gt;process;
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Checkout with {
-            pass;
+            pass('caught checkout exception');
+            like(shift, qr/no order/i, 'no order found in message');
         } otherwise {
-            fail;
+            fail('other exception caught');
         };
     };
 
@@ -72,14 +61,16 @@ sub run {
     ## or string
     {
         try {
+            local $ENV{'LANG'} = 'en';
             my $checkout = $subclass-&gt;new;
             $checkout-&gt;process({'1234' =&gt; 1});
 
-            fail;
+            fail('no exception thrown');
         } catch Handel::Exception::Argument with {
-            pass;
+            pass('caught argument exception');
+            like(shift, qr/not an array/i, 'not an array ref in message');
         } otherwise {
-            fail;
+            fail('other exception caught');
         };
     };
 
@@ -92,19 +83,72 @@ sub run {
             phases =&gt; [CHECKOUT_PHASE_INITIALIZE]
         });
 
-        is($checkout-&gt;process, CHECKOUT_STATUS_OK);
+        is($checkout-&gt;process, CHECKOUT_STATUS_OK, 'processed OK');
+
+        foreach ($checkout-&gt;plugins) {
+            ok($_-&gt;{'setup_called'}, 'setup was called');
+            ok($_-&gt;{'handler_called'}, 'handler was called');
+            ok($_-&gt;{'teardown_called'}, 'teardown was called');
+        };
+    };
+
+
+    ## load test plugins and checkout setup/teardown using string phases
+    {
+        my $checkout = $subclass-&gt;new({
+            order =&gt; '11111111-1111-1111-1111-111111111111',
+            pluginpaths =&gt; 'Handel::TestPlugins, Handel::OtherTestPlugins'
+        });
+
+        is($checkout-&gt;process('CHECKOUT_PHASE_INITIALIZE'), CHECKOUT_STATUS_OK, 'processed OK');
+
+        foreach ($checkout-&gt;plugins) {
+            ok($_-&gt;{'setup_called'}, 'setup was called');
+            ok($_-&gt;{'handler_called'}, 'handler was called');
+            ok($_-&gt;{'teardown_called'}, 'teardown was called');
+        };
+    };
+
+
+    ## load test plugins and checkout setup/teardown using array phases
+    {
+        my $checkout = $subclass-&gt;new({
+            order =&gt; '11111111-1111-1111-1111-111111111111',
+            pluginpaths =&gt; 'Handel::TestPlugins, Handel::OtherTestPlugins'
+        });
+
+        is($checkout-&gt;process([CHECKOUT_PHASE_INITIALIZE]), CHECKOUT_STATUS_OK, 'processed OK');
+
+        foreach ($checkout-&gt;plugins) {
+            ok($_-&gt;{'setup_called'}, 'setup was called');
+            ok($_-&gt;{'handler_called'}, 'handler was called');
+            ok($_-&gt;{'teardown_called'}, 'teardown was called');
+        };
+    };
+
+
+    ## load test plugins and checkout but usin a bogus phase
+    {
+        my $checkout = $subclass-&gt;new({
+            order =&gt; '11111111-1111-1111-1111-111111111111',
+            pluginpaths =&gt; 'Handel::TestPlugins, Handel::OtherTestPlugins'
+        });
+
+        is($checkout-&gt;process([0]), CHECKOUT_STATUS_OK, 'processed OK');
 
         foreach ($checkout-&gt;plugins) {
-            ok($_-&gt;{'setup_called'});
-            ok($_-&gt;{'handler_called'});
-            ok($_-&gt;{'teardown_called'});
+            ok($_-&gt;{'setup_called'}, 'setup was called');
+            ok(!$_-&gt;{'handler_called'}, 'handler was called');
+            ok($_-&gt;{'teardown_called'}, 'teardown was called');;
         };
     };
 
 
     ## Run a successful test pipeline
     {
-        my $order = Handel::Order-&gt;new({});
+        my $order = Handel::Order-&gt;create({
+            shopper =&gt; '00000000-0000-0000-0000-000000000000'
+        });
             $order-&gt;add({
                 sku      =&gt; 'SKU1',
                 quantity =&gt; 1,
@@ -123,21 +167,93 @@ sub run {
             order       =&gt; $order
         });
 
-        is($checkout-&gt;process, CHECKOUT_STATUS_OK);
+        is($checkout-&gt;process, CHECKOUT_STATUS_OK, 'processed OK');
 
         my $items = $order-&gt;items;
-        is($order-&gt;subtotal, 5.55);
-        is($items-&gt;first-&gt;total, 1.11);
-        is($items-&gt;next-&gt;total, 4.44);
+        is($order-&gt;subtotal+0, 5.55, 'subtotal is 5.55');
+        is($items-&gt;first-&gt;total+0, 1.11, 'total is 1.11');
+        $items-&gt;next;
+        is($items-&gt;next-&gt;total+0, 4.44, 'total is 4.44');
 
         my @messages = $checkout-&gt;messages;
-        is(scalar @messages, 0);
+        is(scalar @messages, 0, 'has no messages');
+    };
+
+
+    ## Run a successful test pipeline usin default phases
+    {
+        my $order = Handel::Order-&gt;create({
+            shopper =&gt; '00000000-0000-0000-0000-000000000000'
+        });
+            $order-&gt;add({
+                sku      =&gt; 'SKU1',
+                quantity =&gt; 1,
+                price    =&gt; 1.11
+            });
+            $order-&gt;add({
+                sku      =&gt; 'SKU2',
+                quantity =&gt; 2,
+                price    =&gt; 2.22
+            });
+
+        my $checkout = $subclass-&gt;new({
+            pluginpaths =&gt; 'Handel::TestPipeline',
+            loadplugins =&gt; 'Handel::TestPipeline::InitializeTotals',
+            order       =&gt; $order
+        });
+        is($checkout-&gt;process, CHECKOUT_STATUS_OK, 'processed OK');
+
+        my $items = $order-&gt;items;
+        is($order-&gt;subtotal+0, 0, 'subtotal is 0');
+        is($items-&gt;first-&gt;total+0, 0, 'total is 0');
+        $items-&gt;next;
+        is($items-&gt;next-&gt;total+0, 0, 'total is 0');
+
+        my @messages = $checkout-&gt;messages;
+        is(scalar @messages, 0, 'has no messages');
+    };
+
+
+    ## Run a successful test pipeline using the stock plugins
+    {
+        my $order = Handel::Order-&gt;create({
+            shopper =&gt; '00000000-0000-0000-0000-000000000000'
+        });
+            $order-&gt;add({
+                sku      =&gt; 'SKU1',
+                quantity =&gt; 1,
+                price    =&gt; 1.11
+            });
+            $order-&gt;add({
+                sku      =&gt; 'SKU2',
+                quantity =&gt; 2,
+                price    =&gt; 2.22
+            });
+
+        is($order-&gt;type, ORDER_TYPE_TEMP, 'order is temp');
+        is($order-&gt;number, undef, 'number is not set');
+
+        my $checkout = $subclass-&gt;new({
+            phases      =&gt; CHECKOUT_ALL_PHASES,
+            order       =&gt; $order,
+            loadplugins =&gt; 'Handel::Checkout::Plugin::AssignOrderNumber, Handel::Checkout::Plugin::MarkOrderSaved'
+        });
+
+        is($checkout-&gt;process, CHECKOUT_STATUS_OK, 'processed OK');
+
+        is($checkout-&gt;order-&gt;type, ORDER_TYPE_SAVED, 'order was marked saved');
+        ok($checkout-&gt;order-&gt;number, 'number was set');
+
+        my @messages = $checkout-&gt;messages;
+        is(scalar @messages, 0, 'no error messages');
     };
 
 
     ## Run a failing test pipeline
     {
-        my $order = Handel::Order-&gt;new({
+        $subclass-&gt;order_class-&gt;_set_storage(undef);
+        my $order = $subclass-&gt;order_class-&gt;create({
+            shopper =&gt; '00000000-0000-0000-0000-000000000000',
             billtofirstname =&gt; 'BillToFirstName',
             billtolastname  =&gt; 'BillToLastName'
         });
@@ -161,25 +277,28 @@ sub run {
             order       =&gt; $order
         });
 
-        is($checkout-&gt;process, CHECKOUT_STATUS_ERROR);
+        is($checkout-&gt;process, CHECKOUT_STATUS_ERROR, 'processed ERROR');
 
-        is($checkout-&gt;order-&gt;billtofirstname, 'BillToFirstName');
-        is($checkout-&gt;order-&gt;billtolastname, 'BillToLastName');
+        is($checkout-&gt;order-&gt;billtofirstname, 'BillToFirstName', 'first name unchanged');
+        is($checkout-&gt;order-&gt;billtolastname, 'BillToLastName', 'last name unchanged');
 
         my $items = $order-&gt;items;
-        is($order-&gt;subtotal, 0);
-        is($items-&gt;first-&gt;sku, 'SKU1');
-        is($items-&gt;next-&gt;sku, 'SKU2');
+        is($order-&gt;subtotal+0, 0, 'subtotal is 0');
+        is($items-&gt;first-&gt;sku, 'SKU1', 'sku1 is unchanged');
+        $items-&gt;next;
+        is($items-&gt;next-&gt;sku, 'SKU2', 'sku2 is unchanged');
 
         my @messages = $checkout-&gt;messages;
-        is(scalar @messages, 1);
-        ok($messages[0] =~ /ValidateError/);
+        is(scalar @messages, 1, 'has 1 message');
+        ok($messages[0] =~ /ValidateError/, 'message is validate error');
     };
 
 
     ## Check stash writes and lifetime
     {
-        my $order = Handel::Order-&gt;new({});
+        my $order = Handel::Order-&gt;create({
+            shopper =&gt; '00000000-0000-0000-0000-000000000000'
+        });
             $order-&gt;add({
                 sku      =&gt; 'SKU1',
                 quantity =&gt; 1,
@@ -199,16 +318,62 @@ sub run {
             order       =&gt; $order
         });
 
-        is($checkout-&gt;process, CHECKOUT_STATUS_OK);
-        is($checkout-&gt;stash-&gt;{'WriteToStash'}, 'WrittenToStash');
+        is($checkout-&gt;process, CHECKOUT_STATUS_OK, 'processed OK');
+        is($checkout-&gt;stash-&gt;{'WriteToStash'}, 'WrittenToStash', 'stash variable set');
 
         my %plugins = map { ref $_ =&gt; $_ } $checkout-&gt;plugins;
-        is(scalar keys %plugins, 2);
-        ok(exists $plugins{'Handel::TestPipeline::ReadFromStash'});
-        is($plugins{'Handel::TestPipeline::ReadFromStash'}-&gt;{'ReadFromStash'}, 'WrittenToStash');
+        is(scalar keys %plugins, 2, 'has 2 plugins');
+        ok(exists $plugins{'Handel::TestPipeline::ReadFromStash'}, 'stash plugin loaded');
+        is($plugins{'Handel::TestPipeline::ReadFromStash'}-&gt;{'ReadFromStash'}, 'WrittenToStash', 'stash written to');
 
         my @messages = $checkout-&gt;messages;
-        is(scalar @messages, 0);
+        is(scalar @messages, 0, 'has no messages');
+    };
+};
+
+
+## Run a failing test pipeline with a rollback failure
+{
+    my $order = Handel::Order-&gt;create({
+        shopper =&gt; '00000000-0000-0000-0000-000000000000',
+        billtofirstname =&gt; 'BillToFirstName',
+        billtolastname  =&gt; 'BillToLastName'
+    });
+        $order-&gt;add({
+            sku      =&gt; 'SKU1',
+            quantity =&gt; 1,
+            price    =&gt; 1.11
+        });
+        $order-&gt;add({
+            sku      =&gt; 'SKU2',
+            quantity =&gt; 2,
+            price    =&gt; 2.22
+        });
+
+    my $checkout = Handel::Checkout-&gt;new({
+        pluginpaths =&gt; 'Handel::TestPipeline',
+        loadplugins =&gt; ['Handel::TestPipeline::InitializeTotals',
+                        'Handel::TestPipeline::ValidateError'
+                       ],
+        phases      =&gt; CHECKOUT_ALL_PHASES,
+        order       =&gt; $order
+    });
+
+    no warnings 'once';
+    local *Handel::Storage::DBIC::Result::txn_rollback = sub {
+        die 'boom!';
     };
 
+
+    try {
+        local $ENV{'LANG'} = 'en';
+        $checkout-&gt;process;
+
+        fail('no exception thrown');
+    } catch Handel::Exception::Checkout with {
+        pass('Handel::Exception::Checkout caught');
+        like(shift, qr/rollback/i, 'rollback in message');
+    } otherwise {
+        fail('other exception caught');
+    };
 };</diff>
      <filename>t/checkout_process.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,22 +2,16 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More;
-use lib 't/lib';
-use Handel::TestHelper qw(executesql);
 
 BEGIN {
-    eval 'require DBD::SQLite';
-    if($@) {
-        plan skip_all =&gt; 'DBD::SQLite not installed';
-    } else {
-        plan tests =&gt; 19;
-    };
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 31;
 
     use_ok('Handel::Checkout');
     use_ok('Handel::Subclassing::Checkout');
     use_ok('Handel::Subclassing::CheckoutStash');
     use_ok('Handel::Subclassing::Stash');
+    use_ok('Handel::Exception', ':try');
 };
 
 
@@ -32,20 +26,29 @@ sub run {
 
     ## Check the default stash creation
     {
-        my $checkout = $subclass-&gt;new;
+        my $checkout = $subclass-&gt;new({
+            stash =&gt; {foo =&gt; 'bar'}
+        });
         isa_ok($checkout-&gt;stash, $stashclass);
+        is($checkout-&gt;stash-&gt;{'foo'}, 'bar', 'stash item is set');
     };
 
 
     ## Check the stash parameter
     {
-        my $stash = CustomStash-&gt;new;
+        my $stash = CustomStash-&gt;new({
+            foo =&gt; 'bar'
+        });
         my $checkout = Handel::Checkout-&gt;new({
             stash =&gt; $stash
         });
 
         isa_ok($checkout-&gt;stash, 'CustomStash');
         isa_ok($checkout-&gt;stash, 'Handel::Checkout::Stash');
+        is($checkout-&gt;stash-&gt;{'foo'}, 'bar', 'stash item is set');
+
+        $checkout-&gt;stash-&gt;clear;
+        is_deeply($checkout-&gt;stash, {}, 'stash is now clear')
     };
 
 
@@ -58,7 +61,22 @@ sub run {
         isa_ok($checkout-&gt;stash, 'CustomStash');
         isa_ok($checkout-&gt;stash, 'Handel::Checkout::Stash');
     };
+};
+
 
+## test for exception when non-hashref is given
+{
+    try {
+        local $ENV{'LANG'} = 'en';
+        my $stash = Handel::Checkout::Stash-&gt;new([]);
+
+        fail('no exception thrown');
+    } catch Handel::Exception::Argument with {
+        pass('Argument exception caught');
+        like(shift, qr/not a hash ref/i, 'message contains not a hashref');
+    } otherwise {
+        fail('Other exception caught');
+    };
 };
 
 </diff>
      <filename>t/checkout_stash.t</filename>
    </modified>
    <modified>
      <diff>@@ -1,6 +1,6 @@
 # $Id$
 &lt;IfModule mod_perl.c&gt;
-	PerlSetVar db_name		@documentroot@/xsp.db
+	PerlSetVar db_name		@ServerRoot@/var/axkit.db
 	PerlSetVar db_driver	&quot;SQLite&quot;
 
 	&lt;IfDefine APACHE1&gt;
@@ -14,7 +14,7 @@
 			AxAddXSPTaglib	AxKit::XSP::Handel::Cart
 			AxAddXSPTaglib	AxKit::XSP::Handel::Checkout
 			AxAddXSPTaglib	AxKit::XSP::Handel::Order
-	
+
 			&lt;Files *.xsp&gt;
 				SetHandler	AxKit
 			&lt;/Files&gt;</diff>
      <filename>t/conf/extra.conf.in</filename>
    </modified>
    <modified>
      <diff>@@ -1,31 +1,127 @@
 #!perl -wT
 # $Id$
+## no critic (ProhibitPackageVars)
 use strict;
 use warnings;
-use Test::More tests =&gt; 9;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 29;
+    use Scalar::Util qw/refaddr/;
+
+    local $ENV{'MOD_PERL_API_VERSION'} = 100;
+
     use_ok('Handel::ConfigReader');
+    use_ok('Handel');
+    use_ok('Handel::Exception', ':try');
 };
 
 my $cfg = Handel::ConfigReader-&gt;new();
 isa_ok($cfg, 'Handel::ConfigReader');
 
+
+## MOD_PERL_API_VERSION was bogus, but set
+is($Handel::ConfigReader::MOD_PERL, 0, 'MOD_PERL should be zero');
+
+
+## get a setting from ENV
 {
     local $ENV{'MySetting'} = 23;
-    ok(exists $cfg-&gt;{'MySetting'});
-    is($cfg-&gt;get('MySetting'), $ENV{'MySetting'});
-    is($cfg-&gt;get('MyOtherSetting', 25), 25);
+    ok(exists $cfg-&gt;{'MySetting'}, 'MySetting exists in ENV');
+    is($cfg-&gt;get('MySetting'), 23, 'MySetting is 23');
+    is($cfg-&gt;get('MyOtherSetting', 25), 25, 'Return default when nothing exists');
 
-    ok(!exists $cfg-&gt;{'JunkSetting'});
+    ok(!exists $cfg-&gt;{'JunkSetting'}, 'Bogus setting does not exist');
 };
 
 
 ## test defaults and their way through get/tied hash
 {
-    local $Handel::ConfigReader::Defaults{'MyDefault'} = 'Default';
+    local $Handel::ConfigReader::DEFAULTS{'MyDefault'} = 'Default';
+
+    ok(exists $cfg-&gt;{'MyDefault'}, 'MyDefault exists');
+    is($cfg-&gt;get('MyDefault'), 'Default', 'get MyDefault returns default from %Defaults');
+    is($cfg-&gt;{'MyDefault'}, 'Default', 'MyDefault returns default from %Defaults');
+};
+
+
+## setting tied hash key does nothing to config value
+{
+    local $ENV{'MySetting'} = 23;
+    is($cfg-&gt;{'MySetting'}, 23, 'MySetting is 23');
+    $cfg-&gt;{'MySetting'} = 24;
+    is($cfg-&gt;{'MySetting'}, 23, 'MySetting is still 23');
+};
+
+
+## deleting tied hash key does nothing to config value
+{
+    local $ENV{'MySetting'} = 23;
+    is($cfg-&gt;{'MySetting'}, 23, 'MySetting is 23');
+    delete $cfg-&gt;{'MySetting'};
+    is($cfg-&gt;{'MySetting'}, 23, 'MySetting is still 23');
+};
+
+
+## clearing tied hash key does nothing to config value
+{
+    local $ENV{'MySetting'} = 23;
+    is($cfg-&gt;{'MySetting'}, 23, 'MySetting is 23');
+    %{$cfg} = ();
+    is($cfg-&gt;{'MySetting'}, 23, 'MySetting is still 23');
+};
+
 
-    ok(exists $cfg-&gt;{'MyDefault'});
-    is($cfg-&gt;get('MyDefault'), 'Default');
-    is($cfg-&gt;{'MyDefault'}, 'Default');
-};
\ No newline at end of file
+## send a ref through the werks
+{
+    local %Handel::ConfigReader::DEFAULTS = ('MP1DefaultRef' =&gt; {});
+    isa_ok($cfg-&gt;{'MP1DefaultRef'}, 'HASH', 'return ref passed through defaults');
+};
+
+
+## return undef if new doesn't
+{
+    no warnings 'redefine';
+    local *Handel::ConfigReader::new = sub {undef};
+
+    is(Handel::ConfigReader-&gt;instance, undef, 'no new returns undef');
+};
+
+
+## get the same instance
+{
+    my $instance1 = Handel::ConfigReader-&gt;instance;
+    my $instance2 = Handel::ConfigReader-&gt;instance;
+    isa_ok($instance1, 'Handel::ConfigReader');
+    isa_ok($instance2, 'Handel::ConfigReader');
+    is(refaddr $instance1, refaddr $instance2, 'instance returns the same instance');
+};
+
+
+## throw exception when setting bogus config class
+{
+    try {
+        local $ENV{'LANG'} = 'en';
+        Handel-&gt;config_class('Bogus');
+
+        fail('no exception thrown');
+    } catch Handel::Exception with {
+        pass('Argument exception thrown');
+        like(shift, qr/could not be loaded/i, 'class not loaded in exception message');
+        is(Handel-&gt;config_class, 'Handel::ConfigReader', 'config class is still set');
+    } otherwise {
+        fail('Other exception thrown');
+    };
+};
+
+
+# get the config reader
+{
+    my $config = Handel-&gt;config;
+    isa_ok($config, 'Handel::ConfigReader');
+
+    my $reconfig = Handel-&gt;config;
+    isa_ok($reconfig, 'Handel::ConfigReader');
+
+    is(refaddr $config, refaddr $reconfig, 'config returns same instance');
+};</diff>
      <filename>t/config.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,15 +2,17 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More qw(no_plan);
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 49;
+
     use_ok('Handel::Constants', qw(:all));
 };
 
 foreach my $const (@Handel::Constants::EXPORT_OK) {
     can_ok(__PACKAGE__, $const);
     if ($const =~ /[A-Z_]/g) {
-        is(str_to_const($const), Handel::Constants-&gt;$const);
+        is(str_to_const($const), Handel::Constants-&gt;$const, 'constant works as method');
     };
 };</diff>
      <filename>t/constants.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,9 +2,11 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More tests =&gt; 7;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 7;
+
     use_ok('Handel::Constraints', qw(:all));
     use_ok('Handel::Constants', qw(:cart));
 };</diff>
      <filename>t/constraints_cart_type.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,9 +2,11 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More tests =&gt; 18;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 20;
+
     use_ok('Handel::Constraints', qw(:all));
     use_ok('Handel::Checkout');
     use_ok('Handel::Constants', qw(:checkout));
@@ -14,6 +16,8 @@ BEGIN {
 ok(!constraint_checkout_phase('junk.foo'), 'alpha gibberish type');
 ok(!constraint_checkout_phase(-14), 'negative number type');
 ok(!constraint_checkout_phase(23), 'out of range type');
+ok(!constraint_checkout_phase(undef), 'value is undefined');
+ok(!constraint_checkout_phase(''), 'value is empty string');
 ok(constraint_checkout_phase(CHECKOUT_PHASE_INITIALIZE), 'checkout initialize phase');
 ok(constraint_checkout_phase(CHECKOUT_PHASE_VALIDATE), 'checkout validation phase');
 ok(constraint_checkout_phase(CHECKOUT_PHASE_AUTHORIZE), 'checkout authorization phase');
@@ -28,6 +32,6 @@ ok(constraint_checkout_phase(CHECKOUT_PHASE_DELIVER), 'checkout delivery phase')
     can_ok('main', 'CUSTOM_CHECKOUT_PHASE');
     ok(constraint_checkout_phase(Handel::Constants-&gt;CUSTOM_CHECKOUT_PHASE), 'custom checkout phase');
     ok(constraint_checkout_phase(&amp;CUSTOM_CHECKOUT_PHASE), 'custom checkout phase');
-    is(Handel::Constants-&gt;CUSTOM_CHECKOUT_PHASE, 99);
-    is(&amp;CUSTOM_CHECKOUT_PHASE, 99);
+    is(Handel::Constants-&gt;CUSTOM_CHECKOUT_PHASE, 99, 'custom phase value returned as a method');
+    is(&amp;CUSTOM_CHECKOUT_PHASE, 99, 'custom phase value returned as a constant');
 };</diff>
      <filename>t/constraints_checkout_phase.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,19 +2,23 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More tests =&gt; 5;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 7;
+
     use_ok('Handel::Constraints', qw(:all));
 };
 
-ok(constraint_currency_code('usd'));
-ok(constraint_currency_code('USD'));
-ok(!constraint_currency_code('USDD'));
+ok(!constraint_currency_code(undef),     'value is undefined');
+ok(!constraint_currency_code(''),        'value is empty string');
+ok(constraint_currency_code('usd'),      'value is lower case');
+ok(constraint_currency_code('USD'),      'value is upper case');
+ok(!constraint_currency_code('USDD'),    'value is too long');
 
 SKIP: {
     eval 'use Locale::Currency';
     skip 'Locale::Currency not installed', 1 if $@;
 
-    ok(!constraint_currency_code('ZZZ'));
+    ok(!constraint_currency_code('ZZZ'), 'valid is invalid code');
 };</diff>
      <filename>t/constraints_currency_code.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,9 +2,11 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More tests =&gt; 7;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 9;
+
     use_ok('Handel::Constraints', qw(:all));
     use_ok('Handel::Constants', qw(:order));
 };
@@ -12,5 +14,7 @@ BEGIN {
 ok(!constraint_order_type('junk.foo'),   'alpha gibberish type');
 ok(!constraint_order_type(-14),          'negative number type');
 ok(!constraint_order_type(23),           'out of range type');
+ok(!constraint_order_type(undef),        'undefined value');
+ok(!constraint_order_type(''),            'value is empty string');
 ok(constraint_order_type(ORDER_TYPE_SAVED),   'order type saved');
 ok(constraint_order_type(ORDER_TYPE_TEMP),    'order type temp');</diff>
      <filename>t/constraints_order_type.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,13 +2,18 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More tests =&gt; 14;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 20;
+
     use_ok('Handel::Constraints', qw(:all));
+    use_ok('Handel::Currency');
 };
 
 ok(!constraint_price('junk.foo'),   'alpha gibberish price');
+ok(!constraint_price(undef),        'value is undefined');
+ok(!constraint_price(''),           'value is empty string');
 ok(!constraint_price(-14),          'negative number price');
 ok(!constraint_price(-25.79),       'negative float price');
 ok(constraint_price(0),             'zero price');
@@ -21,3 +26,19 @@ ok(constraint_price(25.89),         'positive float price');
 ok(constraint_price(100.00),        'positive float price');
 ok(constraint_price(99999.99),      'positive float price');
 ok(constraint_price('34.66'),       'positive float price string');
+ok(constraint_price(Handel::Currency-&gt;new(1.23)), 'with a currency object');
+ok(constraint_price(bless({value =&gt; 1.23}, 'CustomCurrency')), 'with a non-currency object');
+ok(!constraint_price(bless({value =&gt; 'abc'}, 'CustomCurrency')), 'with a non-currency object');
+
+package CustomCurrency;
+use strict;
+use warnings;
+use overload
+    '0+'     =&gt; sub {shift-&gt;value},
+    'bool'   =&gt; sub {shift-&gt;value},
+    '&quot;&quot;'     =&gt; sub {shift-&gt;value},
+    fallback =&gt; 1;
+
+sub value {return shift-&gt;{'value'}};
+
+1;
\ No newline at end of file</diff>
      <filename>t/constraints_price.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,13 +2,17 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More tests =&gt; 13;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 26;
+
     use_ok('Handel::Constraints', ':all');
     use_ok('Handel::Exception', ':try');
 };
 
+ok(!constraint_quantity(undef),     'value is undefined');
+ok(!constraint_quantity(''),        'value is empty string');
 ok(!constraint_quantity(-12),       'negative quantity');
 ok(!constraint_quantity(0),         'zero quantity');
 ok(!constraint_quantity('abc'),     'alpha quantity');
@@ -25,16 +29,32 @@ ok(constraint_quantity(1),          'numeric quantity');
     ok(constraint_quantity(5),     'quantity &lt;= max');
 
     try {
+        local $ENV{'LANG'} = 'en';
         constraint_quantity(6);
 
-        fail;
+        fail('no exception thrown');
     } catch Handel::Exception::Constraint with {
-        pass;
+        pass('caught constraint exception');
+        like(shift, qr/quantity requested.*greater than.*allowed/i, 'failed constraint in message');
     } otherwise {
-        fail;
+        fail('caught other exception');
     };
 };
 
+## test max quantity with exception action but no max
+{
+    local $ENV{'HandelMaxQuantity'} = '';
+    local $ENV{'HandelMaxQuantityAction'} = 'Exception';
+
+    ok(constraint_quantity(5),     'quantity &lt;= max');
+
+    my $hash = {quantity =&gt; 2};
+    my $object = bless {}, 'Fake';
+
+    ok(constraint_quantity(7, $object, undef, $hash), 'constraint passes with no max');
+    is($hash-&gt;{'quantity'}, 2, 'quantity is unchanged');
+};
+
 ## test max quantity adjustment
 {
     local $ENV{'HandelMaxQuantity'} = 5;
@@ -44,6 +64,45 @@ ok(constraint_quantity(1),          'numeric quantity');
     my $hash = {quantity =&gt; 2};
     my $object = bless {}, 'Fake';
 
-    ok(constraint_quantity(7, $object, undef, $hash));
-    is($hash-&gt;{'quantity'}, 5);
+    ok(constraint_quantity(7, $object, undef, $hash), 'quantity adjusted');
+    is($hash-&gt;{'quantity'}, 5, 'quantity adjusted');
+};
+
+
+## test max quantity adjustment with object but no value
+{
+    local $ENV{'HandelMaxQuantity'} = 5;
+    local $ENV{'HandelMaxQuantityAction'} = 'Adjust';
+
+    my $hash = {quantity =&gt; 2};
+    my $object = bless {}, 'Fake';
+
+    ok(!constraint_quantity(0, $object, undef, $hash), 'constraint fails without value');
+    is($hash-&gt;{'quantity'}, 2, 'quantity unchanged');
+};
+
+## test max quantity adjustment with object and value less than max
+{
+    local $ENV{'HandelMaxQuantity'} = 5;
+    local $ENV{'HandelMaxQuantityAction'} = 'Adjust';
+
+    my $hash = {quantity =&gt; 2};
+    my $object = bless {}, 'Fake';
+
+    ok(constraint_quantity(3, $object, undef, $hash), 'constraint passes less than max');
+    is($hash-&gt;{'quantity'}, 2, 'quantity unchanged');
+};
+
+## test quantity with bogus adjustment type
+{
+    local $ENV{'HandelMaxQuantity'} = 5;
+    local $ENV{'HandelMaxQuantityAction'} = 'Boom';
+
+    ok(constraint_quantity(6), 'ignore max if action is bogus');
+
+    my $hash = {quantity =&gt; 2};
+    my $object = bless {}, 'Fake';
+
+    ok(constraint_quantity(7, $object, undef, $hash), 'constraint passes wit bogus adjustment type');
+    is($hash-&gt;{'quantity'}, 2, 'quantity is unchanged');
 };</diff>
      <filename>t/constraints_quantity.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,9 +2,11 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More tests =&gt; 5;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 7;
+
     use_ok('Handel::Constraints', qw(:all));
 };
 
@@ -21,3 +23,6 @@ ok(!constraint_uuid('{D597DEED-5B9F-11D1-8DD2-00AA004ABD5E}'),
 ok(constraint_uuid('D597DEED-5B9F-11D1-8DD2-00AA004ABD5E'),
     'valid uuid'
 );
+
+ok(!constraint_uuid(undef),        'value is undefined');
+ok(!constraint_uuid(''),           'value is empty string');</diff>
      <filename>t/constraints_uuid.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,113 +2,523 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More tests =&gt; 24;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 142;
+    use Scalar::Util qw/refaddr/;
+
+    eval 'use Test::MockObject 1.07';
+    if (!$@) {
+        Test::MockObject-&gt;fake_module('Finance::Currency::Convert::WebserviceX' =&gt; (
+            new =&gt; sub {return bless {}, shift},
+            convert =&gt; sub {return $_[1]+1.00}
+        ));
+    };
+
     use_ok('Handel::Currency');
     use_ok('Handel::Exception', ':try');
 };
 
-## test stringification and returns in the absence of
-## Locale::Currency::Format
+
+## create with no value
 {
-    my $currency = Handel::Currency-&gt;new(1.2);
+    my $currency = Handel::Currency-&gt;new;
     isa_ok($currency, 'Handel::Currency');
-    is($currency, 1.2);
-
-
-    eval 'use Locale::Currency::Format';
-    if ($@) {
-        is($currency-&gt;format, 1.2);
-        is($currency-&gt;format('CAD'), 1.2);
-        is($currency-&gt;format(undef, 'FMT_NAME'), 1.2);
-        is($currency-&gt;format('CAD', 'FMT_NAME'), 1.2);
-    } else {
-        is($currency-&gt;format, '1.20 USD');
-        is($currency-&gt;format('CAD'), '1.20 CAD');
-        is($currency-&gt;format(undef, 'FMT_NAME'), '1.20 US Dollar');
-        is($currency-&gt;format('CAD', 'FMT_NAME'), '1.20 Canadian Dollar');
-    };
+    is($currency-&gt;value, 0, 'value was set');
+    is($currency-&gt;stringify, '0.00 USD', 'stringify to format');
+    is($currency-&gt;code, 'USD', 'code is default');
+    is($currency-&gt;format, 'FMT_STANDARD', 'format is default');
+    is($currency-&gt;converter, undef, 'converter no defined');
 };
 
 
-SKIP: {
-    eval 'use Finance::Currency::Convert::WebserviceX 0.03';
-    skip 'Finance::Currency::Convert::WebserviceX 0.03 not installed', 8 if $@;
+## create new with no options
+{
+    my $currency = Handel::Currency-&gt;new(1.23);
+    isa_ok($currency, 'Handel::Currency');
+    is($currency-&gt;value, 1.23, 'value was set');
+    is($currency-&gt;stringify, '1.23 USD', 'stringify to value');
+    is($currency-&gt;code, 'USD', 'code is default');
+    is($currency-&gt;format, 'FMT_STANDARD', 'format is default');
+    is($currency-&gt;converter, undef, 'converter no defined');
+};
+
 
-    my $currency = Handel::Currency-&gt;new(1);
+## create new with code/format
+{
+    my $currency = Handel::Currency-&gt;new(1.23, 'CAD', 'FMT_COMMON');
     isa_ok($currency, 'Handel::Currency');
-    is($currency, 1);
+    is($currency-&gt;value, 1.23, 'value was set');
+    is($currency-&gt;stringify, '$1.23', 'stringify to value');
+    is($currency-&gt;code, 'CAD', 'code was set');
+    is($currency-&gt;format, 'FMT_COMMON', 'format was set');
+    is($currency-&gt;converter, undef, 'converter no defined');
+};
+
 
+## throw exception when bad currency code is set in new
+{
     try {
-        $currency-&gt;convert('CRAP', 'CAD');
+        local $ENV{'LANG'} = 'en';
+        my $currency = Handel::Currency-&gt;new(1.23, 'BAD');
 
-        fail;
+        fail('no exception thrown');
     } catch Handel::Exception::Argument with {
-        pass;
+        pass('Argument exception thrown');
+        like(shift, qr/currency code/i, 'currency code in message');
     } otherwise {
-        fail;
+        fail('Other exception thrown');
     };
+};
+
+
+## create and set code
+{
+    my $currency = Handel::Currency-&gt;new(1.23);
+    isa_ok($currency, 'Handel::Currency');
+    is($currency-&gt;value, 1.23, 'value was set');
+    is($currency-&gt;stringify, '1.23 USD', 'stringify to value');
+    is($currency-&gt;code, 'USD', 'code not set');
+    is($currency-&gt;format, 'FMT_STANDARD', 'code not set');
+    is($currency-&gt;converter, undef, 'converter no defined');
+
+    $currency-&gt;code('USD');
+    is($currency-&gt;code, 'USD', 'code set');
+};
+
+
+## throw exception when bad currency code is set
+{
+    my $currency = Handel::Currency-&gt;new(1.23);
 
     try {
-        $currency-&gt;convert('USD', 'JUNK');
+        local $ENV{'LANG'} = 'en';
 
-        fail;
+        $currency-&gt;code('BAD');
+
+        fail('no exception thrown');
     } catch Handel::Exception::Argument with {
-        pass;
+        pass('Argument exception thrown');
+        like(shift, qr/currency code/i, 'currency code in message');
     } otherwise {
-        fail;
+        fail('Other exception thrown');
     };
+};
 
-    is($currency-&gt;convert('USD', 'USD'), undef);
-    ok($currency-&gt;convert('USD', 'CAD'));
 
-    {
-        local $ENV{'HandelCurrencyCode'} = 'CAD';
-        is($currency-&gt;convert(undef, 'CAD'), undef);
-        ok($currency-&gt;convert(undef, 'USD'));
-    }
+## throw exception when bad currency code is set in ENV and pulled into format
+{
+    my $currency = Handel::Currency-&gt;new(1.23);
+
+    try {
+        local $ENV{'LANG'} = 'en';
+        local $ENV{'HandelCurrencyCode'} = 'BAD';
+
+        $currency-&gt;stringify;
+
+        fail('no exception thrown');
+    } catch Handel::Exception::Argument with {
+        pass('Argument exception thrown');
+        like(shift, qr/currency code/i, 'currency code in message');
+    } otherwise {
+        my $E = shift;
+        diag $E;
+        diag ref $E;
+        fail('Other exception thrown');
+    };
 };
 
-SKIP: {
-    eval 'use Locale::Currency';
-    skip 'Locale::Currency not installed', 4 if $@;
 
-    my $currency = Handel::Currency-&gt;new(1);
-    isa_ok($currency, 'Handel::Currency');
-    is($currency, 1);
+## throw exception when bad currency code is set in Defaults and pulled into format
+{
+    my $currency = Handel::Currency-&gt;new(1.23);
 
     try {
-        $currency-&gt;convert('ZZZ', 'CAD');
+        local $ENV{'LANG'} = 'en';
+        local $ENV{'HandelCurrencyCode'} = '';
+        local $Handel::ConfigReader::DEFAULTS{'HandelCurrencyCode'} = 'BAD';
+
+        $currency-&gt;stringify;
 
-        fail;
+        fail('no exception thrown');
     } catch Handel::Exception::Argument with {
-        pass;
+        pass('Argument exception thrown');
+        like(shift, qr/currency code/i, 'currency code in message');
     } otherwise {
-        fail;
+        fail('Other exception thrown');
     };
+};
+
+
+## throw exception when no code is set during format
+{
+    my $currency = Handel::Currency-&gt;new(1.23);
 
     try {
-        $currency-&gt;convert('USD', 'ZZZ');
+        local $ENV{'LANG'} = 'en';
+        local $ENV{'HandelCurrencyCode'} = '';
+        local $Handel::ConfigReader::DEFAULTS{'HandelCurrencyCode'} = '';
+
+        $currency-&gt;stringify;
 
-        fail;
+        fail('no exception thrown');
     } catch Handel::Exception::Argument with {
-        pass;
+        pass('Argument exception thrown');
+        like(shift, qr/currency code/i, 'currency code in message');
     } otherwise {
-        fail;
+        fail('Other exception thrown');
     };
 };
 
+
+## format using stock default
+{
+    local $ENV{'HandelCurrencyFormat'} = '';
+
+    my $currency = Handel::Currency-&gt;new(1.23, 'CAD');
+    isa_ok($currency, 'Handel::Currency');
+    is($currency-&gt;value, 1.23, 'value was set');
+    is($currency-&gt;stringify, '1.23 CAD', 'stringify to default');
+    is($currency-&gt;code, 'CAD', 'code was set');
+    is($currency-&gt;format, 'FMT_STANDARD', 'format is not set');
+    is($currency-&gt;converter, undef, 'converter not defined');
+};
+
+
+## format using altered default
+{
+    local $ENV{'HandelCurrencyFormat'} = '';
+    local $Handel::ConfigReader::DEFAULTS{'HandelCurrencyFormat'} = 'FMT_SYMBOL';
+
+    my $currency = Handel::Currency-&gt;new(1.23, 'CAD');
+    isa_ok($currency, 'Handel::Currency');
+    is($currency-&gt;value, 1.23, 'value was set');
+    is($currency-&gt;stringify, '$1.23', 'stringify to value');
+    is($currency-&gt;code, 'CAD', 'code was set');
+    is($currency-&gt;format, 'FMT_SYMBOL', 'format is not set');
+    is($currency-&gt;converter, undef, 'converter not defined');
+};
+
+
+## format using object format
+{
+    local $ENV{'HandelCurrencyFormat'} = '';
+    local $Handel::ConfigReader::DEFAULTS{'HandelCurrencyFormat'} = 'FMT_SYMBOL';
+
+    my $currency = Handel::Currency-&gt;new(1.23, 'CAD', 'FMT_HTML');
+    isa_ok($currency, 'Handel::Currency');
+    is($currency-&gt;value, 1.23, 'value was set');
+    is($currency-&gt;stringify, '&amp;#x0024;1.23', 'got object default format');
+    is($currency-&gt;code, 'CAD', 'code was set');
+    is($currency-&gt;format, 'FMT_HTML', 'format was set');
+    is($currency-&gt;converter, undef, 'converter not defined');
+};
+
+
+## format using object format as value instead of string
+{
+    local $ENV{'HandelCurrencyFormat'} = '';
+    local $Handel::ConfigReader::DEFAULTS{'HandelCurrencyFormat'} = 'FMT_SYMBOL';
+
+    my $currency = Handel::Currency-&gt;new(1.23, 'CAD', 0x0010);
+    isa_ok($currency, 'Handel::Currency');
+    is($currency-&gt;value, 1.23, 'value was set');
+    is($currency-&gt;stringify, '&amp;#x0024;1.23', 'got object default format');
+    is($currency-&gt;code, 'CAD', 'code was set');
+    is($currency-&gt;format, 0x0010, 'format was set');
+    is($currency-&gt;converter, undef, 'converter not defined');
+};
+
+
+## format using format param
+{
+    local $ENV{'HandelCurrencyFormat'} = '';
+    local $Handel::ConfigReader::DEFAULTS{'HandelCurrencyFormat'} = 'FMT_SYMBOL';
+
+    my $currency = Handel::Currency-&gt;new(1.23, 'CAD');
+    isa_ok($currency, 'Handel::Currency');
+    is($currency-&gt;value, 1.23, 'value was set');
+    is($currency-&gt;stringify('FMT_HTML'), '&amp;#x0024;1.23', 'got param format');
+    is($currency-&gt;code, 'CAD', 'code was set');
+    is($currency-&gt;format, 'FMT_SYMBOL', 'format is not set');
+    is($currency-&gt;converter, undef, 'converter not defined');
+};
+
+
+## format using format param as value instead of string
+{
+    local $ENV{'HandelCurrencyFormat'} = '';
+    local $Handel::ConfigReader::DEFAULTS{'HandelCurrencyFormat'} = 'FMT_SYMBOL';
+
+    my $currency = Handel::Currency-&gt;new(1.23, 'CAD');
+    isa_ok($currency, 'Handel::Currency');
+    is($currency-&gt;value, 1.23, 'value was set');
+    is($currency-&gt;stringify(0x0010), '&amp;#x0024;1.23', 'got param format');
+    is($currency-&gt;code, 'CAD', 'code was set');
+    is($currency-&gt;format,'FMT_SYMBOL', 'format is not set');
+    is($currency-&gt;converter, undef, 'converter not defined');
+};
+
+
+## format using no format (Local::Currency::Format defaults)
+{
+    local $ENV{'HandelCurrencyFormat'} = '';
+    local $Handel::ConfigReader::DEFAULTS{'HandelCurrencyFormat'} = '';
+
+    my $currency = Handel::Currency-&gt;new(1.23, 'CAD');
+    isa_ok($currency, 'Handel::Currency');
+    is($currency-&gt;value, 1.23, 'value was set');
+    is($currency-&gt;stringify, '$1.23', 'got object default format');
+    is($currency-&gt;code, 'CAD', 'code was set');
+    is($currency-&gt;format, undef, 'format is not set');
+    is($currency-&gt;converter, undef, 'converter not defined');
+};
+
+
+## get name
+{
+    local $ENV{'HandelCurrencyFormat'} = '';
+    local $Handel::ConfigReader::DEFAULTS{'HandelCurrencyFormat'} = '';
+
+    my $currency = Handel::Currency-&gt;new(1.23, 'USD');
+    isa_ok($currency, 'Handel::Currency');
+    is($currency-&gt;code, 'USD', 'code was set');
+    is($currency-&gt;name, 'US Dollar', 'got name');
+};
+
+
+## get name with code from ENV
+{
+    local $ENV{'HandelCurrencyCode'} = 'USD';
+    local $Handel::ConfigReader::DEFAULTS{'HandelCurrencyCode'} = '';
+
+    my $currency = Handel::Currency-&gt;new(1.23);
+    isa_ok($currency, 'Handel::Currency');
+    is($currency-&gt;code, 'USD', 'code is not set');
+    is($currency-&gt;name, 'US Dollar', 'got name');
+};
+
+
+## throw exception when code is set for name
+{
+    my $currency = Handel::Currency-&gt;new(1.23);
+
+    try {
+        local $ENV{'LANG'} = 'en';
+        local $ENV{'HandelCurrencyCode'} = '';
+        local $Handel::ConfigReader::DEFAULTS{'HandelCurrencyCode'} = '';
+
+        $currency-&gt;name;
+
+        fail('no exception thrown');
+    } catch Handel::Exception::Argument with {
+        pass('Argument exception thrown');
+        like(shift, qr/currency code/i, 'currency code in message');
+    } otherwise {
+        fail('Other exception thrown');
+    };
+};
+
+
+## throw exception when converter_class can't be loaded
+{
+    try {
+        local $ENV{'LANG'} = 'en';
+        Handel::Currency-&gt;converter_class('Bogus');
+
+        fail('no exception thrown');
+    } catch Handel::Exception with {
+        pass('Exception thrown');
+        like(shift, qr/bogus could not be loaded/i, 'class not loaded in message');
+    } otherwise {
+        my $E = shift;
+        diag $E;
+        diag ref $E;
+        fail('Other exception thrown');
+    };
+};
+
+
+## test convert
 SKIP: {
-    eval 'use Locale::Currency';
-    eval 'use Finance::Currency::Convert::WebserviceX 0.03' if !$@;
-    eval 'use Locale::Currency::Format' if !$@;
-    skip 'Format and Convert not installed', 4 if $@;
+    eval 'use Test::MockObject 1.07';
+    skip 'Test::MockObject 1.07 not installed', 46 if $@;
+
+
+    ## convert with code
+    {
+        my $currency = Handel::Currency-&gt;new(1.23, 'USD');
+        isa_ok($currency, 'Handel::Currency');
+        is($currency-&gt;value, 1.23, 'value was set');
+        is($currency-&gt;stringify, '1.23 USD', 'stringify to value');
+        is($currency-&gt;code, 'USD', 'code is set');
+        is($currency-&gt;format, 'FMT_STANDARD', 'format is not set');
+        is($currency-&gt;converter, undef, 'converter not defined');
+
+        my $converted = $currency-&gt;convert('CAD');
+        isa_ok($currency-&gt;converter, 'Finance::Currency::Convert::WebserviceX');
+        isa_ok($converted, 'Handel::Currency');
+        is($converted-&gt;value, 2.23, 'value was set');
+        is($converted-&gt;stringify, '2.23 CAD', 'stringify to value');
+        is($converted-&gt;code, 'CAD', 'code is set');
+        is($converted-&gt;format, 'FMT_STANDARD', 'format is not set');
+    };
+
+
+    ## convert with code using ENV
+    {
+        local $ENV{'HandelCurrencyCode'} = 'USD';
+
+        my $currency = Handel::Currency-&gt;new(1.23);
+        isa_ok($currency, 'Handel::Currency');
+        is($currency-&gt;value, 1.23, 'value was set');
+        is($currency-&gt;stringify, '1.23 USD', 'stringify to value');
+        is($currency-&gt;code, 'USD', 'code is not set');
+        is($currency-&gt;format, 'FMT_STANDARD', 'format is not set');
+        is($currency-&gt;converter, undef, 'converter not defined');
+
+        my $converted = $currency-&gt;convert('CAD');
+        isa_ok($currency-&gt;converter, 'Finance::Currency::Convert::WebserviceX');
+        isa_ok($converted, 'Handel::Currency');
+        is($converted-&gt;value, 2.23, 'value was set');
+        is($converted-&gt;stringify, '2.23 CAD', 'stringify to value');
+        is($converted-&gt;code, 'CAD', 'code is set');
+        is($converted-&gt;format, 'FMT_STANDARD', 'format is not set');
+    };
+
+
+    ## test when converter returns nothing
+    {
+        Test::MockObject-&gt;fake_module('Finance::Currency::Convert::WebserviceX' =&gt; (
+            new =&gt; sub {return bless {}, shift},
+            convert =&gt; sub {}
+        ));
+
+        my $currency = Handel::Currency-&gt;new(1.23, 'USD');
+        my $converted = $currency-&gt;convert('CAD');
+        isa_ok($converted, 'Handel::Currency');
+        is($converted-&gt;value, 0, 'value is 0 when converter fails');
+        is($converted-&gt;stringify, '0.00 CAD', 'stringify to value');
+        is($converted-&gt;code, 'CAD', 'code is set');
+        is($converted-&gt;format, 'FMT_STANDARD', 'format is not set');
+    };
+
+
+    ## throw exception when no code is set during convert
+    {
+        my $currency = Handel::Currency-&gt;new(1.23);
+
+        try {
+            local $ENV{'LANG'} = 'en';
+            local $ENV{'HandelCurrencyCode'} = '';
+            local $Handel::ConfigReader::DEFAULTS{'HandelCurrencyCode'} = '';
+
+            $currency-&gt;convert('CAD');
+
+            fail('no exception thrown');
+        } catch Handel::Exception::Argument with {
+            pass('Argument exception thrown');
+            like(shift, qr/currency code/i, 'currency code in message');
+        } otherwise {
+            fail('Other exception thrown');
+        };
+    };
+
+
+    ## throw exception when no code is passed to convert
+    {
+        my $currency = Handel::Currency-&gt;new(1.23, 'USD');
+
+        try {
+            local $ENV{'LANG'} = 'en';
+
+            $currency-&gt;convert;
+
+            fail('no exception thrown');
+        } catch Handel::Exception::Argument with {
+            pass('Argument exception thrown');
+            like(shift, qr/currency code/i, 'currency code in message');
+        } otherwise {
+            fail('Other exception thrown');
+        };
+    };
+
+
+    ## throw exception when bad code is returned from code into convert
+    {
+        my $currency = Handel::Currency-&gt;new(1.23, 'USD');
+
+        try {
+            local $ENV{'LANG'} = 'en';
+
+            no warnings 'redefine';
+            local *Handel::Currency::code = sub {
+                return 'BOGUS';
+            };
+            
+            $currency-&gt;convert('CAD');
+
+            fail('no exception thrown');
+        } catch Handel::Exception::Argument with {
+            pass('Argument exception thrown');
+            like(shift, qr/currency code/i, 'currency code in message');
+        } otherwise {
+            fail('Other exception thrown');
+        };
+    };
+
+
+    ## return self if to is same as from
+    {
+        my $currency = Handel::Currency-&gt;new(1.23, 'USD');
+        isa_ok($currency, 'Handel::Currency');
+        is($currency-&gt;value, 1.23, 'value was set');
+        is($currency-&gt;stringify, '1.23 USD', 'stringify to value');
+        is($currency-&gt;code, 'USD', 'code is set');
+        is($currency-&gt;format, 'FMT_STANDARD', 'format is not set');
+        is($currency-&gt;converter, undef, 'converter not defined');
+
+        my $converted = $currency-&gt;convert('USD');
+        is($currency-&gt;converter, undef, 'converter not defined');
+        is(refaddr $converted, refaddr $currency, 'return self if codes are the same');
+        isa_ok($converted, 'Handel::Currency');
+        is($converted-&gt;value, 1.23, 'value was set');
+        is($converted-&gt;stringify, '1.23 USD', 'stringify to value');
+        is($converted-&gt;code, 'USD', 'code is set');
+        is($converted-&gt;format, 'FMT_STANDARD', 'format is not set');
+    };
+};
+
+
+## test loading of utf8
+{
+    local $] = 5.007999;
 
     my $currency = Handel::Currency-&gt;new(1.23);
     isa_ok($currency, 'Handel::Currency');
-    is($currency, 1.23);
+    is($currency-&gt;stringify, '1.23 USD', 'still got format');
+};
+
 
-    ok($currency-&gt;convert('USD', 'CAD', 1, 'FMT_STANDARD') =~ / CAD$/);
-    ok($currency-&gt;convert('USD', 'CAD', 0, 'FMT_STANDARD') !~ / CAD$/);
-};
\ No newline at end of file
+## set converter_class to nothing, and put it back
+{
+    Handel::Currency-&gt;converter_class(undef);
+    is(Handel::Currency-&gt;converter_class, 'Finance::Currency::Convert::WebserviceX', 'unset converter_class');
+
+    Handel::Currency-&gt;converter_class('Handel::Base');
+    is(Handel::Currency-&gt;converter_class, 'Handel::Base', 'set converter_class');
+
+    Handel::Currency-&gt;converter_class('CustomConverterClass');
+    is(Handel::Currency-&gt;converter_class, 'CustomConverterClass', 'set converter_class');
+};
+
+
+package CustomConverterClass;
+use strict;
+use warnings;
+
+BEGIN {
+    use base qw/Finance::Currency::Convert::WebserviceX/;
+};
+1;
\ No newline at end of file</diff>
      <filename>t/currency.t</filename>
    </modified>
    <modified>
      <diff>@@ -2,9 +2,10 @@
 # $Id$
 use strict;
 use warnings;
-use Test::More tests =&gt; 3;
 
 BEGIN {
+    use lib 't/lib';
+    use Handel::Test tests =&gt; 44;
     use_ok('Handel::Exception', qw(:try));
 };
 
@@ -13,13 +14,95 @@ BEGIN {
 {
     try {
         throw Handel::Exception::Argument(-text =&gt; 'foo');
+
+        fail('no exception thrown');
     } catch Handel::Exception with {
-        is(shift-&gt;text, 'foo')
+        pass('caught exception');
+        is(shift-&gt;text, 'foo', 'got foo message')
+    } otherwise {
+        fail('Other exception thrown');
     };
 
     try {
         throw Handel::Exception::Argument(-text =&gt; 'foo', -details =&gt; 'details');
+
+        fail('no exception thrown');
+    } catch Handel::Exception with {
+        pass('caught exception');
+        is($_[0]-&gt;text, 'foo: details', 'got foo message with details');
+        is($_[0]-&gt;details, 'details', 'details set');
+    } otherwise {
+        fail('Other exception thrown');
+    };
+};
+
+
+## get default text
+{
+    try {
+        local $ENV{'LANG'} = 'en';
+        throw Handel::Exception;
+
+        fail('no exception thrown');
+    } catch Handel::Exception with {
+        pass('caught exception');
+        like($_[0]-&gt;text, qr/unspecified/, 'unhandled exception in message');
+        is($_[0]-&gt;details, undef, 'details not set');
+    } otherwise {
+        fail('Other exception thrown');
+    };
+};
+
+
+## don't set details if it's a ref
+{
+    try {
+        local $ENV{'LANG'} = 'en';
+        throw Handel::Exception(-details =&gt; {foo =&gt; 'bar'});
+
+        fail('no exception thrown');
+    } catch Handel::Exception with {
+        pass('caught exception');
+        is($_[0]-&gt;text, 'An unspecified error has occurred', 'unhandled exception in message');
+        is_deeply($_[0]-&gt;details, {foo =&gt; 'bar'}, 'details still set');
+    } otherwise {
+        fail('Other exception thrown');
+    };
+};
+
+
+## set the results
+{
+    try {
+        local $ENV{'LANG'} = 'en';
+        throw Handel::Exception( -results =&gt; {foo =&gt; 'bar'});
+
+        fail('no exception thrown');
     } catch Handel::Exception with {
-        is(shift-&gt;text, 'foo: details')
+        pass('caught exception');
+        like($_[0]-&gt;text, qr/unspecified/, 'unhandled exception in message');
+        is($_[0]-&gt;details, undef, 'details not set');
+        is_deeply($_[0]-&gt;results, {foo =&gt; 'bar'}, 'results were set');
+    } otherwise {
+        fail('Other exception thrown');
     };
-};
\ No newline at end of file
+};
+
+
+## make sure everyone still works
+foreach (qw/Taglib Order Checkout Constraint Storage Validation Virtual/) {
+    my $class = &quot;Handel::Exception::$_&quot;;
+    try {
+        local $ENV{'LANG'} = 'en';
+        throw $class;
+
+        fail('no exception thrown');
+    } catch Handel::Exception with {
+        pass('caught exception');
+        isa_ok($_[0], 'Handel::Exception');
+        ok($_[0]-&gt;text, 'test is set');
+        is($_[0]-&gt;details, undef, 'details not set');
+    } otherwise {
+        fail('Other exception thrown');
+    };
+};</diff>
      <filename>t/exceptions.t</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;EF254990-53FB-46DA-8B8A-A287698D3E6A&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;2&quot; description=&quot;Description 1&quot; total=&quot;2.22&quot;/&gt;
 			&lt;/order:results&gt;
@@ -149,4 +149,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_currency_format.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -26,7 +26,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -48,7 +48,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order&gt;
 					&lt;count&gt;&lt;order:count/&gt;&lt;/count&gt;
@@ -99,4 +99,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_new.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -26,7 +26,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -48,7 +48,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order&gt;
 					&lt;order:add&gt;
@@ -120,4 +120,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_new_and_add.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -26,7 +26,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -48,7 +48,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order&gt;
 					&lt;order:add price=&quot;1.23&quot; quantity=&quot;2&quot; sku=&quot;NEWSKU123&quot;&gt;
@@ -117,4 +117,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_new_and_add_filtered.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -24,7 +24,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -46,7 +46,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order&gt;
 					&lt;count&gt;&lt;order:count/&gt;&lt;/count&gt;
@@ -97,4 +97,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_new_filtered.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 		&lt;/order:new&gt;
 		&lt;order:order id=&quot;1F5284C7-C4F3-4399-87DF-494E1CACD50B&quot;&gt;
 			&lt;order:results&gt;
@@ -95,4 +95,4 @@
 			&lt;/order:results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_new_minimal.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;
 				&lt;message&gt;Error creating order&lt;/message&gt;
 			&lt;/order:no-results&gt;
@@ -98,4 +98,4 @@
 			&lt;/order:results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_new_no_results_trigger.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order&gt;
 					&lt;count&gt;&lt;order:count/&gt;&lt;/count&gt;
@@ -169,4 +169,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_add.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order&gt;
 					&lt;count&gt;&lt;order:count/&gt;&lt;/count&gt;
@@ -166,4 +166,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_add_filtered.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add&gt;
 					&lt;order:description&gt;My New Item&lt;/order:description&gt;
@@ -201,4 +201,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_clear.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add&gt;
 					&lt;order:description&gt;My New Item&lt;/order:description&gt;
@@ -215,4 +215,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_delete.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add&gt;
 					&lt;order:description&gt;My New Item&lt;/order:description&gt;
@@ -214,4 +214,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_delete_filtered.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;
 				&lt;message&gt;Error creating order&lt;/message&gt;
 			&lt;/order:no-results&gt;
@@ -103,4 +103,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_filtered.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;EF254990-53FB-46DA-8B8A-A287698D3E64&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;52A5DFED-D018-409F-9E59-584ACA152725&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -122,4 +122,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_item.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;AFC8635B-89A2-4A09-9DC0-59DA2CDDF9F8&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;E6ECB392-FBFA-4BFB-B5EC-AB98CBDAE5FD&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -123,4 +123,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_item_filtered.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;14E451AF-198E-4043-BEA1-5D2058A7B96F&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;3BA3434A-183D-4E17-BA91-0EA15CD35F73&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -123,4 +123,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_item_filtered_no_results.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;18C9050C-1973-4A56-A7C6-F609BD204898&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;C2B8F092-2AAF-4D59-845F-2A119E4408B5&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -138,4 +138,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_item_update.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;251371DD-B19C-4D03-B0E7-6A828E5CA14E&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;2330BAA8-288B-4102-988E-BA1ABA0A5BE8&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -122,4 +122,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_items.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;8CB01B28-CF5A-4F4E-B7B7-CFF9F0ACA534&quot; sku=&quot;NEWSKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;46C2D004-4694-4C66-B901-8E2CEE6CB9FD&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -124,4 +124,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_items_filtered.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;A07077F7-C31D-44CD-B2E2-7AE7FA358C11&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;E0E20484-A9EE-4CCA-BF02-6E3F3D27EA9A&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -123,4 +123,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_items_filtered_no_results.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;E766EAC7-CB67-4BFC-A54F-592B1F029363&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;AC156B65-0779-4D96-AE72-CAB2E981F34E&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -137,4 +137,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_items_update.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;
 				&lt;message&gt;Error creating order&lt;/message&gt;
 			&lt;/order:no-results&gt;
@@ -114,7 +114,7 @@
 					&lt;order:billtofax&gt;U3-333-333-3333&lt;/order:billtofax&gt;
 					&lt;order:billtoemail&gt;Umendlefarg@gmail.com&lt;/order:billtoemail&gt;
 					&lt;order:comments&gt;UComments&lt;/order:comments&gt;
-					&lt;order:created&gt;U20050715T201234Z&lt;/order:created&gt;
+					&lt;order:created&gt;2005-07-17 20:12:34&lt;/order:created&gt;
 					&lt;order:handling&gt;8.96&lt;/order:handling&gt;
 					&lt;order:number&gt;O123456786&lt;/order:number&gt;
 					&lt;order:shipmethod&gt;UPS 2nd Day&lt;/order:shipmethod&gt;
@@ -136,7 +136,7 @@
 					&lt;order:subtotal&gt;37.96&lt;/order:subtotal&gt;
 					&lt;order:total&gt;37.96&lt;/order:total&gt;
 					&lt;order:tax&gt;6.67&lt;/order:tax&gt;
-					&lt;order:updated&gt;U20050716T201234Z&lt;/order:updated&gt;
+					&lt;order:updated&gt;2005-07-18 20:12:34&lt;/order:updated&gt;
 				&lt;/order:update&gt;
 				&lt;order&gt;
 					&lt;count&gt;&lt;order:count/&gt;&lt;/count&gt;
@@ -187,4 +187,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:order&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_order_update.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;&lt;message&gt;Error adding order&lt;/message&gt;&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 		&lt;order:new&gt;
@@ -66,7 +66,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -88,7 +88,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;&lt;message&gt;Error adding order&lt;/message&gt;&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 
@@ -143,4 +143,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;&lt;message&gt;Error adding order&lt;/message&gt;&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 		&lt;order:new&gt;
@@ -66,7 +66,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -88,7 +88,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;&lt;message&gt;Error adding order&lt;/message&gt;&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 		&lt;order:new&gt;
@@ -109,7 +109,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -131,7 +131,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;&lt;message&gt;Error adding order&lt;/message&gt;&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 
@@ -196,4 +196,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_add.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;&lt;message&gt;Error adding order&lt;/message&gt;&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 		&lt;order:new&gt;
@@ -66,7 +66,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -88,7 +88,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;&lt;message&gt;Error adding order&lt;/message&gt;&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 		&lt;order:new&gt;
@@ -109,7 +109,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -131,7 +131,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;&lt;message&gt;Error adding order&lt;/message&gt;&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 
@@ -193,4 +193,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_add_filtered.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add&gt;
 					&lt;order:description&gt;My New Item&lt;/order:description&gt;
@@ -124,7 +124,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -146,7 +146,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add&gt;
 					&lt;order:description&gt;My New Item&lt;/order:description&gt;
@@ -262,4 +262,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_clear.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add&gt;
 					&lt;order:description&gt;My New Item&lt;/order:description&gt;
@@ -92,7 +92,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -114,7 +114,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add&gt;
 					&lt;order:description&gt;My New Item&lt;/order:description&gt;
@@ -200,4 +200,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_delete.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add&gt;
 					&lt;order:description&gt;My New Item&lt;/order:description&gt;
@@ -92,7 +92,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -114,7 +114,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add&gt;
 					&lt;order:description&gt;My New Item&lt;/order:description&gt;
@@ -198,4 +198,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_delete_filtered.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;&lt;message&gt;Error adding order&lt;/message&gt;&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 		&lt;order:new&gt;
@@ -66,7 +66,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -88,7 +88,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;&lt;message&gt;Error adding order&lt;/message&gt;&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 		&lt;order:new&gt;
@@ -109,7 +109,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -131,7 +131,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;&lt;message&gt;Error adding order&lt;/message&gt;&lt;/order:no-results&gt;
 		&lt;/order:new&gt;
 
@@ -187,4 +187,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_filtered.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;F22226DF-8B5D-496D-95BC-5134B39ED797&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;D4755257-AC3D-47AC-9F04-B17F5F5B11E9&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -72,7 +72,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -94,7 +94,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;E7C40FA5-5C34-4174-B63F-A9EF595E4AEF&quot; sku=&quot;SKU3&quot; price=&quot;3.33&quot; quantity=&quot;3&quot; description=&quot;Description 3&quot; total=&quot;9.99&quot;/&gt;
 				&lt;order:add id=&quot;32CB33D2-B2F5-41F6-BB81-C5C7E05D9F3A&quot; sku=&quot;SKU4&quot; price=&quot;4.44&quot; quantity=&quot;4&quot; description=&quot;Description 4&quot; total=&quot;16.64&quot;/&gt;
@@ -171,4 +171,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_item.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;98D2FCE0-CEB6-4464-8CE4-FBC9D71AC4A4&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;1A43BAF1-AFDF-4E92-AFA1-8C4EFE61B399&quot; sku=&quot;FILTERSKU1&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -72,7 +72,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -94,7 +94,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;D454144C-0E1A-4BF5-BE6F-C3D26AE01EBE&quot; sku=&quot;SKU3&quot; price=&quot;3.33&quot; quantity=&quot;3&quot; description=&quot;Description 3&quot; total=&quot;9.99&quot;/&gt;
 				&lt;order:add id=&quot;6DE112DE-0EB6-49C3-B292-B522463B5E07&quot; sku=&quot;FILTERSKU2&quot; price=&quot;4.44&quot; quantity=&quot;4&quot; description=&quot;Description 4&quot; total=&quot;16.61&quot;/&gt;
@@ -172,4 +172,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_item_filtered.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;1A29F1FE-A889-4B2B-8863-95448EFA37F9&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;E371A091-5879-4BF9-81F7-FC431193F29B&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -72,7 +72,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -94,7 +94,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;5EACD7B1-4966-4507-AF61-92D0FA319515&quot; sku=&quot;SKU3&quot; price=&quot;3.33&quot; quantity=&quot;3&quot; description=&quot;Description 3&quot; total=&quot;9.99&quot;/&gt;
 				&lt;order:add id=&quot;17837E8E-E386-4BB5-8857-C9B53BF15F7B&quot; sku=&quot;SKU4&quot; price=&quot;4.44&quot; quantity=&quot;4&quot; description=&quot;Description 4&quot; total=&quot;17.76&quot;/&gt;
@@ -172,4 +172,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_item_filtered_no_results.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;8DC05B6C-9B24-43F1-B2C4-20B49C65CA01&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 			&lt;/order:results&gt;
@@ -71,7 +71,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -93,7 +93,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;50247962-98B2-4272-BBD4-4023FB77A8AE&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
 			&lt;/order:results&gt;
@@ -184,4 +184,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_item_update.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;0D07A9B2-BA0C-4942-94D0-D96DCA3389DB&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;C7DAE698-5ABB-4212-976A-8006CCBD7D36&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -72,7 +72,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -94,7 +94,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;A31CBE50-87CA-450C-9439-223167B7904D&quot; sku=&quot;SKU3&quot; price=&quot;3.33&quot; quantity=&quot;3&quot; description=&quot;Description 3&quot; total=&quot;9.99&quot;/&gt;
 				&lt;order:add id=&quot;5E5DADE4-33D8-474D-8362-2A92327FF184&quot; sku=&quot;SKU4&quot; price=&quot;4.44&quot; quantity=&quot;4&quot; description=&quot;Description 4&quot; total=&quot;17.76&quot;/&gt;
@@ -171,4 +171,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_items.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;93B9A497-9FEE-4C87-A204-C822A4959682&quot; sku=&quot;FILTERSKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;877246AF-96D3-4C28-BBF1-B8673278BD9C&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -73,7 +73,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -95,7 +95,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;07D7181B-70F4-4F2C-BF10-0C554D0F7A0C&quot; sku=&quot;FILTERSKU3&quot; price=&quot;4.44&quot; quantity=&quot;4&quot; description=&quot;Description 4&quot; total=&quot;17.76&quot;/&gt;
 				&lt;order:add id=&quot;30D35F53-4958-477D-9450-3A6C9FEDA856&quot; sku=&quot;SKU5&quot; price=&quot;5.55&quot; quantity=&quot;5&quot; description=&quot;Description 5&quot; total=&quot;25.50&quot;/&gt;
@@ -174,4 +174,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_items_filtered.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;9108720A-7DD1-43E8-80F0-499205BBC0AD&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;6DAF3A43-40BC-4BD2-8870-2634D70CBE19&quot; sku=&quot;FILTERSKU1&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -72,7 +72,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -94,7 +94,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;9D7FA3F4-14B4-4F8A-8B73-1ED8F4F73C59&quot; sku=&quot;SKU3&quot; price=&quot;3.33&quot; quantity=&quot;3&quot; description=&quot;Description 3&quot; total=&quot;9.99&quot;/&gt;
 				&lt;order:add id=&quot;FEFFC372-1E72-4B68-BA28-2A9263496E7C&quot; sku=&quot;FILTERSKU2&quot; price=&quot;4.44&quot; quantity=&quot;4&quot; description=&quot;Description 4&quot; total=&quot;17.76&quot;/&gt;
@@ -172,4 +172,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_items_filtered_no_results.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;E72CC2DA-1C87-4A4D-9BD5-99B1D45DB301&quot; sku=&quot;SKU1&quot; price=&quot;1.11&quot; quantity=&quot;1&quot; description=&quot;Description 1&quot; total=&quot;1.11&quot;/&gt;
 				&lt;order:add id=&quot;0FB50961-6F51-4A6D-B224-B85BBCD8E357&quot; sku=&quot;SKU2&quot; price=&quot;2.22&quot; quantity=&quot;2&quot; description=&quot;Description 2&quot; total=&quot;4.44&quot;/&gt;
@@ -72,7 +72,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -94,7 +94,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:results&gt;
 				&lt;order:add id=&quot;DFDAB889-CB9A-4887-9FFF-7BF4BB81D5B0&quot; sku=&quot;SKU3&quot; price=&quot;3.33&quot; quantity=&quot;3&quot; description=&quot;Description 3&quot; total=&quot;9.99&quot;/&gt;
 				&lt;order:add id=&quot;118EB339-A5D5-4F3D-B5D7-62F5819D1CC8&quot; sku=&quot;SKU4&quot; price=&quot;4.44&quot; quantity=&quot;4&quot; description=&quot;Description 4&quot; total=&quot;17.76&quot;/&gt;
@@ -186,4 +186,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_items_update.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -23,7 +23,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -45,7 +45,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;
 				&lt;message&gt;Error creating order&lt;/message&gt;
 			&lt;/order:no-results&gt;
@@ -68,7 +68,7 @@
 			&lt;order:billtofax&gt;3-333-333-3333&lt;/order:billtofax&gt;
 			&lt;order:billtoemail&gt;mendlefarg@gmail.com&lt;/order:billtoemail&gt;
 			&lt;order:comments&gt;Comments&lt;/order:comments&gt;
-			&lt;order:created&gt;20050715T201234Z&lt;/order:created&gt;
+			&lt;order:created&gt;2005-07-15 20:12:34&lt;/order:created&gt;
 			&lt;order:handling&gt;8.95&lt;/order:handling&gt;
 			&lt;order:number&gt;O123456789&lt;/order:number&gt;
 			&lt;order:shipmethod&gt;UPS Ground&lt;/order:shipmethod&gt;
@@ -90,7 +90,7 @@
 			&lt;order:subtotal&gt;37.95&lt;/order:subtotal&gt;
 			&lt;order:total&gt;37.95&lt;/order:total&gt;
 			&lt;order:tax&gt;6.66&lt;/order:tax&gt;
-			&lt;order:updated&gt;20050716T201234Z&lt;/order:updated&gt;
+			&lt;order:updated&gt;2005-07-16 20:12:34&lt;/order:updated&gt;
 			&lt;order:no-results&gt;
 				&lt;message&gt;Error creating order&lt;/message&gt;
 			&lt;/order:no-results&gt;
@@ -159,7 +159,7 @@
 					&lt;order:billtofax&gt;U3-333-333-3333&lt;/order:billtofax&gt;
 					&lt;order:billtoemail&gt;Umendlefarg@gmail.com&lt;/order:billtoemail&gt;
 					&lt;order:comments&gt;UComments&lt;/order:comments&gt;
-					&lt;order:created&gt;U20050715T201234Z&lt;/order:created&gt;
+					&lt;order:created&gt;2005-07-17 20:12:34&lt;/order:created&gt;
 					&lt;order:handling&gt;8.96&lt;/order:handling&gt;
 					&lt;order:number&gt;O123456786&lt;/order:number&gt;
 					&lt;order:shipmethod&gt;UPS 2nd Day&lt;/order:shipmethod&gt;
@@ -181,7 +181,7 @@
 					&lt;order:subtotal&gt;37.96&lt;/order:subtotal&gt;
 					&lt;order:total&gt;37.96&lt;/order:total&gt;
 					&lt;order:tax&gt;6.67&lt;/order:tax&gt;
-					&lt;order:updated&gt;U20050716T201234Z&lt;/order:updated&gt;
+					&lt;order:updated&gt;2005-07-18 20:12:34&lt;/order:updated&gt;
 				&lt;/order:update&gt;
 				&lt;order&gt;
 					&lt;count&gt;&lt;order:count/&gt;&lt;/count&gt;
@@ -232,4 +232,4 @@
 			&lt;/order:no-results&gt;
 		&lt;/order:orders&gt;
 	&lt;/body&gt;
-&lt;/xsp:page&gt;
\ No newline at end of file
+&lt;/xsp:page&gt;</diff>
      <filename>t/htdocs/axkit/order_orders_update.xsp</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;5.55&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Line Item SKU 1&lt;/description&gt;
 			&lt;id&gt;11111111-1111-1111-1111-111111111111&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/checkout_order.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;handling&gt;8.95 USD&lt;/handling&gt;
 		&lt;handling&gt;8.95 CAD&lt;/handling&gt;
@@ -62,7 +62,7 @@
 		&lt;tax&gt;6.66 CAD&lt;/tax&gt;
 		&lt;tax&gt;&amp;amp;#x0024;6.66&lt;/tax&gt;
 		&lt;tax&gt;6.66 Canadian Dollar&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 1&lt;/description&gt;
 			&lt;id&gt;EF254990-53FB-46DA-8B8A-A287698D3E6A&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_currency_format.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,6 +42,6 @@
 		&lt;subtotal&gt;5.55&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_new.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -28,7 +28,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -50,6 +50,6 @@
 		&lt;subtotal&gt;5.55&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_new_and_add.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -28,7 +28,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -50,6 +50,6 @@
 		&lt;subtotal&gt;5.55&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_new_and_add_filtered.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,6 +42,6 @@
 		&lt;subtotal&gt;5.55&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_new_filtered.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,6 +42,6 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_new_minimal.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,6 +42,6 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_new_no_results_trigger.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,6 +42,6 @@
 		&lt;subtotal&gt;5.55&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 	&lt;addeditem&gt;
 		&lt;description&gt;My New Item&lt;/description&gt;
@@ -71,7 +71,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -93,6 +93,6 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_add.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 	&lt;addeditem&gt;
 		&lt;description&gt;My New Item&lt;/description&gt;
@@ -71,7 +71,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -93,6 +93,6 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_add_filtered.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
 		&lt;count&gt;1&lt;/count&gt;
@@ -63,7 +63,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -85,7 +85,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;0&lt;/count&gt;
 		&lt;id&gt;B0462540-0564-4E27-B9FD-C3985A227C49&lt;/id&gt;
 		&lt;shopper&gt;E24FF465-F485-477B-8565-FDF30BB4DE13&lt;/shopper&gt;
@@ -104,7 +104,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -126,6 +126,6 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_clear.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
 		&lt;count&gt;2&lt;/count&gt;
@@ -63,7 +63,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -85,7 +85,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;1&lt;/count&gt;
 		&lt;id&gt;B05779D0-6D40-4F0A-B6A3-1CC2193571C6&lt;/id&gt;
 		&lt;shopper&gt;D3D7C81D-3BA7-41E6-A8B8-34550CD6C793&lt;/shopper&gt;
@@ -104,7 +104,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -126,6 +126,6 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_delete.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 
 	&lt;order&gt;
@@ -64,7 +64,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -86,7 +86,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;1&lt;/count&gt;
 		&lt;id&gt;69B4404C-6346-4FFA-8D73-220F5D65A952&lt;/id&gt;
 		&lt;shopper&gt;126AA079-B6A9-440E-9B93-4C66CEBF37EB&lt;/shopper&gt;
@@ -105,7 +105,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -127,6 +127,6 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_delete_filtered.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,6 +42,6 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_filtered.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 1&lt;/description&gt;
 			&lt;id&gt;EF254990-53FB-46DA-8B8A-A287698D3E64&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_item.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 2&lt;/description&gt;
 			&lt;id&gt;E6ECB392-FBFA-4BFB-B5EC-AB98CBDAE5FD&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_item_filtered.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;message&gt;Order item not found&lt;/message&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_item_filtered_no_results.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 1&lt;/description&gt;
 			&lt;id&gt;18C9050C-1973-4A56-A7C6-F609BD204898&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_item_update.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 1&lt;/description&gt;
 			&lt;id&gt;251371DD-B19C-4D03-B0E7-6A828E5CA14E&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_items.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 2&lt;/description&gt;
 			&lt;id&gt;46C2D004-4694-4C66-B901-8E2CEE6CB9FD&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_items_filtered.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;message&gt;Order item not found&lt;/message&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_items_filtered_no_results.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 1&lt;/description&gt;
 			&lt;id&gt;E766EAC7-CB67-4BFC-A54F-592B1F029363&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_items_update.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
 		&lt;count&gt;0&lt;/count&gt;
@@ -63,7 +63,7 @@
 		&lt;billtofax&gt;U3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;Umendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;UComments&lt;/comments&gt;
-		&lt;created&gt;U20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-17T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.96&lt;/handling&gt;
 		&lt;number&gt;O123456786&lt;/number&gt;
 		&lt;shipmethod&gt;UPS 2nd Day&lt;/shipmethod&gt;
@@ -85,6 +85,6 @@
 		&lt;subtotal&gt;37.96&lt;/subtotal&gt;
 		&lt;total&gt;37.96&lt;/total&gt;
 		&lt;tax&gt;6.67&lt;/tax&gt;
-		&lt;updated&gt;U20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-18T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_order_update.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
 		&lt;count&gt;0&lt;/count&gt;
@@ -63,7 +63,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -85,6 +85,6 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;1&lt;/count&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
@@ -64,7 +64,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -86,7 +86,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;1&lt;/count&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
@@ -108,7 +108,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -130,7 +130,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;1&lt;/count&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_add.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;1&lt;/count&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
@@ -64,7 +64,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -86,7 +86,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;1&lt;/count&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
@@ -108,7 +108,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -130,7 +130,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;1&lt;/count&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_add_filtered.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
 		&lt;count&gt;1&lt;/count&gt;
@@ -63,7 +63,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -85,7 +85,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
 		&lt;count&gt;1&lt;/count&gt;
@@ -106,7 +106,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -128,7 +128,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;0&lt;/count&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
@@ -150,7 +150,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -172,7 +172,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;0&lt;/count&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_clear.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;1&lt;/count&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
@@ -64,7 +64,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -86,7 +86,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;1&lt;/count&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_delete.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;1&lt;/count&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
@@ -64,7 +64,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -86,7 +86,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;count&gt;1&lt;/count&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_delete_filtered.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
 		&lt;count&gt;0&lt;/count&gt;
@@ -63,7 +63,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -85,6 +85,6 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_filtered.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 1&lt;/description&gt;
 			&lt;id&gt;F22226DF-8B5D-496D-95BC-5134B39ED797&lt;/id&gt;
@@ -71,7 +71,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -93,7 +93,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 3&lt;/description&gt;
 			&lt;id&gt;E7C40FA5-5C34-4174-B63F-A9EF595E4AEF&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_item.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 2&lt;/description&gt;
 			&lt;id&gt;1A43BAF1-AFDF-4E92-AFA1-8C4EFE61B399&lt;/id&gt;
@@ -71,7 +71,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -93,7 +93,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 4&lt;/description&gt;
 			&lt;id&gt;6DE112DE-0EB6-49C3-B292-B522463B5E07&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_item_filtered.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;message&gt;Your order is empty&lt;/message&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
@@ -64,7 +64,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -86,7 +86,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;message&gt;Your order is empty&lt;/message&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_item_filtered_no_results.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 1&lt;/description&gt;
 			&lt;id&gt;8DC05B6C-9B24-43F1-B2C4-20B49C65CA01&lt;/id&gt;
@@ -79,7 +79,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -101,7 +101,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 2&lt;/description&gt;
 			&lt;id&gt;50247962-98B2-4272-BBD4-4023FB77A8AE&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_item_update.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 1&lt;/description&gt;
 			&lt;id&gt;0D07A9B2-BA0C-4942-94D0-D96DCA3389DB&lt;/id&gt;
@@ -79,7 +79,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -101,7 +101,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 3&lt;/description&gt;
 			&lt;id&gt;A31CBE50-87CA-450C-9439-223167B7904D&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_items.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 1&lt;/description&gt;
 			&lt;id&gt;93B9A497-9FEE-4C87-A204-C822A4959682&lt;/id&gt;
@@ -79,7 +79,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -101,7 +101,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 4&lt;/description&gt;
 			&lt;id&gt;07D7181B-70F4-4F2C-BF10-0C554D0F7A0C&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_items_filtered.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;message&gt;Your order is empty&lt;/message&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
@@ -64,7 +64,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -86,7 +86,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;message&gt;Your order is empty&lt;/message&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_items_filtered_no_results.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 1&lt;/description&gt;
 			&lt;id&gt;E72CC2DA-1C87-4A4D-9BD5-99B1D45DB301&lt;/id&gt;
@@ -95,7 +95,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -117,7 +117,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 		&lt;item&gt;
 			&lt;description&gt;Description 3&lt;/description&gt;
 			&lt;id&gt;DFDAB889-CB9A-4887-9FFF-7BF4BB81D5B0&lt;/id&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_items_update.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -20,7 +20,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -42,7 +42,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
 		&lt;count&gt;0&lt;/count&gt;
@@ -63,7 +63,7 @@
 		&lt;billtofax&gt;U3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;Umendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;UComments&lt;/comments&gt;
-		&lt;created&gt;U20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-17T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.96&lt;/handling&gt;
 		&lt;number&gt;O123456786&lt;/number&gt;
 		&lt;shipmethod&gt;UPS 2nd Day&lt;/shipmethod&gt;
@@ -85,7 +85,7 @@
 		&lt;subtotal&gt;37.96&lt;/subtotal&gt;
 		&lt;total&gt;37.96&lt;/total&gt;
 		&lt;tax&gt;6.67&lt;/tax&gt;
-		&lt;updated&gt;U20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-18T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
 		&lt;count&gt;0&lt;/count&gt;
@@ -106,7 +106,7 @@
 		&lt;billtofax&gt;3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;mendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;Comments&lt;/comments&gt;
-		&lt;created&gt;20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-15T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.95&lt;/handling&gt;
 		&lt;number&gt;O123456789&lt;/number&gt;
 		&lt;shipmethod&gt;UPS Ground&lt;/shipmethod&gt;
@@ -128,7 +128,7 @@
 		&lt;subtotal&gt;37.95&lt;/subtotal&gt;
 		&lt;total&gt;37.95&lt;/total&gt;
 		&lt;tax&gt;6.66&lt;/tax&gt;
-		&lt;updated&gt;20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-16T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 	&lt;order&gt;
 		&lt;count&gt;0&lt;/count&gt;
@@ -149,7 +149,7 @@
 		&lt;billtofax&gt;U3-333-333-3333&lt;/billtofax&gt;
 		&lt;billtoemail&gt;Umendlefarg@gmail.com&lt;/billtoemail&gt;
 		&lt;comments&gt;UComments&lt;/comments&gt;
-		&lt;created&gt;U20050715T201234Z&lt;/created&gt;
+		&lt;created&gt;2005-07-17T20:12:34&lt;/created&gt;
 		&lt;handling&gt;8.96&lt;/handling&gt;
 		&lt;number&gt;O123456786&lt;/number&gt;
 		&lt;shipmethod&gt;UPS 2nd Day&lt;/shipmethod&gt;
@@ -171,6 +171,6 @@
 		&lt;subtotal&gt;37.96&lt;/subtotal&gt;
 		&lt;total&gt;37.96&lt;/total&gt;
 		&lt;tax&gt;6.67&lt;/tax&gt;
-		&lt;updated&gt;U20050716T201234Z&lt;/updated&gt;
+		&lt;updated&gt;2005-07-18T20:12:34&lt;/updated&gt;
 	&lt;/order&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/axkit/out/order_orders_update.xsp.out</filename>
    </modified>
    <modified>
      <diff>@@ -14,17 +14,17 @@
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 	[% ELSE %]
 		&lt;message&gt;Error creating shopping cart&lt;/message&gt;
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		type =&gt; hcart.CART_TYPE_TEMP,
 		id 	 =&gt; '94FE4F12-4C1A-46E4-9DD5-3757555862A8'
-	})) %]
+	}).first) %]
 		[% IF (addeditem = cart.add({
 			description =&gt; 'My New Item',
 			id			=&gt; '9BE94446-ABB8-493D-9C8D-5177901B59D3',
@@ -35,10 +35,10 @@
 			&lt;addeditem&gt;
 				&lt;description&gt;[% addeditem.description %]&lt;/description&gt;
 				&lt;id&gt;[% addeditem.id %]&lt;/id&gt;
-				&lt;price&gt;[% addeditem.price %]&lt;/price&gt;
+				&lt;price&gt;[% addeditem.price.value %]&lt;/price&gt;
 				&lt;quantity&gt;[% addeditem.quantity %]&lt;/quantity&gt;
 				&lt;sku&gt;[% addeditem.sku %]&lt;/sku&gt;
-				&lt;total&gt;[% addeditem.total %]&lt;/total&gt;
+				&lt;total&gt;[% addeditem.total.value %]&lt;/total&gt;
 			&lt;/addeditem&gt;
 		[% ELSE %]
 			&lt;message&gt;New item not added&lt;/message&gt;
@@ -49,10 +49,10 @@
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 	[% ELSE %]
 		&lt;message&gt;Could not find cart&lt;/message&gt;
 	[% END %]
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/tt2/cart_add.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -23,30 +23,30 @@
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 	[% ELSE %]
 		&lt;message&gt;Error creating shopping cart&lt;/message&gt;
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		type =&gt; hcart.CART_TYPE_TEMP,
 		id	 =&gt; 'B0462540-0564-4E27-B9FD-C3985A227C49'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
-			[% cart.clear %]
+			[% CALL cart.clear %]
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 		&lt;/cart&gt;
 	[% ELSE %]
 		&lt;message&gt;Could not find cart&lt;/message&gt;
 	[% END %]
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/tt2/cart_clear.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -14,7 +14,7 @@
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 	[% ELSE %]</diff>
      <filename>t/htdocs/tt2/cart_create.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -19,10 +19,10 @@
 				&lt;item&gt;
 					&lt;description&gt;[% addeditem.description %]&lt;/description&gt;
 					&lt;id&gt;[% addeditem.id %]&lt;/id&gt;
-					&lt;price&gt;[% addeditem.price %]&lt;/price&gt;
+					&lt;price&gt;[% addeditem.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% addeditem.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% addeditem.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% addeditem.total %]&lt;/total&gt;
+					&lt;total&gt;[% addeditem.total.value %]&lt;/total&gt;
 				&lt;/item&gt;
 			[% ELSE %]
 				&lt;message&gt;Error adding cart item&lt;/message&gt;
@@ -32,7 +32,7 @@
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 	[% ELSE %]</diff>
      <filename>t/htdocs/tt2/cart_create_and_add.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -32,28 +32,28 @@
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 	[% ELSE %]
 		&lt;message&gt;Error creating shopping cart&lt;/message&gt;
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		type =&gt; hcart.CART_TYPE_TEMP,
 		id	 =&gt; 'B05779D0-6D40-4F0A-B6A3-1CC2193571C6'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 			[% CALL cart.delete({id =&gt; '2505E956-D5A6-47B0-AEB5-D19429FCA5FD'}) %]
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 		&lt;/cart&gt;
 	[% ELSE %]
 		&lt;message&gt;Could not find cart&lt;/message&gt;</diff>
      <filename>t/htdocs/tt2/cart_delete.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -1,14 +1,15 @@
 [%# $Id$ %]
-[% USE hcart  = Handel.Cart %]
+[% USE hcart = Handel.Cart %]
+[% carts = hcart.search %]
 &lt;body&gt;
-    [% FOREACH cart = hcart.fetch %]
+    [% WHILE (cart = carts.next) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 		&lt;/cart&gt;
     [% END %]</diff>
      <filename>t/htdocs/tt2/cart_fetch.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -1,14 +1,14 @@
 [%# $Id$ %]
 [% USE hcart  = Handel.Cart %]
 &lt;body&gt;
-    [% IF (cart = hcart.fetch(undef, hcart.RETURNAS_ARRAY)) %]
+    [% IF (cart = hcart.search.all) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.0.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.0.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.0.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.0.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.0.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.0.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.0.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.0.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 		&lt;cart&gt;
@@ -17,7 +17,7 @@
 			&lt;id&gt;[% cart.1.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.1.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.1.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.1.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.1.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.1.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 	[% ELSE %]</diff>
      <filename>t/htdocs/tt2/cart_fetch_as_array.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -1,7 +1,7 @@
 [%# $Id$ %]
 [% USE hcart  = Handel.Cart %]
 &lt;body&gt;
-    [% IF (carts = hcart.fetch(undef, hcart.RETURNAS_ITERATOR)) %]
+    [% IF (carts = hcart.search) %]
     	[% WHILE (cart = carts.next) %]
 			&lt;cart&gt;
 				&lt;count&gt;[% cart.count %]&lt;/count&gt;
@@ -9,7 +9,7 @@
 				&lt;id&gt;[% cart.id %]&lt;/id&gt;
 				&lt;name&gt;[% cart.name %]&lt;/name&gt;
 				&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-				&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+				&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 				&lt;type&gt;[% cart.type %]&lt;/type&gt;
 			&lt;/cart&gt;
 		[% END %]</diff>
      <filename>t/htdocs/tt2/cart_fetch_as_iterator.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,6 @@
 [%# $Id$ %]
 [% USE hcart  = Handel.Cart %]
+
 &lt;body&gt;
     [% UNLESS (cart = hcart.create({
 		description	=&gt; 'My New Shopping Cart',
@@ -11,20 +12,20 @@
 		&lt;message&gt;Error creating shopping cart&lt;/message&gt;
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		type =&gt; hcart.CART_TYPE_SAVED,
 		id 	 =&gt; 'D65692C4-B043-43A7-BFAA-D5326C099B71'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 	[% ELSE %]
 		&lt;message&gt;Could not find cart&lt;/message&gt;
 	[% END %]
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/tt2/cart_fetch_filtered.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -4,17 +4,17 @@
 	[% IF (cart = hcart.fetch({
 		type =&gt; hcart.CART_TYPE_SAVED,
 		id 	 =&gt; 'D65692C4-B043-43A7-BFAA-D5326C09C45D'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 	[% ELSE %]
 		&lt;message&gt;Could not find cart&lt;/message&gt;
 	[% END %]
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/tt2/cart_fetch_filtered_no_results.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -24,26 +24,27 @@
 		}) %]
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		type =&gt; hcart.CART_TYPE_TEMP,
 		id 	 =&gt; 'E516A609-1905-4C7B-AC82-C33D50DE7AB3'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
-			[% FOREACH item = cart.items %]
+			[% items = cart.items %]
+			[% WHILE (item = items.next) %]
 				&lt;item&gt;
 					&lt;description&gt;[% item.description %]&lt;/description&gt;
 					&lt;id&gt;[% item.id %]&lt;/id&gt;
-					&lt;price&gt;[% item.price %]&lt;/price&gt;
+					&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% item.total %]&lt;/total&gt;
+					&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 				&lt;/item&gt;
 			[% END %]
 		&lt;/cart&gt;</diff>
      <filename>t/htdocs/tt2/cart_items.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -24,34 +24,34 @@
 		}) %]
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		type =&gt; hcart.CART_TYPE_TEMP,
 		id 	 =&gt; 'E516A609-1905-4C7B-AC82-C33D50DE7AB7'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
-			[% IF (items = cart.items(undef, hcart.RETURNAS_ARRAY)) %]
+			[% IF (items = cart.items.all) %]
 				&lt;item&gt;
 					&lt;description&gt;[% items.0.description %]&lt;/description&gt;
 					&lt;id&gt;[% items.0.id %]&lt;/id&gt;
-					&lt;price&gt;[% items.0.price %]&lt;/price&gt;
+					&lt;price&gt;[% items.0.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% items.0.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% items.0.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% items.0.total %]&lt;/total&gt;
+					&lt;total&gt;[% items.0.total.value %]&lt;/total&gt;
 				&lt;/item&gt;
 				&lt;item&gt;
 					&lt;description&gt;[% items.1.description %]&lt;/description&gt;
 					&lt;id&gt;[% items.1.id %]&lt;/id&gt;
-					&lt;price&gt;[% items.1.price %]&lt;/price&gt;
+					&lt;price&gt;[% items.1.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% items.1.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% items.1.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% items.1.total %]&lt;/total&gt;
+					&lt;total&gt;[% items.1.total.value %]&lt;/total&gt;
 				&lt;/item&gt;
 			[% END %]
 		&lt;/cart&gt;</diff>
      <filename>t/htdocs/tt2/cart_items_as_array.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -24,27 +24,27 @@
 		}) %]
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		type =&gt; hcart.CART_TYPE_TEMP,
 		id 	 =&gt; 'E516A609-1905-4C7B-AC82-C33D50DE7AB9'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
-			[% IF (items = cart.items(undef, hcart.RETURNAS_ITERATOR)) %]
+			[% IF (items = cart.items) %]
 				[% WHILE (item = items.next) %]
 					&lt;item&gt;
 						&lt;description&gt;[% item.description %]&lt;/description&gt;
 						&lt;id&gt;[% item.id %]&lt;/id&gt;
-						&lt;price&gt;[% item.price %]&lt;/price&gt;
+						&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 						&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 						&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-						&lt;total&gt;[% item.total %]&lt;/total&gt;
+						&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 					&lt;/item&gt;
 				[% END %]
 			[% END %]</diff>
      <filename>t/htdocs/tt2/cart_items_as_iterator.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -33,30 +33,31 @@
 		&lt;message&gt;Error creating shopping cart&lt;/message&gt;
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		type =&gt; hcart.CART_TYPE_TEMP,
 		id 	 =&gt; 'FBC4A843-2667-48ED-AA9F-EF4B52537E72'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
-			[% FOREACH item = cart.items({sku =&gt; 'SKU%'}) %]
+			[% items = cart.items({sku =&gt; 'SKU%'}) %]
+			[% WHILE (item = items.next) %]
 				&lt;item&gt;
 					&lt;description&gt;[% item.description %]&lt;/description&gt;
 					&lt;id&gt;[% item.id %]&lt;/id&gt;
-					&lt;price&gt;[% item.price %]&lt;/price&gt;
+					&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% item.total %]&lt;/total&gt;
+					&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 				&lt;/item&gt;
 			[% END %]
 		&lt;/cart&gt;
 	[% ELSE %]
 		&lt;message&gt;Could not find cart&lt;/message&gt;
 	[% END %]
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/tt2/cart_items_filtered.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -26,27 +26,28 @@
 		&lt;message&gt;Error creating shopping cart&lt;/message&gt;
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		type =&gt; hcart.CART_TYPE_TEMP,
 		id 	 =&gt; '89C8C2E3-3170-4E9D-81DC-9E572E102FB8'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
-			[% IF (items = cart.items({sku =&gt; 'FOO%'})) %]
-				[% FOREACH item IN items %]
+			[% items = cart.items({sku =&gt; 'FOO%'}) %]
+			[% IF items.count %]
+				[% WHILE (item = items.next) %]
 					&lt;item&gt;
 						&lt;description&gt;[% item.description %]&lt;/description&gt;
 						&lt;id&gt;[% item.id %]&lt;/id&gt;
-						&lt;price&gt;[% item.price %]&lt;/price&gt;
+						&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 						&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 						&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-						&lt;total&gt;[% item.total %]&lt;/total&gt;
+						&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 					&lt;/item&gt;
 				[% END %]
 			[% ELSE %]</diff>
      <filename>t/htdocs/tt2/cart_items_filtered_no_results.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -26,26 +26,26 @@
 		&lt;message&gt;Error creating shopping cart&lt;/message&gt;
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		type =&gt; hcart.CART_TYPE_TEMP,
 		id 	 =&gt; '6509982B-14B3-4AB0-8DEB-B5160B115521'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
-			[% FOREACH item = cart.items %]
+			[% FOREACH item = cart.items.all %]
 				&lt;item&gt;
 					&lt;description&gt;[% item.description %]&lt;/description&gt;
 					&lt;id&gt;[% item.id %]&lt;/id&gt;
-					&lt;price&gt;[% item.price %]&lt;/price&gt;
+					&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% item.total %]&lt;/total&gt;
+					&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 				&lt;/item&gt;
 				[% CALL item.description('My Updated Item') %]
 				[% CALL item.price(10.13) %]
@@ -54,13 +54,13 @@
 				&lt;updateditem&gt;
 					&lt;description&gt;[% item.description %]&lt;/description&gt;
 					&lt;id&gt;[% item.id %]&lt;/id&gt;
-					&lt;price&gt;[% item.price %]&lt;/price&gt;
+					&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% item.total %]&lt;/total&gt;
+					&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 				&lt;/updateditem&gt;
 			[% END %]
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 		&lt;/cart&gt;
 	[% ELSE %]
 		&lt;message&gt;Could not find cart&lt;/message&gt;</diff>
      <filename>t/htdocs/tt2/cart_items_update.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -50,37 +50,37 @@
 		&lt;message&gt;Error adding cart&lt;/message&gt;
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		id 	 =&gt; '76DFA8B1-644A-44C5-B545-7D0BAE09313D'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
-			[% FOREACH item = cart.items %]
+			[% FOREACH item = cart.items.all %]
 				&lt;item&gt;
 					&lt;description&gt;[% item.description %]&lt;/description&gt;
 					&lt;id&gt;[% item.id %]&lt;/id&gt;
-					&lt;price&gt;[% item.price %]&lt;/price&gt;
+					&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% item.total %]&lt;/total&gt;
+					&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 				&lt;/item&gt;
 			[% END %]
 			[% CALL cart.restore({id =&gt; 'CB2787E4-FC6B-48C8-A76D-F64AA9EC48CF'}, hcart.CART_MODE_APPEND) %]
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
-			[% FOREACH item = cart.items %]
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
+			[% FOREACH item = cart.items.all %]
 				&lt;restoreditem&gt;
 					&lt;description&gt;[% item.description %]&lt;/description&gt;
-					&lt;price&gt;[% item.price %]&lt;/price&gt;
+					&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% item.total %]&lt;/total&gt;
+					&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 				&lt;/restoreditem&gt;
 			[% END %]
 		&lt;/cart&gt;</diff>
      <filename>t/htdocs/tt2/cart_restore_append.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -50,37 +50,37 @@
 		&lt;message&gt;Error adding cart&lt;/message&gt;
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		id 	 =&gt; '32EAE1FC-FAD1-4C58-8826-5B9064DE0D63'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
-			[% FOREACH item = cart.items %]
+			[% FOREACH item = cart.items.all %]
 				&lt;item&gt;
 					&lt;description&gt;[% item.description %]&lt;/description&gt;
 					&lt;id&gt;[% item.id %]&lt;/id&gt;
-					&lt;price&gt;[% item.price %]&lt;/price&gt;
+					&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% item.total %]&lt;/total&gt;
+					&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 				&lt;/item&gt;
 			[% END %]
 			[% CALL cart.restore({id =&gt; '01B9CE36-B18D-4D30-A860-DB54993D4F80'}, hcart.CART_MODE_MERGE) %]
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
-			[% FOREACH item = cart.items %]
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
+			[% FOREACH item = cart.items.all %]
 				&lt;restoreditem&gt;
 					&lt;description&gt;[% item.description %]&lt;/description&gt;
-					&lt;price&gt;[% item.price %]&lt;/price&gt;
+					&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% item.total %]&lt;/total&gt;
+					&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 				&lt;/restoreditem&gt;
 			[% END %]
 		&lt;/cart&gt;</diff>
      <filename>t/htdocs/tt2/cart_restore_merge.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -50,39 +50,39 @@
 		&lt;message&gt;Error adding cart&lt;/message&gt;
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		id 	 =&gt; '6ACAB02E-502D-440A-B4EB-A354E6F0C2D6'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
-			[% FOREACH item = cart.items %]
+			[% FOREACH item = cart.items.all %]
 				&lt;item&gt;
 					&lt;description&gt;[% item.description %]&lt;/description&gt;
 					&lt;id&gt;[% item.id %]&lt;/id&gt;
-					&lt;price&gt;[% item.price %]&lt;/price&gt;
+					&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% item.total %]&lt;/total&gt;
+					&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 				&lt;/item&gt;
 			[% END %]
 			[% CALL cart.restore({id =&gt; '8387244B-DB27-4E26-BAD0-F6CB72C37954'}, hcart.CART_MODE_REPLACE) %]
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
-			[% FOREACH item = cart.items %]
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
+			[% FOREACH item = cart.items.all %]
 				&lt;restoreditem&gt;
 					&lt;description&gt;[% item.description %]&lt;/description&gt;
-					&lt;price&gt;[% item.price %]&lt;/price&gt;
+					&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% item.total %]&lt;/total&gt;
+					&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 				&lt;/restoreditem&gt;
 			[% END %]
 		&lt;/cart&gt;</diff>
      <filename>t/htdocs/tt2/cart_restore_replace.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -14,24 +14,24 @@
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 	[% ELSE %]
 		&lt;message&gt;Error creating shopping cart&lt;/message&gt;
     [% END %]
 
-    [% IF (cart = hcart.fetch({
+    [% IF (cart = hcart.search({
 		id			=&gt; '279C429E-547C-4429-9DA9-357659E3F654',
 		type		=&gt; hcart.CART_TYPE_TEMP
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 			[% CALL cart.save %]
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;</diff>
      <filename>t/htdocs/tt2/cart_save.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -11,17 +11,17 @@
 		&lt;message&gt;Error creating shopping cart&lt;/message&gt;
 	[% END %]
 
-	[% IF (cart = hcart.fetch({
+	[% IF (cart = hcart.search({
 		type =&gt; hcart.CART_TYPE_SAVED,
 		id	 =&gt; '535FD0DD-A88E-42B0-B503-7FFB4384B4D6'
-	})) %]
+	}).first) %]
 		&lt;cart&gt;
 			&lt;count&gt;[% cart.count %]&lt;/count&gt;
 			&lt;description&gt;[% cart.description %]&lt;/description&gt;
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 		[% CALL cart.description('My New Description') %]
@@ -34,10 +34,10 @@
 			&lt;id&gt;[% cart.id %]&lt;/id&gt;
 			&lt;name&gt;[% cart.name %]&lt;/name&gt;
 			&lt;shopper&gt;[% cart.shopper %]&lt;/shopper&gt;
-			&lt;subtotal&gt;[% cart.subtotal %]&lt;/subtotal&gt;
+			&lt;subtotal&gt;[% cart.subtotal.value %]&lt;/subtotal&gt;
 			&lt;type&gt;[% cart.type %]&lt;/type&gt;
 		&lt;/cart&gt;
 	[% ELSE %]
 		&lt;message&gt;Could not find cart&lt;/message&gt;
 	[% END %]
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/tt2/cart_update.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -2,5 +2,4 @@
 [% USE hdlc = Handel.Cart %]
 &lt;body&gt;
 	&lt;p&gt;[% hdlc.uuid %]&lt;/p&gt;
-	&lt;p&gt;[% hdlc.guid %]&lt;/p&gt;
 &lt;/body&gt;</diff>
      <filename>t/htdocs/tt2/cart_uuid.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@
 
 &lt;body&gt;
 
-	[% IF (checkout = hcheckout.create) %]
+	[% IF (checkout = hcheckout.new) %]
 		[% CALL checkout.add_message('This is a new message') %]
 		&lt;messages&gt;
 			[% FOREACH message = checkout.messages %]</diff>
      <filename>t/htdocs/tt2/checkout_messages.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@
 [% USE hcheckout = Handel.Checkout %]
 
 &lt;body&gt;
-	[% IF (checkout = hcheckout.create({
+	[% IF (checkout = hcheckout.new({
 		order =&gt; '11111111-1111-1111-1111-111111111111'
 	})) %]
 		[% IF (order = checkout.order) %]
@@ -26,10 +26,10 @@
 				&lt;billtoemail&gt;[% order.billtoemail %]&lt;/billtoemail&gt;
 				&lt;comments&gt;[% order.comments %]&lt;/comments&gt;
 				&lt;created&gt;[% order.created %]&lt;/created&gt;
-				&lt;handling&gt;[% order.handling %]&lt;/handling&gt;
+				&lt;handling&gt;[% order.handling.value %]&lt;/handling&gt;
 				&lt;number&gt;[% order.number %]&lt;/number&gt;
 				&lt;shipmethod&gt;[% order.shipmethod %]&lt;/shipmethod&gt;
-				&lt;shipping&gt;[% order.shipping %]&lt;/shipping&gt;
+				&lt;shipping&gt;[% order.shipping.value %]&lt;/shipping&gt;
 				&lt;shiptosameasbillto&gt;[% order.shiptosameasbillto %]&lt;/shiptosameasbillto&gt;
 				&lt;shiptofirstname&gt;[% order.shiptofirstname %]&lt;/shiptofirstname&gt;
 				&lt;shiptolastname&gt;[% order.shiptolastname %]&lt;/shiptolastname&gt;
@@ -44,18 +44,18 @@
 				&lt;shiptonightphone&gt;[% order.shiptonightphone %]&lt;/shiptonightphone&gt;
 				&lt;shiptofax&gt;[% order.shiptofax %]&lt;/shiptofax&gt;
 				&lt;shiptoemail&gt;[% order.shiptoemail %]&lt;/shiptoemail&gt;
-				&lt;subtotal&gt;[% order.subtotal %]&lt;/subtotal&gt;
-				&lt;total&gt;[% order.total %]&lt;/total&gt;
-				&lt;tax&gt;[% order.tax %]&lt;/tax&gt;
+				&lt;subtotal&gt;[% order.subtotal.value %]&lt;/subtotal&gt;
+				&lt;total&gt;[% order.total.value %]&lt;/total&gt;
+				&lt;tax&gt;[% order.tax.value %]&lt;/tax&gt;
 				&lt;updated&gt;[% order.updated %]&lt;/updated&gt;
-				[% FOREACH item = order.items.list %]
+				[% FOREACH item = order.items.all %]
 					&lt;item&gt;
 						&lt;description&gt;[% item.description %]&lt;/description&gt;
 						&lt;id&gt;[% item.id %]&lt;/id&gt;
-						&lt;price&gt;[% item.price %]&lt;/price&gt;
+						&lt;price&gt;[% item.price.value %]&lt;/price&gt;
 						&lt;quantity&gt;[% item.quantity %]&lt;/quantity&gt;
 						&lt;sku&gt;[% item.sku %]&lt;/sku&gt;
-						&lt;total&gt;[% item.total %]&lt;/total&gt;
+						&lt;total&gt;[% item.total.value %]&lt;/total&gt;
 					&lt;/item&gt;
 				[% END %]
 			&lt;/order&gt;</diff>
      <filename>t/htdocs/tt2/checkout_order.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@
 [% USE hcheckout = Handel.Checkout %]
 
 &lt;body&gt;
-	[% IF (checkout = hcheckout.create) %]
+	[% IF (checkout = hcheckout.new) %]
 		&lt;phases&gt;
 			[% FOREACH phase = checkout.phases %]
 				&lt;phase&gt;[% phase %]&lt;/phase&gt;
@@ -10,7 +10,7 @@
 		&lt;/phases&gt;
 	[% END %]
 
-	[% IF (checkout = hcheckout.create({phases =&gt; 'CHECKOUT_PHASE_AUTHORIZE CHECKOUT_PHASE_DELIVER'})) %]
+	[% IF (checkout = hcheckout.new({phases =&gt; 'CHECKOUT_PHASE_AUTHORIZE CHECKOUT_PHASE_DELIVER'})) %]
 		&lt;phases&gt;
 			[% FOREACH phase = checkout.phases %]
 				&lt;phase&gt;[% phase %]&lt;/phase&gt;</diff>
      <filename>t/htdocs/tt2/checkout_phases.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -2,7 +2,7 @@
 [% USE hcheckout = Handel.Checkout %]
 
 &lt;body&gt;
-	[% IF (checkout = hcheckout.create({pluginpaths =&gt; 'Handel::TestPlugins'})) %]
+	[% IF (checkout = hcheckout.new({pluginpaths =&gt; 'Handel::TestPlugins'})) %]
 		&lt;plugins&gt;
 			[% FOREACH plugin = checkout.plugins %]
 				&lt;plugin&gt;[% plugin.name %]&lt;/plugin&gt;
@@ -10,7 +10,7 @@
 		&lt;/plugins&gt;
 	[% END %]
 
-	[% IF (checkout = hcheckout.create({pluginpaths =&gt; 'Handel::OtherTestPlugins'})) %]
+	[% IF (checkout = hcheckout.new({pluginpaths =&gt; 'Handel::OtherTestPlugins'})) %]
 		&lt;plugins&gt;
 			[% FOREACH plugin = checkout.plugins %]
 				&lt;plugin&gt;[% plugin.name %]&lt;/plugin&gt;
@@ -18,7 +18,7 @@
 		&lt;/plugins&gt;
 	[% END %]
 
-	[% IF (checkout = hcheckout.create({pluginpaths =&gt; 'Handel::TestPlugins, Handel::OtherTestPlugins'})) %]
+	[% IF (checkout = hcheckout.new({pluginpaths =&gt; 'Handel::TestPlugins, Handel::OtherTestPlugins'})) %]
 		&lt;plugins&gt;
 			[% FOREACH plugin = checkout.plugins %]
 				&lt;plugin&gt;[% plugin.name %]&lt;/plugin&gt;
@@ -26,7 +26,7 @@
 		&lt;/plugins&gt;
 	[% END %]
 
-	[% IF (checkout = hcheckout.create({pluginpaths =&gt; 'Handel::TestPlugins, Handel::OtherTestPlugins, Handel::TestPipeline'})) %]
+	[% IF (checkout = hcheckout.new({pluginpaths =&gt; 'Handel::TestPlugins, Handel::OtherTestPlugins, Handel::TestPipeline'})) %]
 		&lt;plugins&gt;
 			[% FOREACH plugin = checkout.plugins %]
 				&lt;plugin&gt;[% plugin.name %]&lt;/plugin&gt;
@@ -34,7 +34,7 @@
 		&lt;/plugins&gt;
 	[% END %]
 
-	[% IF (checkout = hcheckout.create({
+	[% IF (checkout = hcheckout.new({
 		pluginpaths =&gt; 'Handel::TestPlugins, Handel::OtherTestPlugins, Handel::TestPipeline',
 		ignoreplugins =&gt; 'Handel::TestPipeline::ValidateError'
 	})) %]
@@ -46,7 +46,7 @@
 	[% END %]
 
 
-	[% IF (checkout = hcheckout.create({
+	[% IF (checkout = hcheckout.new({
 		pluginpaths =&gt; 'Handel::TestPlugins, Handel::OtherTestPlugins, Handel::TestPipeline',
 		loadplugins =&gt; 'Handel::TestPipeline::ValidateError'
 	})) %]
@@ -57,7 +57,7 @@
 		&lt;/plugins&gt;
 	[% END %]
 
-	[% IF (checkout = hcheckout.create({
+	[% IF (checkout = hcheckout.new({
 		pluginpaths =&gt; 'Handel::TestPlugins, Handel::OtherTestPlugins, Handel::TestPipeline',
 		loadplugins =&gt; 'Handel::TestPipeline::WriteToStash, Handel::TestPipeline::ReadFromStash',
 		ignoreplugins =&gt; 'Handel::TestPipeline::WriteToStash'
@@ -68,4 +68,4 @@
 			[% END %]
 		&lt;/plugins&gt;
 	[% END %]
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/tt2/checkout_plugins.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@
 
 &lt;body&gt;
 
-	[% IF (checkout = hcheckout.create({
+	[% IF (checkout = hcheckout.new({
 		pluginpaths =&gt; 'Handel::TestPipeline',
 		loadplugins =&gt; 'Handel::TestPipeline::ReadFromStash, Handel::Testpipeline::WriteFromStash',
 		cart =&gt; '11111111-1111-1111-1111-111111111111'
@@ -20,7 +20,7 @@
 		&lt;/checkout&gt;
 	[% END %]
 
-	[% IF (checkout = hcheckout.create({
+	[% IF (checkout = hcheckout.new({
 		pluginpaths =&gt; 'Handel::TestPipeline',
 		loadplugins =&gt; 'Handel::TestPipeline::ReadFromStash, Handel::Testpipeline::WriteFromStash',
 		order =&gt; '11111111-1111-1111-1111-111111111111'
@@ -37,7 +37,7 @@
 		&lt;/checkout&gt;
 	[% END %]
 
-	[% IF (checkout = hcheckout.create({
+	[% IF (checkout = hcheckout.new({
 		pluginpaths =&gt; 'Handel::TestPipeline',
 		loadplugins =&gt; 'Handel::TestPipeline::ReadFromStash, Handel::Testpipeline::WriteFromStash'
 	})) %]
@@ -54,7 +54,7 @@
 		&lt;/checkout&gt;
 	[% END %]
 
-	[% IF (checkout = hcheckout.create({
+	[% IF (checkout = hcheckout.new({
 		pluginpaths =&gt; 'Handel::TestPipeline',
 		loadplugins =&gt; 'Handel::TestPipeline::ReadFromStash, Handel::Testpipeline::WriteFromStash'
 	})) %]
@@ -72,7 +72,7 @@
 	[% END %]
 
 
-	[% IF (checkout = hcheckout.create({
+	[% IF (checkout = hcheckout.new({
 		pluginpaths =&gt; 'Handel::TestPipeline',
 		loadplugins =&gt; 'Handel::TestPipeline::InitializeTotals, Handel::TestPipeline::ValidateError',
 		order =&gt; '11111111-1111-1111-1111-111111111111',</diff>
      <filename>t/htdocs/tt2/checkout_process.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -19,7 +19,7 @@
 		billtofax			=&gt; '3-333-333-3333',
 		billtoemail			=&gt; 'mendlefarg@gmail.com',
 		comments			=&gt; 'Comments',
-		created				=&gt; '20050715T201234Z',
+		created				=&gt; '2005-07-15 20:12:34',
 		handling			=&gt; 8.95,
 		number				=&gt; 'O123456789',
 		shipmethod			=&gt; 'UPS Ground',
@@ -41,7 +41,7 @@
 		subtotal			=&gt; 37.95,
 		total				=&gt; 37.95,
 		tax					=&gt; 6.66,
-		updated				=&gt; '20050716T201234Z'
+		updated				=&gt; '2005-07-16 20:12:34'
 	})) %]
 		&lt;order&gt;
 			&lt;count&gt;[% order.count %]&lt;/count&gt;
@@ -63,10 +63,10 @@
 			&lt;billtoemail&gt;[% order.billtoemail %]&lt;/billtoemail&gt;
 			&lt;comments&gt;[% order.comments %]&lt;/comments&gt;
 			&lt;created&gt;[% order.created %]&lt;/created&gt;
-			&lt;handling&gt;[% order.handling %]&lt;/handling&gt;
+			&lt;handling&gt;[% order.handling.value %]&lt;/handling&gt;
 			&lt;number&gt;[% order.number %]&lt;/number&gt;
 			&lt;shipmethod&gt;[% order.shipmethod %]&lt;/shipmethod&gt;
-			&lt;shipping&gt;[% order.shipping %]&lt;/shipping&gt;
+			&lt;shipping&gt;[% order.shipping.value %]&lt;/shipping&gt;
 			&lt;shiptosameasbillto&gt;[% order.shiptosameasbillto %]&lt;/shiptosameasbillto&gt;
 			&lt;shiptofirstname&gt;[% order.shiptofirstname %]&lt;/shiptofirstname&gt;
 			&lt;shiptolastname&gt;[% order.shiptolastname %]&lt;/shiptolastname&gt;
@@ -81,19 +81,19 @@
 			&lt;shiptonightphone&gt;[% order.shiptonightphone %]&lt;/shiptonightphone&gt;
 			&lt;shiptofax&gt;[% order.shiptofax %]&lt;/shiptofax&gt;
 			&lt;shiptoemail&gt;[% order.shiptoemail %]&lt;/shiptoemail&gt;
-			&lt;subtotal&gt;[% order.subtotal %]&lt;/subtotal&gt;
-			&lt;total&gt;[% order.total %]&lt;/total&gt;
-			&lt;tax&gt;[% order.tax %]&lt;/tax&gt;
+			&lt;subtotal&gt;[% order.subtotal.value %]&lt;/subtotal&gt;
+			&lt;total&gt;[% order.total.value %]&lt;/total&gt;
+			&lt;tax&gt;[% order.tax.value %]&lt;/tax&gt;
 			&lt;updated&gt;[% order.updated %]&lt;/updated&gt;
 		&lt;/order&gt;
 	[% ELSE %]
 		&lt;message&gt;Error creating order&lt;/message&gt;
 	[% END %]
 
-	[% IF (order = horder.fetch({
+	[% IF (order = horder.search({
 		type =&gt; horder.ORDER_TYPE_TEMP,
 		id 	 =&gt; '94FE4F12-4C1A-46E4-9DD5-3757555862A8'
-	})) %]
+	}).first) %]
 		[% IF (addeditem = order.add({
 			description =&gt; 'My New Item',
 			id			=&gt; '9BE94446-ABB8-493D-9C8D-5177901B59D3',
@@ -105,10 +105,10 @@
 			&lt;addeditem&gt;
 				&lt;description&gt;[% addeditem.description %]&lt;/description&gt;
 				&lt;id&gt;[% addeditem.id %]&lt;/id&gt;
-				&lt;price&gt;[% addeditem.price %]&lt;/price&gt;
+				&lt;price&gt;[% addeditem.price.value %]&lt;/price&gt;
 				&lt;quantity&gt;[% addeditem.quantity %]&lt;/quantity&gt;
 				&lt;sku&gt;[% addeditem.sku %]&lt;/sku&gt;
-				&lt;total&gt;[% addeditem.total %]&lt;/total&gt;
+				&lt;total&gt;[% addeditem.total.value %]&lt;/total&gt;
 			&lt;/addeditem&gt;
 		[% ELSE %]
 			&lt;message&gt;New item not added&lt;/message&gt;
@@ -133,10 +133,10 @@
 			&lt;billtoemail&gt;[% order.billtoemail %]&lt;/billtoemail&gt;
 			&lt;comments&gt;[% order.comments %]&lt;/comments&gt;
 			&lt;created&gt;[% order.created %]&lt;/created&gt;
-			&lt;handling&gt;[% order.handling %]&lt;/handling&gt;
+			&lt;handling&gt;[% order.handling.value %]&lt;/handling&gt;
 			&lt;number&gt;[% order.number %]&lt;/number&gt;
 			&lt;shipmethod&gt;[% order.shipmethod %]&lt;/shipmethod&gt;
-			&lt;shipping&gt;[% order.shipping %]&lt;/shipping&gt;
+			&lt;shipping&gt;[% order.shipping.value %]&lt;/shipping&gt;
 			&lt;shiptosameasbillto&gt;[% order.shiptosameasbillto %]&lt;/shiptosameasbillto&gt;
 			&lt;shiptofirstname&gt;[% order.shiptofirstname %]&lt;/shiptofirstname&gt;
 			&lt;shiptolastname&gt;[% order.shiptolastname %]&lt;/shiptolastname&gt;
@@ -151,12 +151,12 @@
 			&lt;shiptonightphone&gt;[% order.shiptonightphone %]&lt;/shiptonightphone&gt;
 			&lt;shiptofax&gt;[% order.shiptofax %]&lt;/shiptofax&gt;
 			&lt;shiptoemail&gt;[% order.shiptoemail %]&lt;/shiptoemail&gt;
-			&lt;subtotal&gt;[% order.subtotal %]&lt;/subtotal&gt;
-			&lt;total&gt;[% order.total %]&lt;/total&gt;
-			&lt;tax&gt;[% order.tax %]&lt;/tax&gt;
+			&lt;subtotal&gt;[% order.subtotal.value %]&lt;/subtotal&gt;
+			&lt;total&gt;[% order.total.value %]&lt;/total&gt;
+			&lt;tax&gt;[% order.tax.value %]&lt;/tax&gt;
 			&lt;updated&gt;[% order.updated %]&lt;/updated&gt;
 		&lt;/order&gt;
 	[% ELSE %]
 		&lt;message&gt;Could not find order&lt;/message&gt;
 	[% END %]
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/tt2/order_add.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -19,7 +19,7 @@
 		billtofax			=&gt; '3-333-333-3333',
 		billtoemail			=&gt; 'mendlefarg@gmail.com',
 		comments			=&gt; 'Comments',
-		created				=&gt; '20050715T201234Z',
+		created				=&gt; '2005-07-15 20:12:34',
 		handling			=&gt; 8.95,
 		number				=&gt; 'O123456789',
 		shipmethod			=&gt; 'UPS Ground',
@@ -41,7 +41,7 @@
 		subtotal			=&gt; 37.95,
 		total				=&gt; 37.95,
 		tax					=&gt; 6.66,
-		updated				=&gt; '20050716T201234Z'
+		updated				=&gt; '2005-07-16 20:12:34'
 	})) %]
 		[% UNLESS order.add({
 			description =&gt; 'My New Item',
@@ -73,10 +73,10 @@
 			&lt;billtoemail&gt;[% order.billtoemail %]&lt;/billtoemail&gt;
 			&lt;comments&gt;[% order.comments %]&lt;/comments&gt;
 			&lt;created&gt;[% order.created %]&lt;/created&gt;
-			&lt;handling&gt;[% order.handling %]&lt;/handling&gt;
+			&lt;handling&gt;[% order.handling.value %]&lt;/handling&gt;
 			&lt;number&gt;[% order.number %]&lt;/number&gt;
 			&lt;shipmethod&gt;[% order.shipmethod %]&lt;/shipmethod&gt;
-			&lt;shipping&gt;[% order.shipping %]&lt;/shipping&gt;
+			&lt;shipping&gt;[% order.shipping.value %]&lt;/shipping&gt;
 			&lt;shiptosameasbillto&gt;[% order.shiptosameasbillto %]&lt;/shiptosameasbillto&gt;
 			&lt;shiptofirstname&gt;[% order.shiptofirstname %]&lt;/shiptofirstname&gt;
 			&lt;shiptolastname&gt;[% order.shiptolastname %]&lt;/shiptolastname&gt;
@@ -91,19 +91,19 @@
 			&lt;shiptonightphone&gt;[% order.shiptonightphone %]&lt;/shiptonightphone&gt;
 			&lt;shiptofax&gt;[% order.shiptofax %]&lt;/shiptofax&gt;
 			&lt;shiptoemail&gt;[% order.shiptoemail %]&lt;/shiptoemail&gt;
-			&lt;subtotal&gt;[% order.subtotal %]&lt;/subtotal&gt;
-			&lt;total&gt;[% order.total %]&lt;/total&gt;
-			&lt;tax&gt;[% order.tax %]&lt;/tax&gt;
+			&lt;subtotal&gt;[% order.subtotal.value %]&lt;/subtotal&gt;
+			&lt;total&gt;[% order.total.value %]&lt;/total&gt;
+			&lt;tax&gt;[% order.tax.value %]&lt;/tax&gt;
 			&lt;updated&gt;[% order.updated %]&lt;/updated&gt;
 		&lt;/order&gt;
 	[% ELSE %]
 		&lt;message&gt;Error creating order&lt;/message&gt;
 	[% END %]
 
-	[% IF (order = horder.fetch({
+	[% IF (order = horder.search({
 		type =&gt; horder.ORDER_TYPE_TEMP,
 		id	 =&gt; 'B0462540-0564-4E27-B9FD-C3985A227C49'
-	})) %]
+	}).first) %]
 		&lt;order&gt;
 			&lt;count&gt;[% order.count %]&lt;/count&gt;
 			&lt;id&gt;[% order.id %]&lt;/id&gt;
@@ -124,10 +124,10 @@
 			&lt;billtoemail&gt;[% order.billtoemail %]&lt;/billtoemail&gt;
 			&lt;comments&gt;[% order.comments %]&lt;/comments&gt;
 			&lt;created&gt;[% order.created %]&lt;/created&gt;
-			&lt;handling&gt;[% order.handling %]&lt;/handling&gt;
+			&lt;handling&gt;[% order.handling.value %]&lt;/handling&gt;
 			&lt;number&gt;[% order.number %]&lt;/number&gt;
 			&lt;shipmethod&gt;[% order.shipmethod %]&lt;/shipmethod&gt;
-			&lt;shipping&gt;[% order.shipping %]&lt;/shipping&gt;
+			&lt;shipping&gt;[% order.shipping.value %]&lt;/shipping&gt;
 			&lt;shiptosameasbillto&gt;[% order.shiptosameasbillto %]&lt;/shiptosameasbillto&gt;
 			&lt;shiptofirstname&gt;[% order.shiptofirstname %]&lt;/shiptofirstname&gt;
 			&lt;shiptolastname&gt;[% order.shiptolastname %]&lt;/shiptolastname&gt;
@@ -142,14 +142,14 @@
 			&lt;shiptonightphone&gt;[% order.shiptonightphone %]&lt;/shiptonightphone&gt;
 			&lt;shiptofax&gt;[% order.shiptofax %]&lt;/shiptofax&gt;
 			&lt;shiptoemail&gt;[% order.shiptoemail %]&lt;/shiptoemail&gt;
-			&lt;subtotal&gt;[% order.subtotal %]&lt;/subtotal&gt;
-			&lt;total&gt;[% order.total %]&lt;/total&gt;
-			&lt;tax&gt;[% order.tax %]&lt;/tax&gt;
+			&lt;subtotal&gt;[% order.subtotal.value %]&lt;/subtotal&gt;
+			&lt;total&gt;[% order.total.value %]&lt;/total&gt;
+			&lt;tax&gt;[% order.tax.value %]&lt;/tax&gt;
 			&lt;updated&gt;[% order.updated %]&lt;/updated&gt;
-			[% order.clear %]
+			[% CALL order.clear %]
 			&lt;count&gt;[% order.count %]&lt;/count&gt;
 		&lt;/order&gt;
 	[% ELSE %]
 		&lt;message&gt;Could not find order&lt;/message&gt;
 	[% END %]
-&lt;/body&gt;
\ No newline at end of file
+&lt;/body&gt;</diff>
      <filename>t/htdocs/tt2/order_clear.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -1,5 +1,5 @@
 [%# $Id$ %]
-[% USE horder  = Handel.Order %]
+[% USE horder = Handel.Order %]
 &lt;body&gt;
     [% IF (order = horder.create({
 		id					=&gt; '7B1A38C8-36CA-4403-B3D4-C7D327131F37',
@@ -19,7 +19,7 @@
 		billtofax			=&gt; '3-333-333-3333',
 		billtoemail			=&gt; 'mendlefarg@gmail.com',
 		comments			=&gt; 'Comments',
-		created				=&gt; '20050715T201234Z',
+		created				=&gt; '2005-07-15 20:12:34',
 		handling			=&gt; 8.95,
 		number				=&gt; 'O123456789',
 		shipmethod			=&gt; 'UPS Ground',
@@ -41,7 +41,7 @@
 		subtotal			=&gt; 37.95,
 		total				=&gt; 37.95,
 		tax					=&gt; 6.66,
-		updated				=&gt; '20050716T201234Z'
+		updated				=&gt; '2005-07-16 20:12:34'
 	})) %]
 		&lt;order&gt;
 			&lt;count&gt;[% order.count %]&lt;/count&gt;
@@ -63,10 +63,10 @@
 			&lt;billtoemail&gt;[% order.billtoemail %]&lt;/billtoemail&gt;
 			&lt;comments&gt;[% order.comments %]&lt;/comments&gt;
 			&lt;created&gt;[% order.created %]&lt;/created&gt;
-			&lt;handling&gt;[% order.handling %]&lt;/handling&gt;
+			&lt;handling&gt;[% order.handling.value %]&lt;/handling&gt;
 			&lt;number&gt;[% order.number %]&lt;/number&gt;
 			&lt;shipmethod&gt;[% order.shipmethod %]&lt;/shipmethod&gt;
-			&lt;shipping&gt;[% order.shipping %]&lt;/shipping&gt;
+			&lt;shipping&gt;[% order.shipping.value %]&lt;/shipping&gt;
 			&lt;shiptosameasbillto&gt;[% order.shiptosameasbillto %]&lt;/shiptosameasbillto&gt;
 			&lt;shiptofirstname&gt;[% order.shiptofirstname %]&lt;/shiptofirstname&gt;
 			&lt;shiptolastname&gt;[% order.shiptolastname %]&lt;/shiptolastname&gt;
@@ -81,9 +81,9 @@
 			&lt;shiptonightphone&gt;[% order.shiptonightphone %]&lt;/shiptonightphone&gt;
 			&lt;shiptofax&gt;[% order.shiptofax %]&lt;/shiptofax&gt;
 			&lt;shiptoemail&gt;[% order.shiptoemail %]&lt;/shiptoemail&gt;
-			&lt;subtotal&gt;[% order.subtotal %]&lt;/subtotal&gt;
-			&lt;total&gt;[% order.total %]&lt;/total&gt;
-			&lt;tax&gt;[% order.tax %]&lt;/tax&gt;
+			&lt;subtotal&gt;[% order.subtotal.value %]&lt;/subtotal&gt;
+			&lt;total&gt;[% order.total.value %]&lt;/total&gt;
+			&lt;tax&gt;[% order.tax.value %]&lt;/tax&gt;
 			&lt;updated&gt;[% order.updated %]&lt;/updated&gt;
 		&lt;/order&gt;
 	[% ELSE %]</diff>
      <filename>t/htdocs/tt2/order_create.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -19,7 +19,7 @@
 		billtofax			=&gt; '3-333-333-3333',
 		billtoemail			=&gt; 'mendlefarg@gmail.com',
 		comments			=&gt; 'Comments',
-		created				=&gt; '20050715T201234Z',
+		created				=&gt; '2005-07-15 20:12:34',
 		handling			=&gt; 8.95,
 		number				=&gt; 'O123456789',
 		shipmethod			=&gt; 'UPS Ground',
@@ -41,7 +41,7 @@
 		subtotal			=&gt; 37.95,
 		total				=&gt; 37.95,
 		tax					=&gt; 6.66,
-		updated				=&gt; '20050716T201234Z'
+		updated				=&gt; '2005-07-16 20:12:34'
 	})) %]
 		&lt;order&gt;
 			[% IF (addeditem = order.add({
@@ -55,10 +55,10 @@
 				&lt;item&gt;
 					&lt;description&gt;[% addeditem.description %]&lt;/description&gt;
 					&lt;id&gt;[% addeditem.id %]&lt;/id&gt;
-					&lt;price&gt;[% addeditem.price %]&lt;/price&gt;
+					&lt;price&gt;[% addeditem.price.value %]&lt;/price&gt;
 					&lt;quantity&gt;[% addeditem.quantity %]&lt;/quantity&gt;
 					&lt;sku&gt;[% addeditem.sku %]&lt;/sku&gt;
-					&lt;total&gt;[% addeditem.total %]&lt;/total&gt;
+					&lt;total&gt;[% addeditem.total.value %]&lt;/total&gt;
 				&lt;/item&gt;
 			[% ELSE %]
 				&lt;message&gt;Error adding order item&lt;/message&gt;
@@ -82,10 +82,10 @@
 			&lt;billtoemail&gt;[% order.billtoemail %]&lt;/billtoemail&gt;
 			&lt;comments&gt;[% order.comments %]&lt;/comments&gt;
 			&lt;created&gt;[% order.created %]&lt;/created&gt;
-			&lt;handling&gt;[% order.handling %]&lt;/handling&gt;
+			&lt;handling&gt;[% order.handling.value %]&lt;/handling&gt;
 			&lt;number&gt;[% order.number %]&lt;/number&gt;
 			&lt;shipmethod&gt;[% order.shipmethod %]&lt;/shipmethod&gt;
-			&lt;shipping&gt;[% order.shipping %]&lt;/shipping&gt;
+			&lt;shipping&gt;[% order.shipping.value %]&lt;/shipping&gt;
 			&lt;shiptosameasbillto&gt;[% order.shiptosameasbillto %]&lt;/shiptosameasbillto&gt;
 			&lt;shiptofirstname&gt;[% order.shiptofirstname %]&lt;/shiptofirstname&gt;
 			&lt;shiptolastname&gt;[% order.shiptolastname %]&lt;/shiptolastname&gt;
@@ -100,9 +100,9 @@
 			&lt;shiptonightphone&gt;[% order.shiptonightphone %]&lt;/shiptonightphone&gt;
 			&lt;shiptofax&gt;[% order.shiptofax %]&lt;/shiptofax&gt;
 			&lt;shiptoemail&gt;[% order.shiptoemail %]&lt;/shiptoemail&gt;
-			&lt;subtotal&gt;[% order.subtotal %]&lt;/subtotal&gt;
-			&lt;total&gt;[% order.total %]&lt;/total&gt;
-			&lt;tax&gt;[% order.tax %]&lt;/tax&gt;
+			&lt;subtotal&gt;[% order.subtotal.value %]&lt;/subtotal&gt;
+			&lt;total&gt;[% order.total.value %]&lt;/total&gt;
+			&lt;tax&gt;[% order.tax.value %]&lt;/tax&gt;
 			&lt;updated&gt;[% order.updated %]&lt;/updated&gt;
 		&lt;/order&gt;
 	[% ELSE %]</diff>
      <filename>t/htdocs/tt2/order_create_and_add.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -3,7 +3,7 @@
 &lt;body&gt;
     [% IF (order = horder.create({
 		id					=&gt; '7B1A38C8-36CA-4403-B3D4-C7D327131F3C',
-        shopper 			=&gt; 'D7B1057E-6998-4813-9F97-702C405DFB9C',
+		shopper 			=&gt; 'D7B1057E-6998-4813-9F97-702C405DFB9C',
 		type				=&gt; horder.ORDER_TYPE_TEMP,
 		cart				=&gt; {type =&gt; horder.CART_TYPE_TEMP, id =&gt; '11111111-1111-1111-1111-111111111111'},
 		billtofirstname		=&gt; 'Christopher',
@@ -20,7 +20,7 @@
 		billtofax			=&gt; '3-333-333-3333',
 		billtoemail			=&gt; 'mendlefarg@gmail.com',
 		comments			=&gt; 'Comments',
-		created				=&gt; '20050715T201234Z',
+		created				=&gt; '2005-07-15 20:12:34',
 		handling			=&gt; 8.95,
 		number				=&gt; 'O123456789',
 		shipmethod			=&gt; 'UPS Ground',
@@ -42,7 +42,7 @@
 		subtotal			=&gt; 37.95,
 		total				=&gt; 37.95,
 		tax					=&gt; 6.66,
-		updated				=&gt; '20050716T201234Z'
+		updated				=&gt; '2005-07-16 20:12:34'
 	})) %]
 		&lt;order&gt;
 			&lt;count&gt;[% order.count %]&lt;/count&gt;
@@ -64,10 +64,10 @@
 			&lt;billtoemail&gt;[% order.billtoemail %]&lt;/billtoemail&gt;
 			&lt;comments&gt;[% order.comments %]&lt;/comments&gt;
 			&lt;created&gt;[% order.created %]&lt;/created&gt;
-			&lt;handling&gt;[% order.handling %]&lt;/handling&gt;
+			&lt;handling&gt;[% order.handling.value %]&lt;/handling&gt;
 			&lt;number&gt;[% order.number %]&lt;/number&gt;
 			&lt;shipmethod&gt;[% order.shipmethod %]&lt;/shipmethod&gt;
-			&lt;shipping&gt;[% order.shipping %]&lt;/shipping&gt;
+			&lt;shipping&gt;[% order.shipping.value %]&lt;/shipping&gt;
 			&lt;shiptosameasbillto&gt;[% order.shiptosameasbillto %]&lt;/shiptosameasbillto&gt;
 			&lt;shiptofirstname&gt;[% order.shiptofirstname %]&lt;/shiptofirstname&gt;
 			&lt;shiptolastname&gt;[% order.shiptolastname %]&lt;/shiptolastname&gt;
@@ -82,9 +82,9 @@
 			&lt;shiptonightphone&gt;[% order.shiptonightphone %]&lt;/shiptonightphone&gt;
 			&lt;shiptofax&gt;[% order.shiptofax %]&lt;/shiptofax&gt;
 			&lt;shiptoemail&gt;[% order.shiptoemail %]&lt;/shiptoemail&gt;
-			&lt;subtotal&gt;[% order.subtotal %]&lt;/subtotal&gt;
-			&lt;total&gt;[% order.total %]&lt;/total&gt;
-			&lt;tax&gt;[% order.tax %]&lt;/tax&gt;
+			&lt;subtotal&gt;[% order.subtotal.value %]&lt;/subtotal&gt;
+			&lt;total&gt;[% order.total.value %]&lt;/total&gt;
+			&lt;tax&gt;[% order.tax.value %]&lt;/tax&gt;
 			&lt;updated&gt;[% order.updated %]&lt;/updated&gt;
 		&lt;/order&gt;
 	[% ELSE %]</diff>
      <filename>t/htdocs/tt2/order_create_cart.tt2</filename>
    </modified>
    <modified>
      <diff>@@ -19,7 +19,7 @@
 		billtofax			=&gt; '3-333-333-3333',
 		billtoemail			=&gt; 'mendlefarg@gmail.com',
 		comments			=&gt; 'Comments',
-		created				=&gt; '20050715T201234Z',
+		created				=&gt; '2005-07-15 20:12:34',
 		handling			=&gt; 8.95,
 		number				=&gt; 'O123456789',
 		shipmethod			=&gt; 'UPS Ground',
@@ -41,7 +41,7 @@
 		subtotal			=&gt; 37.95,
 		total				=&gt; 37.95,
 		tax					=&gt; 6.66,
-		updated				=&gt; '20050716T201234Z'
+		updated				=&gt; '2005-07-16 20:12:34'
 	})) %]
 		[% UNLESS order.add({
 			description =&gt; 'My New Item',
@@ -83,10 +83,10 @@
 			&lt;bi