MooseのCookbookは読み終わったので、サボりまくってたデザインパターンをまたやってみようとか思ってみました!
Prototypeパターンがなんで必要なのかって話で -ちょっとの違いでいちいちクラス作りまくるのが面倒 -もう一回同じクラスを作り直すのが面倒 -フレームワークと生成するインスタンス変数を分ける とかいうのがあるらしい。なるほどなるほど。恥ずかしながら、こういうのは発想としてなかった感じ。勉強してよかった。 そういえば、今度フレームワーク勉強会に参加するよ!他に参加される方はよろしくおねがいします。
まずcloneしっかり定義しとけ!ていう意味で、Prototype.pmを定義しとく。
|perl| package Prototype; use Moose::Role; requires 'clone'; 1; ||<
それを使うのがこちら。ぼくのidを返してくれるステキなモジュール。cloneもでっちあげる。
|perl| package Kiririmode; use Moose;
with 'Prototype';
has 'name' => ( isa => 'Str', is => 'rw', default => 'kiririmode' );
sub clone { my ($self) = @_; return Kiririmode->new( name => $self->name() ); }
1; ||<
1個だと味気ないので、Kitoshi.pmも作る。 フィールドをnameからnamaeにしたけど、結局味気ないですね。 "きとし"というのはぼくのもう一個のハンドルなんですけど、もちろんどうでもいい。
|perl| package Kitoshi; use Moose;
with 'Prototype';
has 'namae' => ( isa => 'Str', is => 'rw', default => 'kitoshi' );
sub clone { my ($self) = @_; return Kitoshi->new( namae => $self->namae() ); }
1; ||<
クライアント。これクライアントていうよりは、何となくサーバって感じがするなー。
|perl| package Client; use Moose;
has 'list' => ( is => 'rw', isa => 'HashRef', default => sub{{}} );
sub register { my ($self, $name, $obj) = @_; $self->list->{ $name } = $obj; }
sub get_clone { my ($self, $name) = @_; return $self->list->{ $name }->clone(); }
1; ||<
最後にmain。"きりり"というのはぼくのクソ昔のハンドルなんですけど、やっぱしどうでもいい。
|perl|
!/opt/local/bin/perl
use Kiririmode; use Kitoshi; use Client;
sub say { print @_, "\n" }
my $kiririmode = Kiririmode->new; my $kiriri = Kiririmode->new( name => "kiriri" ); my $kitoshi = Kitoshi->new;
my $client = Client->new(); $client->register( "kiririmode", $kiririmode ); $client->register( "kitoshi", $kitoshi ); $client->register( "kiriri", $kiriri );
my $handle; $handle = $client->get_clone( "kiririmode" ); say $handle->name(); # kiririmode $handle = $client->get_clone( "kiriri" ); say $handle->name(); # kiriri $handle = $client->get_clone( "kitoshi" ); say $handle->namae(); # kitoshi ||<