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;