Benchmark-Perl-Formance-Cargo
view release on metacpan or search on metacpan
share/PerlCritic/Critic/Policy/Modules/RequireVersionVar.pm view on Meta::CPAN
##############################################################################
# $URL: http://perlcritic.tigris.org/svn/perlcritic/trunk/distributions/Perl-Critic/lib/Perl/Critic/Policy/Modules/RequireVersionVar.pm $
# $Date: 2010-06-22 16:14:07 -0400 (Tue, 22 Jun 2010) $
# $Author: clonezone $
# $Revision: 3843 $
##############################################################################
package # hide from indexer
Perl::Critic::Policy::Modules::RequireVersionVar;
use 5.006001;
use strict;
use warnings;
use Readonly;
use List::MoreUtils qw(any);
use Perl::Critic::Utils qw{ :severities };
use base 'Perl::Critic::Policy';
our $VERSION = '1.108';
#-----------------------------------------------------------------------------
Readonly::Scalar my $DESC => q{No package-scoped "$VERSION" variable found}; ## no critic (RequireInterpolation)
Readonly::Scalar my $EXPL => [ 404 ];
#-----------------------------------------------------------------------------
sub supported_parameters { return () }
sub default_severity { return $SEVERITY_LOW }
sub default_themes { return qw(core pbp readability) }
sub applies_to { return 'PPI::Document' }
#-----------------------------------------------------------------------------
sub violates {
my ( $self, $elem, $doc ) = @_;
return if $doc->find_first( \&_is_version_declaration );
#If we get here, then no $VERSION was found
return $self->violation( $DESC, $EXPL, $doc );
}
#-----------------------------------------------------------------------------
sub _is_version_declaration { ## no critic (ArgUnpacking)
return 1 if _is_our_version(@_);
return 1 if _is_vars_version(@_);
return 1 if _is_package_version(@_);
return 1 if _is_readonly_version(@_);
return 0;
}
#-----------------------------------------------------------------------------
sub _is_our_version {
my (undef, $elem) = @_;
$elem->isa('PPI::Statement::Variable') || return 0;
$elem->type() eq 'our' || return 0;
return any { $_ eq '$VERSION' } $elem->variables(); ## no critic (RequireInterpolation)
}
#-----------------------------------------------------------------------------
sub _is_vars_version {
my (undef, $elem) = @_;
$elem->isa('PPI::Statement::Include') || return 0;
$elem->pragma() eq 'vars' || return 0;
return $elem =~ m{ \$VERSION }xms; #Crude, but usually works
}
#-----------------------------------------------------------------------------
sub _is_package_version {
my (undef, $elem) = @_;
$elem->isa('PPI::Token::Symbol') || return 0;
return $elem =~ m{ \A \$ \S+ ::VERSION \z }xms;
#TODO: ensure that it is in _this_ package!
}
#-----------------------------------------------------------------------------
sub _is_readonly_version {
( run in 2.346 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )