### in NextRMS.pm package CGI::Application::NextRMS; # I am module-naming challenged use base 'CGI::Application'; sub nextrms { my $self = shift; my %args = (@_); my %run_modes; my %nextrms = exists $self->{__NEXTRMS} ? %{$self->{__NEXTRMS}} : {}; for my $key (keys %args) { $run_modes{$key} = exists $args{$key}{handler} ? $args{$key}{handler} : $key; #little feature for lazy me $nextrms{$key} = exists $args{$key}{nextrms} ? $args{$key}{nextrms} : []; } $self->run_modes(%run_modes); $self->{__NEXTRMS} = \%nextrms; } 1; ### In "webapp.pm"... package WebApp; # use base 'CGI::Application::NextRMS'; push @ISA, 'CGI::Application::NextRMS'; use CGI::Carp qw/ fatalsToBrowser /; use CGI::FormBuilder; sub setup { my $self = shift; $self->start_mode('List'); $self->mode_param('_submit'); # compat w/ C::FB $self->nextrms( Add => { handler => 'add', nextrms => ['Cancel Add','Save'], }, Save => { handler => 'db_create', nextrms => ['List'], }, 'Cancel Add' => { handler => 'list', nextrms => ['Add'], }, List => { handler => 'list', nextrms => ['Add'], }, ); $self->{form} = CGI::FormBuilder->new( keepextras => 1, method => 'POST', name => 'myform', params => $self->query(), fields => [qw/ Test /], validate => {}, ); } sub main_form { my $self = shift; return "Runmode: " . $self->get_current_runmode() . "
Dispatched sub: " . (caller(1))[3] . $self->{form}->render( submit => $self->{__NEXTRMS}->{$self->get_current_runmode()}, ); } sub list { my $self = shift; return $self->main_form(); # or a list_form() :P } sub add { my $self = shift; return $self->main_form(); } sub db_create { my $self = shift; return $self->main_form(); } 1; ### In "webapp.cgi"... #use WebApp; my $webapp = WebApp->new(); $webapp->run();