ビルダーパターンをperl(Moo)で試しました
PerlでBuilderパターンを書いてみた。 を参考にして書いてみました。参考元のMooseというOOPから、Mooモジュールへ今回は書きなおしてみました。ほぼ、手を入れてません。 ただ、Mooモジュールでは、型チェックが出来ないのでそのあたりはさっくり削りました。(isa =>'Str'など)デザインパターンは、ビルダーパターンと、ファクトリーパターン、デコレーションパターンぐらいは、使ってみたいなーと思っていたので参考になりました。あと、Roleを使えば、使い回しがほぼできそうな気がしてます。自分の中では、面白くなってきました。package LunchBuilder { use common::sense; use Moo; # use Test::More; # use YAML; # https://qiita.com/narita_cpp/items/9cc283225a0785cfc5b0 has food => ( is => 'ro', required => 1, ); has drink => ( is => 'rw', required => 1, ); has dessert => ( is => 'rw', required => 1, ); has price => ( is => 'rw', required => 0, ); sub create { my ( $class, $food ) = @_; return $class->new( food => $food, drink => 'none', dessert => 'none', price => 1000, ); } sub set_drink { my ( $self, $drink ) = @_; $self->drink($drink); # subtest dinner => sub { # note Dump $self; # is $drink, "lunch Beer", "subtest lunch drink is :"; # note Dump $self->drink; # }; my $i = $self->price; $i += 100; $self->price($i); return $self; } sub set_dessert { my ( $self, $dessert ) = @_; $self->dessert($dessert); my $i = $self->price; $i += 500; $self->price($i); return $self; } sub build { my $self = shift; return $self; } sub payment { my $self = shift; return join( ',', ( $self->food, $self->drink, $self->dessert, $self->price ) ); } no Moo;}package Main { # use utf8; use common::sense; use LunchBuilder; my $pay1 = LunchBuilder->create('Sushi')->set_drink('lunch Beer')->set_dessert('Icecream') ->build()->payment(); say $pay1; my $pay2 = LunchBuilder->create('SushiSet')->build()->payment(); say $pay2; 1; }perl lunchBuilder.pmSushi,lunch Beer,Icecream,1600SushiSet,none,none,1000