sub make_report1 { my $dbh = &_get_dbh; &_do_make_report($dbh); $dbh->disconnect; 1; } sub _do_make_report { my $dbh = shift; ## etc... } sub make_all_reports { # connect to the database my $dbh = &_get_dbh; &_do_make_summary_report($dbh); &_do_make_report1($dbh); &_do_make_report1($dbh); ... # close the database connection $dbh->disconnect; # return happy and healthy return (1); } #### package your_package; sub AUTOLOAD { no strict qw(refs); our $AUTOLOAD; $AUTOLOAD =~ m{ (.*) :: (.*?) $ }x; my $dispatch_name = "$1::_do_$2"; if (defined &{$dispatch_name}) { *$AUTOLOAD = sub { my $dbh = &_get_dbh; my $rc = &$dispatch_name(@_); $dbh->disconnect(); return $rc; }; goto &$AUTOLOAD; } else { croak("Unable to autogenerate method for '$AUTOLOAD': no such function '$dispatch_name'"); } } #### $your_package::DBH = undef; sub _get_dbh() { defined($your_package::DBH) and return $your_package::DBH; $your_package::DBH = DBI->connect... return $your_package::DBH; }