Do not use Devel::Declare, a magical source filter.
モダンPerlの世界へようこそ 第11回でDevel::Declareが取り上げられていました。
このモジュールは確かに「スゴイ」のですが,個人的には使うべきではないと思っています。もちろん,Devel::DeclareのフロントエンドであるMethod::SignaturesやMooseX::Declareも同様です。
これはDevel::Declareというよりはソースフィルタモジュール一般に言えることですが,問題はコンパイルと実行の間にプリプロセスという処理あることです。そのため,ブラックボックスを増やすことになり,デバッグが困難になります。
また,Devel::DeclareはPerlに新しい機能を追加するためのモジュールというより,Perlの方言を書くためのモジュールといえます。
たとえば以下のコードはMooseX::DeclareのSYNOPSISからとったものです:
use MooseX::Declare; class BankAccount { has 'balance' => ( isa => 'Num', is => 'rw', default => 0 ); method deposit (Num $amount) { $self->balance( $self->balance + $amount ); } method withdraw (Num $amount) { my $current_balance = $self->balance(); ( $current_balance >= $amount ) || confess "Account overdrawn"; $self->balance( $current_balance - $amount ); } } class CheckingAccount extends BankAccount { has 'overdraft_account' => ( isa => 'BankAccount', is => 'rw' ); before withdraw (Num $amount) { my $overdraft_amount = $amount - $self->balance(); if ( $self->overdraft_account && $overdraft_amount > 0 ) { $self->overdraft_account->withdraw($overdraft_amount); $self->deposit($overdraft_amount); } } }
確かにこのような構文は魅力的ですが,これはもはやPerlではなく,RubyやJavaへのあこがれが生み出したPerlの方言としか言いようがありません。もし使うとしても,これらがプリプロセッサであるということは留意したほうがいいいでしょう。