my %Actions = ( login => { libs => [ "Sources::Env", "Sources::Global", "Sources::Authenticate", ], subs => [ \&Sources::Env::global_set, \&Sources::Global::write_standardhttp_header, \&Sources::Authenticate::write_loginmask, ], }, ); sub handler { my ($obj) = @_; my $action = lc($obj->{CGI}->getparam('action')) || 'login'; unless(exists $Actions{$action}->{subs}) { $action = 'login'; } foreach my $lib (@{$Actions{$action}->{libs}}) { require $lib; } foreach my $proc (@{$Actions{$action}->{subs}}) { unless($proc->($obj)) { # error in sub last; # errorhandling } } }