Perl で拡張可能なモジュールをかくときに s/^\+// ? $_ : __PACKAGE__ . '::Plugin::$_' とした方がいい理由
Data::Validator のコードの中にこんなのがあった。
sub with {
my($self, @roles) = @_;
foreach my $role(@roles) {
next if ref $role;
$role = Mouse::Util::load_first_existing_class(
__PACKAGE__ . '::Role::' . $role,
$role,
);
}
Mouse::Util::apply_all_roles($self, @roles);
return $self;
}
この場合、やはり s/^\+// ? $_ : __PACKAGE__ . '::Plugin::$_' のイディオムをつかった方が問題がすくないようにおもう。たとえば、Data::Validator::Role::JSON っていう拡張があったとしよう(実際にはなにをするのか想像もつかないけどXP ) この場合、たとえばうっかり Data::Validator::Role::JSON をインストールしわすれてると JSON.pm をよんでしまう。
で、実際そんなことおきうるのかというとおきたことがあって、Sledge::Plugin::JSON をよもうとして JSON.pm を use してたことがあったんですね、なので、それ以後、かならず s/^\+// ? $_ : __PACKAGE__ . '::Plugin::$_' をつかうようにしています。
Published: 2010-12-09(Thu) 23:01