Builderパターン

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;