Perl::CriticとMooseを同時に使うとおこられるで書いたように,use Mooseがuse strictしてる扱いにならないので,Perl::CriticのPolicyを追加してみた.
use strict;がコードの頭で宣言されているかをチェックするPolicyはPerl::Critic::Policy::TestingAndDebugging::RequireUseStrictなので,これをちょっといじる.具体的には,_is_use_strictというサブルーチンがuse strict;を見つけるためのwantedサブルーチンになっているので,これがuse Mooseも見つけれるように以下のように変更した.
sub _is_use_strict { my (undef, $elem) = @_; return 0 if !$elem->isa('PPI::Statement::Include'); return 0 if $elem->type() ne 'use'; return 0 if ( $elem->pragma() ne 'strict' && $elem->module() ne 'Moose'); return 1; }
あと,そのままだとPerl::Criticのcore Policyになるので,
sub default_themes { return qw(mine) }
としてmineというテーマにしておく.
この変更を加えて,RequireUseStrictOrUseMooseというクラスに名前を変えて,t/lib/以下に配置した.その後,perlcriticのテストを
use strict; use Test::More; use lib 't/lib'; eval { require Test::Perl::Critic; Test::Perl::Critic->import(-profile => "t/perlcriticrc") }; plan skip_all => "Test::Perl::Critic is not installed." if $@; all_critic_ok("lib");
という風にして,t/perlcriticrcに
theme = core + mine # Using TestingAndDebugging::RequireUseStrictOrUseMoose instead of this. [-TestingAndDebugging::RequireUseStrict]
と書く.mineというテーマを追加することででさっき作ったRequireUseStrictOrUseMooseをロードして,もともとのRequireUseStrictを無効化してる.
これでuse Mooseでもuse strictな扱いになってgood.
むしゃくしゃしてやってみたけど,ここまでやるならuse Moose;してるコードでもきちんとuse strict;を書いた方が,よりわかりやすいし良いかと思いました.つかこれ気持ち悪すぎる.