package Task; sub new { # creation of generic object. } my %task_cache; sub find_task { my $task = shift; $task = shift if $task eq __PACKAGE__; # can call as Task-> or Task:: return $task_cache{$task} if $task_cache{$task}; (my $mod_name = $task . '.pm') =~ s{::}{/}; eval { require $mod_name }; if ($@) { # handle error - return error, die, whatever. } $task_cache{$task} = $mod_name->new(@_); } sub needed { #default - yes. 1 } sub perform_task { # default... can't. my $self = shift; die "Forgot to override perform_task in " . ref($self) . "\n"; } 1;