+ form=> {step => 'step2', wow => 'something'},
+})->navigate;
+ok($Foo::test_stdout eq "All good", "Got the right output");
+
+###----------------------------------------------------------------###
+
+#$ENV{'REQUEST_METHOD'} = 'GET';
+#$ENV{'QUERY_STRING'} = '';
+local $ENV{'PATH_INFO'} = '/step2';
+
+Foo->new({
+ form=> {},
+})->navigate;
+ok($Foo::test_stdout eq "Some step2 content (bar, two) <input type=text name=wow value=\"wee\">wow is required", "Got the right output");
+
+###----------------------------------------------------------------###
+
+#$ENV{'REQUEST_METHOD'} = 'GET';
+#$ENV{'QUERY_STRING'} = 'wow=something';
+local $ENV{'PATH_INFO'} = '/step2';
+
+my $f = Foo->new({
+ form=> {wow => 'something'},
+})->navigate;
+ok($Foo::test_stdout eq "All good", "Got the right output");
+ok($f->form->{'step'} eq 'step2', "Got the right variable set in form");
+
+###----------------------------------------------------------------###
+
+#$ENV{'REQUEST_METHOD'} = 'GET';
+#$ENV{'QUERY_STRING'} = '';
+local $ENV{'PATH_INFO'} = '/step2/something';
+
+$f = Foo->new({
+ form => {},
+})->navigate;
+ok($Foo::test_stdout eq "All good", "Got the right output");
+ok($f->form->{'step'} eq 'step2', "Got the right variable set in form");
+ok($f->form->{'wow'} eq 'something', "Got the right variable set in form");
+
+###----------------------------------------------------------------###
+
+local $ENV{'PATH_INFO'} = '';
+local $ENV{'SCRIPT_NAME'} = '';
+
+Foo->new({
+ form => {},
+ require_auth => 1,
+})->navigate;
+ok($Foo::test_stdout eq "Login Form", "Got the right output");
+
+###----------------------------------------------------------------###
+
+Foo->new({
+ form => {},
+})->navigate_authenticated;
+ok($Foo::test_stdout eq "Login Form", "Got the right output");
+
+###----------------------------------------------------------------###
+
+{
+ package Bar;
+ our @ISA = qw(Foo);
+ sub require_auth { 1 }
+}
+
+Bar->new({
+ form => {},
+})->navigate;
+ok($Foo::test_stdout eq "Login Form", "Got the right output for Bar");
+
+###----------------------------------------------------------------###
+
+{
+ package Bar1;
+ our @ISA = qw(Foo);
+ sub require_auth { 1 }
+}
+
+my $ok = eval { Bar1->new({
+ form => {},
+})->navigate_authenticated; 1 }; # can't call navigate_authenticated with overwritten require_auth
+ok(! $ok, "Got the right output for Bar1");
+
+###----------------------------------------------------------------###
+
+{
+ package Bar2;
+ our @ISA = qw(Foo);
+ sub main_require_auth { 1 }
+}
+
+Bar2->new({
+ form => {},
+})->navigate;
+ok($Foo::test_stdout eq "Login Form", "Got the right output for Bar2");
+
+###----------------------------------------------------------------###
+
+{
+ package Bar3;
+ our @ISA = qw(Foo);
+ sub require_auth { 1 }
+ sub main_require_auth { 0 }
+}
+
+Bar3->new({
+ form => {},
+})->navigate;
+ok($Foo::test_stdout eq "Main Content", "Got the right output for Bar3");
+
+###----------------------------------------------------------------###
+
+Foo->new({
+ form => {},
+ require_auth => {main => 0},
+})->navigate;
+ok($Foo::test_stdout eq "Main Content", "Got the right output");
+
+###----------------------------------------------------------------###
+
+Foo->new({
+ form => {},
+ require_auth => {main => 1},
+})->navigate;
+ok($Foo::test_stdout eq "Login Form", "Got the right output");
+
+###----------------------------------------------------------------###
+
+{
+ package Bar4;
+ our @ISA = qw(Foo);
+ sub pre_navigate { shift->require_auth(0); 0 }
+}
+
+Bar4->new({
+ form => {},
+})->navigate_authenticated;
+ok($Foo::test_stdout eq "Main Content", "Got the right output for Bar4");
+
+###----------------------------------------------------------------###
+
+{
+ package Bar5;
+ our @ISA = qw(Foo);
+ sub pre_navigate { shift->require_auth(1); 0 }
+}
+
+Bar5->new({
+ form => {},
+})->navigate;
+ok($Foo::test_stdout eq "Login Form", "Got the right output for Bar5 ($@)");
+
+###----------------------------------------------------------------###
+
+{
+ package Bar6;
+ our @ISA = qw(Foo);
+ sub pre_navigate { shift->require_auth({main => 1}); 0 }
+}
+
+Bar6->new({
+ form => {},