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::$_' をつかうようにしています。