package ClientFactory;
sub genericClient {
my $client = new Client();
my $calculator = new InvoiceCalculator ($client);
$client->setCalculator ($calculator);
return ($client);
}
package main;
my $client = ClientFactory::genericClient();
my $calculator = $client->getCalculator();
####
package Storage;
sub new {
return (bless {
'key 1' => 'default 1',
'key 2' => 'default 2',
}, shift);
}
package InvoiceCalculator;
sub new {
my $O = bless {}, shift;
$O->{'data'} = shift;
return ($O);
}
sub calculate {
my $O = shift;
for my $k (sort keys %{ $O->{'data'} }) {
printf ("%s -> %s\n", $k, $O->{'data'}->{ $k });
}
return;
}
package Client;
sub new {
my $O = bless {}, shift;
$O->{'data'} = new Storage ();
return ($O);
}
sub getCalculator {
my $O = shift;
return (new InvoiceCalculator ($O->{'data'}));
}
package main;
my $client = new Client;
my $calc = $client->getCalculator();
$calc->calculate();
####
sub InvoiceCalculator::calculate {
my $O = shift;
my $data = $O->{'data'};
for my $k (sort keys %$data) {
printf ("%s -> %s\n", $k, $data->{ $k });
}
return;
}