本日購入の「モダンPerl入門」。さっそく読んでみたのでその感想を。
まずは、本当に『モダン』だという事。
7ページ目にして自分にとっての未知数であるMoooooooose!
この1章だけでMooseのオブジェクト指向の基本とRoleの概念を理解出来る(ように素人には読める)という充実のボリューム。
Mooseは書き方がそれまでのPerlOOに比べるとかなり独特であり、記述量も少ないので今までも色んな人のソースを見ていたけど、なかなか理解出来ず・・・
やっぱり書いてみなきゃわからんということで、真似して書いてみました。
hello_world.pl
1 #!/usr/bin/perl 2 3 use strict; 4 use warnings; 5 6 use lib './lib'; 7 8 use HelloMoose; 9 use HelloMoose::Date; 10 11 my $hello = HelloMoose->new(param => 'Moooooose' ); 12 $hello->message; 13 14 my $hellodate = HelloMoose::Date->new(param => 'Moooooose' ); 15 16 $hellodate->message( scalar(localtime()) ); 17 exit; 18
lib/HelloMoose.pm
1 package HelloMoose; 2 3 use Moose; 4 5 has 'param' => ( 6 is => 'rw', 7 isa => 'Str', 8 required => 1, 9 ); 10 11 __PACKAGE__->meta->make_immutable; 12 13 no Moose; 14 15 sub message{ 16 my $self = shift; 17 18 print 'Hello '. $self->param ." World \n"; 19 20 } 21 22 1;
lib/HelloMoose/Date.pm
1 package HelloMoose::Date; 2 3 use Moose; 4 5 extends 'HelloMoose'; 6 7 override 'message' => sub{ 8 #around 'message' => sub{ 9 my $self = shift; 10 my $date = shift; 11 12 print 'Hello '. $date .' '. $self->param ." World \n"; 13 14 }; 15 16 no Moose; 17 18 1;
以下が実行結果。
% ./hello_world.pl Hello Moooooose World Hello Tue Feb 10 00:10:47 2009 Moooooose World
という感じで使い方合ってるのかはわかんないけど、動く!!
ただ、これをoverride → aroundに変えるといきなり怒られる。。。
% ./hello_world.pl Hello Moooooose World Can't call method "param" on unblessed reference at lib/HelloMoose/Date.pm line 12.
この辺でいきなりつまづくあたりがいかにも自分らしい訳ですが・・・
もともと、beforeとかoverrideが「継承」というよりは「Hook」のような挙動っていう風に読めたので(継承元のメソッドはそれ単体で実行されるあたりが)、aroundとの違いを色々いじりながら見ようと
思ったら意外なエラー><
こういうのはやっぱりソース見ないとダメかなーと思いつつ、今日は終了。
次の2章もMooseを前提としたデザパタの話になってるので、もうちょい1章でゆっくりしてから進もうと思います。
=====