use Mooseでもuse strict扱いになるようにPerl::Criticをごにょごにょ

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;を書いた方が,よりわかりやすいし良いかと思いました.つかこれ気持ち悪すぎる.