tokuhirom's Blog

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