Login
Change Modules::ProhibitEvilModules::initialize_if_enabled() into a
authorElliot Shank <perl@galumph.com>
Sun, 14 Sep 2008 05:47:35 +0000 (05:47 +0000)
committerElliot Shank <perl@galumph.com>
Sun, 14 Sep 2008 05:47:35 +0000 (05:47 +0000)
custom parser for the "modules" option in preparation for providing an
means for specifying the violation description.

lib/Perl/Critic/Policy/Modules/ProhibitEvilModules.pm
t/Modules/ProhibitEvilModules.run

index 4ed7d6d..08640a8 100644 (file)
@@ -36,7 +36,7 @@ sub supported_parameters {
             name            => 'modules',
             description     => 'The names of or patterns for modules to forbid.',
             default_string  => $EMPTY,
-            behavior        => 'string list',
+            parser          => \&_parse_modules,
         },
     );
 }
@@ -47,41 +47,43 @@ sub applies_to        { return 'PPI::Statement::Include' }
 
 #-----------------------------------------------------------------------------
 
-sub initialize_if_enabled {
-    my ($self, $config) = @_;
+sub _parse_modules {
+    my ($self, $parameter, $config_string) = @_;
 
-    $self->{_evil_modules}    = {};  #Hash
-    $self->{_evil_modules_rx} = [];  #Array
+    return if not defined $config_string;
 
-    #Set config, if defined
-    if ( defined $self->{_modules} ) {
-        my @modules = sort keys %{ $self->{_modules} };
-        foreach my $module ( @modules ) {
-            if ( $module =~ m{ \A [/] (.+) [/] \z }xms ) {
+    my %evil_modules;
+    my @evil_modules_rx;
 
-                # These are module name patterns (e.g. /Acme/)
-                my $re = $1; # Untainting
-                my $pattern = eval { qr/$re/ };  ## no critic (RegularExpressions::.*)
+    my @modules = words_from_string($config_string);
+    foreach my $module ( @modules ) {
+        if ( $module =~ m{ \A [/] (.+) [/] \z }xms ) {
 
-                if ( $EVAL_ERROR ) {
-                    throw_policy_value
-                        policy         => $self->get_short_name(),
-                        option_name    => 'modules',
-                        option_value   => ( join q{", "}, @modules ),
-                        message_suffix =>
-                            qq{contains an invalid regular expression: "$module"};
-                }
+            # These are module name patterns (e.g. /Acme/)
+            my $re = $1; # Untainting
+            my $pattern = eval { qr/$re/ };  ## no critic (RegularExpressions::.*)
 
-                push @{ $self->{_evil_modules_rx} }, $pattern;
-            }
-            else {
-                # These are literal module names (e.g. Acme::Foo)
-                $self->{_evil_modules}->{$module} = 1;
+            if ( $EVAL_ERROR ) {
+                throw_policy_value
+                    policy         => $self->get_short_name(),
+                    option_name    => 'modules',
+                    option_value   => ( join q{", "}, @modules ),
+                    message_suffix =>
+                        qq{contains an invalid regular expression: "$module"};
             }
+
+            push @evil_modules_rx, $pattern;
+        }
+        else {
+            # These are literal module names (e.g. Acme::Foo)
+            $evil_modules{$module} = 1;
         }
     }
 
-    return $TRUE;
+    $self->{_evil_modules}    = \%evil_modules;
+    $self->{_evil_modules_rx} = \@evil_modules_rx;
+
+    return;
 }
 
 #-----------------------------------------------------------------------------
index b543d6c..a1a9cda 100644 (file)
@@ -1,4 +1,12 @@
+## name No modules configured
+## failures 0
+## cut
+
+use Evil::Module qw(bad stuff);
+use Super::Evil::Module;
+
 #-----------------------------------------------------------------------------
+
 ## name 2 evil modules
 ## parms {modules => 'Evil::Module Super::Evil::Module'}
 ## failures 2
@@ -8,6 +16,7 @@ use Evil::Module qw(bad stuff);
 use Super::Evil::Module;
 
 #-----------------------------------------------------------------------------
+
 ## name No evil modules
 ## parms {modules => 'Evil::Module Super::Evil::Module'}
 ## failures 0
@@ -16,6 +25,7 @@ use Super::Evil::Module;
 use Good::Module;
 
 #-----------------------------------------------------------------------------
+
 ## name 2 evil modules, with pattern matching
 ## parms { modules => '/Evil::/ /Demonic/' }
 ## failures 2
@@ -25,6 +35,7 @@ use Evil::Module qw(bad stuff);
 use Demonic::Module
 
 #-----------------------------------------------------------------------------
+
 ## name More evil modules, with mixed config
 ## parms { modules => '/Evil::/ Demonic::Module /Acme/' }
 ## failures 4
@@ -36,6 +47,7 @@ use Demonic::Module;
 use Acme::Foo;
 
 #-----------------------------------------------------------------------------
+
 ## name More evil modules, with more pattern matching
 ## parms { modules => '/Evil::|Demonic::Module|Acme/' }
 ## failures 4
@@ -47,6 +59,7 @@ use Demonic::Module;
 use Acme::Foo;
 
 #-----------------------------------------------------------------------------
+
 ## name Pattern matching exceptions
 ## parms { modules => '/(/' }
 ## failures 0