use strict;
use warnings;
{
package Director;
use strict;
use warnings;
sub new {
my ($class, $builder) = @_;
my $self = {
builder => $builder,
};
return bless $self, $class;
}
sub construct {
my $self = shift;
$self->{builder}->makeTitle("Greeting");
$self->{builder}->makeString("from Morning to noon");
$self->{builder}->makeItems(['Ohayou', 'konnichiwa']);
$self->{builder}->makeString("At Night");
$self->{builder}->makeItems(['Kon', 'sayonara', 'oyasumi']);
$self->{builder}->close();
}
}
{
package Abstract::Builder;
use strict;
use warnings;
sub makeTitle { die; }
sub makeString { die; }
sub makeItems { die; }
sub close { die; }
}
{
package TextBuilder;
use strict;
use warnings;
our @ISA = qw/Abstract::Builder/;
sub new {
my ($class, ) = @_;
my $self = {
buffer => '',
};
return bless $self, $class;
}
sub makeTitle {
my ($self, $title) = @_;
$self->{buffer} .= "==========================\n";
$self->{buffer} .= "[ ".$title." ]\n";
$self->{buffer} .= "\n";
}
sub makeString {
my ($self, $string) = @_;
$self->{buffer} .= "**".$string."\n";
$self->{buffer} .= "\n";
}
sub makeItems {
my ($self, $items) = @_;
my $len = @{$items} - 1;
$self->{buffer} .= " --".$items->[$_]."\n" for(0..$len);
$self->{buffer} .= "\n";
}
sub close {
my $self = shift;
$self->{buffer} .= "==========================\n";
}
sub getResult{
$_[0]->{buffer};
}
}
my $builder = TextBuilder->new();
my $director = Director->new($builder);
$director->construct();
my $result = $builder->getResult();
print $result;