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;