ちょっと恣意的なタイトルですが、つまりこういうことです。
package Foo;
# 地点A
use Carp qw(croak confess);
use Scalar::Util qw(blessed);
use Any::Moose; # 明示的にuse Mouseしても同様。no Mouseも同様。
no Any::Moose;
__PACKAGE__->meta->make_immutable;
# 地点B
1;
上記のようなコードで、Mouseがロードされる(Mooseがロードされてない)場合、地点Bではcroakは使えますがconfessやblessedが名前空間から除かれています。
現在のMoose(0.25)の場合、no Mooseしても、use Mooseした時に既にインポートされていた(つまりuse Mooseによって始めてインポートされたわけでない、つまり地点Aでインポートされた)シンボルは、名前空間から取り除かれません。
解決策としては、素直に完全修飾名でScalar::Util::blessedやCarp::confessなどとすることです。その場合には上記のような事情があるということで最初からuse Scalar::Util qw();などとして意図を明確にしておいた方が良いかも知れません。
勿論、no Mooseした後(地点B)にuse Carp qw(:DEFAULT confess);することでも良いですし、もしかしたらその方が座りがよいかも知れません。
コメントする