sub _detect_type { ... # logic to determine type return \&_open_unzipped if $rule1; return \&_open_zipped if $rule2; return undef; } #### package Import; use Exporter; @ISA = qw(Exporter); @EXPORT = qw(load_file); @EXPORT_OK = qw(_detect_type _open_zipped _open_unzipped ); %EXPORT_TAGS = {STD => \@EXPORT, TEST => \@EXPORT_OK }; sub load_file { my $filename = shift; my $openner = _detect_type($filename); &$openner($filename); while (my $line = ) { ... # do stuff with lines } } sub _detect_type {...} sub _open_zipped {...} sub _open_unzipped {...} 1; #### use Test::More qw(no_plan); use Import qw(:TEST); ... is($test1, $result1); is($test2, $result2); ... #### is(_detect_type('unzipped.txt'), \&open_unzipped); is(_detect_type('zipped.zip'), \&open_zipped);