package TaskManager; use Task; sub new { # create. # receive task objects or task names, store them via add_task. } sub add_task { # receive task objects or task names my $self = shift; push @{$self->{_tasks}}, map { ref $_ ? $_ : Task::find_task($_) } @_; } sub execute_tasks { my $self = shift; # do we need to do them? my @tasks = grep { $_->needed() } @{$self->{_tasks}} for my $t (@tasks) { $t->perform_task(); } } 1; #### 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; #### package Task::WWW; use WWW::Mechanize; sub perform_task { my $self = shift; # set up proxy, ... my $www = WWW::Mechanize->new($self->get_hostname()); $self->handle_page($www); } 1;