--- /dev/null
+package App1;
+
+=head1 NAME
+
+App1 - base class for use in app1.pl
+
+=cut
+
+use strict;
+use warnings;
+use base qw(CGI::Ex::App);
+use FindBin qw($Bin);
+use CGI::Ex::Dump qw(debug);
+
+###----------------------------------------------------------------###
+
+# preload these so that their load times don't affect the dump_history times
+use CGI;
+use Template::Alloy qw(Parse Play Compile);
+
+sub post_navigate {
+ my $self = shift;
+ debug $self->dump_history
+ if ! $self->{'no_history'};
+}
+
+###----------------------------------------------------------------###
+
+sub load_conf { 1 } # let configuration be read from a file
+sub conf_file { "$Bin/app1.yaml" }
+sub conf_validation { {path => {required => 1, max_values => 100}} }
+
+sub allow_morph { 1 } # allow each step to be in a separate file
+
+sub name_module { "" } # allow content files to be in /tt/ directory directly
+sub template_path { "$Bin/tt" }
+sub template_args { {COMPILE_DIR => "/tmp/tt/app1.cache"} }
+
+# if we want automatic javascript validation, and we have overridden the path,
+# we need to give the script a way to find the validate.js
+sub js_uri_path { (my $path = $ENV{'SCRIPT_NAME'}) =~ s|[^/]+$|js.pl|; $path }
+
+# setting this instructs the flow to continue until a step does not have data
+sub validate_when_data { 1 }
+
+1;