# here's the pre portion... my $count; my %data; IterateOver::file({ loop => sub { if (/^(.*?)\s*=\s*(.*?)\s*(?:#.*)$/) { $data{$1} = $2; } }, $some_file ); # post goes here... #### my @files = ( ... ); my $count; my %data; IterateOver::files({ pre => sub { print "Starting on file $_.\n"; $count = 0; }, loop => sub { if (/^[^#]/ and /^(.*?)\s*=\s*(.*?)\s*(?:#.*)$/) { $data{$1} = $2; ++$count; } }, post => sub { print "Found $count keys in $_.\n"; print "Total unique keys so far: ", scalar keys %data, "\n"; }, @files ); #### package TaskFilter; use base 'Task'; sub prefilter { 1 } # default pre is to do nothing and succeed at it. sub postfilter { 1 } # same thing sub filter { die "need to implement filter in subclass '" . ref $_[0] . "'\n"; } sub get_object_list { # generic implementation common to all my tasks derived from here. } sub sort_object_list { # to allow subclass to change order if needed. sort @_ } sub perform_task { my $self = shift; $self->prefilter() or die "prefilter failed."; my @records = $self->sort_object_list($self->get_object_list()); for my $r (@records) { $self->filter($r); } $self->postfilter() or die "postfilter failed."; 1; } 1;