Templateパターン

手作りのabstract classを書いてみると、新鮮な発見もある感じ。

use strict;
use warnings;

{
    package Abstract::AbstractDisplay;
    use strict;
    use warnings;
    sub new {
        my $class = shift;
        my $self = {};
        return bless $self, $class;
    }
    sub open { die; }
    sub print { die; }
    sub close { die; }
    sub display {
        my $self = shift;
        $self->open();
        $self->print() for(1..5);
        $self->close();
    }
}

{
    package CharDisplay;
    use strict;
    use warnings;
    our @ISA = qw/Abstract::AbstractDisplay/;
    sub new {
        my ($class, $char) = @_;
        my $self = {
        char => $char,
        };
        return bless $self, $class;
    }
    sub open {
        print "<<";
    }
    sub print {
        print $_[0]->{char};
    }
    sub close {
        print ">>";
    }
}
{
    package StringDisplay;
    use strict;
    use warnings;
    use Encode;
    our @ISA = qw/Abstract::AbstractDisplay/;
    sub new {
        my ($class, $string) = @_;
        my $self = {
        string => $string,
        length => length(decode('UTF-8', $string)),
        };
        return bless $self, $class;
    }
    sub open {
        $_[0]->printLine();
    }
    sub print {
        print "|".$_[0]->{string}."|\n";
    }
    sub close {
        $_[0]->printLine();
    }
    sub printLine {
        print "+";
        print "-" for(1..$_[0]->{length});
        print "+\n";
    }
}

my $p = CharDisplay->new('v(^.^)v');
$p->display;

print "\n";

my $p2 = StringDisplay->new('aiueo');
print $p2->display;