[ Index ]

PHP Cross Reference of Unnamed Project

title

Body

[close]

/se3-unattended/var/se3/unattended/install/linuxaux/opt/perl/lib/5.10.0/i586-linux-thread-multi/B/ -> Lint.pm (source)

   1  package B::Lint;
   2  
   3  our $VERSION = '1.09';    ## no critic
   4  
   5  =head1 NAME
   6  
   7  B::Lint - Perl lint
   8  
   9  =head1 SYNOPSIS
  10  
  11  perl -MO=Lint[,OPTIONS] foo.pl
  12  
  13  =head1 DESCRIPTION
  14  
  15  The B::Lint module is equivalent to an extended version of the B<-w>
  16  option of B<perl>. It is named after the program F<lint> which carries
  17  out a similar process for C programs.
  18  
  19  =head1 OPTIONS AND LINT CHECKS
  20  
  21  Option words are separated by commas (not whitespace) and follow the
  22  usual conventions of compiler backend options. Following any options
  23  (indicated by a leading B<->) come lint check arguments. Each such
  24  argument (apart from the special B<all> and B<none> options) is a
  25  word representing one possible lint check (turning on that check) or
  26  is B<no-foo> (turning off that check). Before processing the check
  27  arguments, a standard list of checks is turned on. Later options
  28  override earlier ones. Available options are:
  29  
  30  =over 8
  31  
  32  =item B<magic-diamond>
  33  
  34  Produces a warning whenever the magic C<E<lt>E<gt>> readline is
  35  used. Internally it uses perl's two-argument open which itself treats
  36  filenames with special characters specially. This could allow
  37  interestingly named files to have unexpected effects when reading.
  38  
  39    % touch 'rm *|'
  40    % perl -pe 1
  41  
  42  The above creates a file named C<rm *|>. When perl opens it with
  43  C<E<lt>E<gt>> it actually executes the shell program C<rm *>. This
  44  makes C<E<lt>E<gt>> dangerous to use carelessly.
  45  
  46  =item B<context>
  47  
  48  Produces a warning whenever an array is used in an implicit scalar
  49  context. For example, both of the lines
  50  
  51      $foo = length(@bar);
  52      $foo = @bar;
  53  
  54  will elicit a warning. Using an explicit B<scalar()> silences the
  55  warning. For example,
  56  
  57      $foo = scalar(@bar);
  58  
  59  =item B<implicit-read> and B<implicit-write>
  60  
  61  These options produce a warning whenever an operation implicitly
  62  reads or (respectively) writes to one of Perl's special variables.
  63  For example, B<implicit-read> will warn about these:
  64  
  65      /foo/;
  66  
  67  and B<implicit-write> will warn about these:
  68  
  69      s/foo/bar/;
  70  
  71  Both B<implicit-read> and B<implicit-write> warn about this:
  72  
  73      for (@a) { ... }
  74  
  75  =item B<bare-subs>
  76  
  77  This option warns whenever a bareword is implicitly quoted, but is also
  78  the name of a subroutine in the current package. Typical mistakes that it will
  79  trap are:
  80  
  81      use constant foo => 'bar';
  82      @a = ( foo => 1 );
  83      $b{foo} = 2;
  84  
  85  Neither of these will do what a naive user would expect.
  86  
  87  =item B<dollar-underscore>
  88  
  89  This option warns whenever C<$_> is used either explicitly anywhere or
  90  as the implicit argument of a B<print> statement.
  91  
  92  =item B<private-names>
  93  
  94  This option warns on each use of any variable, subroutine or
  95  method name that lives in a non-current package but begins with
  96  an underscore ("_"). Warnings aren't issued for the special case
  97  of the single character name "_" by itself (e.g. C<$_> and C<@_>).
  98  
  99  =item B<undefined-subs>
 100  
 101  This option warns whenever an undefined subroutine is invoked.
 102  This option will only catch explicitly invoked subroutines such
 103  as C<foo()> and not indirect invocations such as C<&$subref()>
 104  or C<$obj-E<gt>meth()>. Note that some programs or modules delay
 105  definition of subs until runtime by means of the AUTOLOAD
 106  mechanism.
 107  
 108  =item B<regexp-variables>
 109  
 110  This option warns whenever one of the regexp variables C<$`>, C<$&> or C<$'>
 111  is used. Any occurrence of any of these variables in your
 112  program can slow your whole program down. See L<perlre> for
 113  details.
 114  
 115  =item B<all>
 116  
 117  Turn all warnings on.
 118  
 119  =item B<none>
 120  
 121  Turn all warnings off.
 122  
 123  =back
 124  
 125  =head1 NON LINT-CHECK OPTIONS
 126  
 127  =over 8
 128  
 129  =item B<-u Package>
 130  
 131  Normally, Lint only checks the main code of the program together
 132  with all subs defined in package main. The B<-u> option lets you
 133  include other package names whose subs are then checked by Lint.
 134  
 135  =back
 136  
 137  =head1 EXTENDING LINT
 138  
 139  Lint can be extended by with plugins. Lint uses L<Module::Pluggable>
 140  to find available plugins. Plugins are expected but not required to
 141  inform Lint of which checks they are adding.
 142  
 143  The C<< B::Lint->register_plugin( MyPlugin => \@new_checks ) >> method
 144  adds the list of C<@new_checks> to the list of valid checks. If your
 145  module wasn't loaded by L<Module::Pluggable> then your class name is
 146  added to the list of plugins.
 147  
 148  You must create a C<match( \%checks )> method in your plugin class or one
 149  of its parents. It will be called on every op as a regular method call
 150  with a hash ref of checks as its parameter.
 151  
 152  The class methods C<< B::Lint->file >> and C<< B::Lint->line >> contain
 153  the current filename and line number.
 154  
 155    package Sample;
 156    use B::Lint;
 157    B::Lint->register_plugin( Sample => [ 'good_taste' ] );
 158    
 159    sub match {
 160        my ( $op, $checks_href ) = shift @_;
 161        if ( $checks_href->{good_taste} ) {
 162            ...
 163        }
 164    }
 165  
 166  =head1 TODO
 167  
 168  =over
 169  
 170  =item while(<FH>) stomps $_
 171  
 172  =item strict oo
 173  
 174  =item unchecked system calls
 175  
 176  =item more tests, validate against older perls
 177  
 178  =back
 179  
 180  =head1 BUGS
 181  
 182  This is only a very preliminary version.
 183  
 184  =head1 AUTHOR
 185  
 186  Malcolm Beattie, mbeattie@sable.ox.ac.uk.
 187  
 188  =cut
 189  
 190  use strict;
 191  use B qw( walkoptree_slow
 192      main_root main_cv walksymtable parents
 193      OPpOUR_INTRO
 194      OPf_WANT_VOID OPf_WANT_LIST OPf_WANT OPf_STACKED SVf_POK );
 195  use Carp 'carp';
 196  
 197  # The current M::P doesn't know about .pmc files.
 198  use Module::Pluggable ( require => 1 );
 199  
 200  use List::Util 'first';
 201  ## no critic Prototypes
 202  sub any (&@) { my $test = shift @_; $test->() and return 1 for @_; return 0 }
 203  
 204  BEGIN {
 205  
 206      # Import or create some constants from B. B doesn't provide
 207      # everything I need so some things like OPpCONST_BARE are defined
 208      # here.
 209      for my $sym ( qw( begin_av check_av init_av end_av ),
 210          [ 'OPpCONST_BARE' => 64 ] )
 211      {
 212          my $val;
 213          ( $sym, $val ) = @$sym if ref $sym;
 214  
 215          if ( any { $sym eq $_ } @B::EXPORT_OK, @B::EXPORT ) {
 216              B->import($sym);
 217          }
 218          else {
 219              require constant;
 220              constant->import( $sym => $val );
 221          }
 222      }
 223  }
 224  
 225  my $file     = "unknown";    # shadows current filename
 226  my $line     = 0;            # shadows current line number
 227  my $curstash = "main";       # shadows current stash
 228  my $curcv;                   # shadows current B::CV for pad lookups
 229  
 230  sub file     {$file}
 231  sub line     {$line}
 232  sub curstash {$curstash}
 233  sub curcv    {$curcv}
 234  
 235  # Lint checks
 236  my %check;
 237  my %implies_ok_context;
 238  
 239  map( $implies_ok_context{$_}++,
 240      qw(scalar av2arylen aelem aslice helem hslice
 241          keys values hslice defined undef delete) );
 242  
 243  # Lint checks turned on by default
 244  my @default_checks
 245      = qw(context magic_diamond undefined_subs regexp_variables);
 246  
 247  my %valid_check;
 248  
 249  # All valid checks
 250  for my $check (
 251      qw(context implicit_read implicit_write dollar_underscore
 252      private_names bare_subs undefined_subs regexp_variables
 253      magic_diamond )
 254      )
 255  {
 256      $valid_check{$check} = __PACKAGE__;
 257  }
 258  
 259  # Debugging options
 260  my ($debug_op);
 261  
 262  my %done_cv;           # used to mark which subs have already been linted
 263  my @extra_packages;    # Lint checks mainline code and all subs which are
 264                         # in main:: or in one of these packages.
 265  
 266  sub warning {
 267      my $format = ( @_ < 2 ) ? "%s" : shift @_;
 268      warn sprintf( "$format at %s line %d\n", @_, $file, $line );
 269      return undef;      ## no critic undef
 270  }
 271  
 272  # This gimme can't cope with context that's only determined
 273  # at runtime via dowantarray().
 274  sub gimme {
 275      my $op    = shift @_;
 276      my $flags = $op->flags;
 277      if ( $flags & OPf_WANT ) {
 278          return ( ( $flags & OPf_WANT ) == OPf_WANT_LIST ? 1 : 0 );
 279      }
 280      return undef;      ## no critic undef
 281  }
 282  
 283  my @plugins = __PACKAGE__->plugins;
 284  
 285  sub inside_grepmap {
 286  
 287      # A boolean function to be used while inside a B::walkoptree_slow
 288      # call. If we are in the EXPR part of C<grep EXPR, ...> or C<grep
 289      # { EXPR } ...>, this returns true.
 290      return any { $_->name =~ m/\A(?:grep|map)/xms } @{ parents() };
 291  }
 292  
 293  sub inside_foreach_modifier {
 294  
 295      # TODO: use any()
 296  
 297      # A boolean function to be used while inside a B::walkoptree_slow
 298      # call. If we are in the EXPR part of C<EXPR foreach ...> this
 299      # returns true.
 300      for my $ancestor ( @{ parents() } ) {
 301          next unless $ancestor->name eq 'leaveloop';
 302  
 303          my $first = $ancestor->first;
 304          next unless $first->name eq 'enteriter';
 305  
 306          next if $first->redoop->name =~ m/\A(?:next|db|set)state\z/xms;
 307  
 308          return 1;
 309      }
 310      return 0;
 311  }
 312  
 313  for (
 314      [qw[ B::PADOP::gv_harder gv padix]],
 315      [qw[ B::SVOP::sv_harder  sv targ]],
 316      [qw[ B::SVOP::gv_harder gv padix]]
 317      )
 318  {
 319  
 320      # I'm generating some functions here because they're mostly
 321      # similar. It's all for compatibility with threaded
 322      # perl. Perhaps... this code should inspect $Config{usethreads}
 323      # and generate a *specific* function. I'm leaving it generic for
 324      # the moment.
 325      #
 326      # In threaded perl SVs and GVs aren't used directly in the optrees
 327      # like they are in non-threaded perls. The ops that would use a SV
 328      # or GV keep an index into the subroutine's scratchpad. I'm
 329      # currently ignoring $cv->DEPTH and that might be at my peril.
 330  
 331      my ( $subname, $attr, $pad_attr ) = @$_;
 332      my $target = do {    ## no critic strict
 333          no strict 'refs';
 334          \*$subname;
 335      };
 336      *$target = sub {
 337          my ($op) = @_;
 338  
 339          my $elt;
 340          if ( not $op->isa('B::PADOP') ) {
 341              $elt = $op->$attr;
 342          }
 343          return $elt if eval { $elt->isa('B::SV') };
 344  
 345          my $ix         = $op->$pad_attr;
 346          my @entire_pad = $curcv->PADLIST->ARRAY;
 347          my @elts       = map +( $_->ARRAY )[$ix], @entire_pad;
 348          ($elt) = first {
 349              eval { $_->isa('B::SV') } ? $_ : ();
 350              }
 351              @elts[ 0, reverse 1 .. $#elts ];
 352          return $elt;
 353      };
 354  }
 355  
 356  sub B::OP::lint {
 357      my ($op) = @_;
 358  
 359      # This is a fallback ->lint for all the ops where I haven't
 360      # defined something more specific. Nothing happens here.
 361  
 362      # Call all registered plugins
 363      my $m;
 364      $m = $_->can('match'), $op->$m( \%check ) for @plugins;
 365      return;
 366  }
 367  
 368  sub B::COP::lint {
 369      my ($op) = @_;
 370  
 371      # nextstate ops sit between statements. Whenever I see one I
 372      # update the current info on file, line, and stash. This code also
 373      # updates it when it sees a dbstate or setstate op. I have no idea
 374      # what those are but having seen them mentioned together in other
 375      # parts of the perl I think they're kind of equivalent.
 376      if ( $op->name =~ m/\A(?:next|db|set)state\z/ ) {
 377          $file     = $op->file;
 378          $line     = $op->line;
 379          $curstash = $op->stash->NAME;
 380      }
 381  
 382      # Call all registered plugins
 383      my $m;
 384      $m = $_->can('match'), $op->$m( \%check ) for @plugins;
 385      return;
 386  }
 387  
 388  sub B::UNOP::lint {
 389      my ($op) = @_;
 390  
 391      my $opname = $op->name;
 392  
 393  CONTEXT: {
 394  
 395          # Check arrays and hashes in scalar or void context where
 396          # scalar() hasn't been used.
 397  
 398          next
 399              unless $check{context}
 400              and $opname =~ m/\Arv2[ah]v\z/xms
 401              and not gimme($op);
 402  
 403          my ( $parent, $gparent ) = @{ parents() }[ 0, 1 ];
 404          my $pname = $parent->name;
 405  
 406          next if $implies_ok_context{$pname};
 407  
 408          # Three special cases to deal with: "foreach (@foo)", "delete
 409          # $a{$b}", and "exists $a{$b}" null out the parent so we have to
 410          # check for a parent of pp_null and a grandparent of
 411          # pp_enteriter, pp_delete, pp_exists
 412  
 413          next
 414              if $pname eq "null"
 415              and $gparent->name =~ m/\A(?:delete|enteriter|exists)\z/xms;
 416  
 417          # our( @bar ); would also trigger this error so I exclude
 418          # that.
 419          next
 420              if $op->private & OPpOUR_INTRO
 421              and ( $op->flags & OPf_WANT ) == OPf_WANT_VOID;
 422  
 423          warning 'Implicit scalar context for %s in %s',
 424              $opname eq "rv2av" ? "array" : "hash", $parent->desc;
 425      }
 426  
 427  PRIVATE_NAMES: {
 428  
 429          # Looks for calls to methods with names that begin with _ and
 430          # that aren't visible within the current package. Maybe this
 431          # should look at @ISA.
 432          next
 433              unless $check{private_names}
 434              and $opname =~ m/\Amethod/xms;
 435  
 436          my $methop = $op->first;
 437          next unless $methop->name eq "const";
 438  
 439          my $method = $methop->sv_harder->PV;
 440          next
 441              unless $method =~ m/\A_/xms
 442              and not defined &{"$curstash\::$method"};
 443  
 444          warning q[Illegal reference to private method name '%s'], $method;
 445      }
 446  
 447      # Call all registered plugins
 448      my $m;
 449      $m = $_->can('match'), $op->$m( \%check ) for @plugins;
 450      return;
 451  }
 452  
 453  sub B::PMOP::lint {
 454      my ($op) = @_;
 455  
 456  IMPLICIT_READ: {
 457  
 458          # Look for /.../ that doesn't use =~ to bind to something.
 459          next
 460              unless $check{implicit_read}
 461              and $op->name eq "match"
 462              and not( $op->flags & OPf_STACKED
 463              or inside_grepmap() );
 464          warning 'Implicit match on $_';
 465      }
 466  
 467  IMPLICIT_WRITE: {
 468  
 469          # Look for s/.../.../ that doesn't use =~ to bind to
 470          # something.
 471          next
 472              unless $check{implicit_write}
 473              and $op->name eq "subst"
 474              and not $op->flags & OPf_STACKED;
 475          warning 'Implicit substitution on $_';
 476      }
 477  
 478      # Call all registered plugins
 479      my $m;
 480      $m = $_->can('match'), $op->$m( \%check ) for @plugins;
 481      return;
 482  }
 483  
 484  sub B::LOOP::lint {
 485      my ($op) = @_;
 486  
 487  IMPLICIT_FOO: {
 488  
 489          # Look for C<for ( ... )>.
 490          next
 491              unless ( $check{implicit_read} or $check{implicit_write} )
 492              and $op->name eq "enteriter";
 493  
 494          my $last = $op->last;
 495          next
 496              unless $last->name         eq "gv"
 497              and $last->gv_harder->NAME eq "_"
 498              and $op->redoop->name =~ m/\A(?:next|db|set)state\z/xms;
 499  
 500          warning 'Implicit use of $_ in foreach';
 501      }
 502  
 503      # Call all registered plugins
 504      my $m;
 505      $m = $_->can('match'), $op->$m( \%check ) for @plugins;
 506      return;
 507  }
 508  
 509  # In threaded vs non-threaded perls you'll find that threaded perls
 510  # use PADOP in place of SVOPs so they can do lookups into the
 511  # scratchpad to find things. I suppose this is so a optree can be
 512  # shared between threads and all symbol table muckery will just get
 513  # written to a scratchpad.
 514  *B::PADOP::lint = \&B::SVOP::lint;
 515  
 516  sub B::SVOP::lint {
 517      my ($op) = @_;
 518  
 519  MAGIC_DIAMOND: {
 520          next
 521              unless $check{magic_diamond}
 522              and parents()->[0]->name eq 'readline'
 523              and $op->gv_harder->NAME eq 'ARGV';
 524  
 525          warning 'Use of <>';
 526      }
 527  
 528  BARE_SUBS: {
 529          next
 530              unless $check{bare_subs}
 531              and $op->name eq 'const'
 532              and $op->private & OPpCONST_BARE;
 533  
 534          my $sv = $op->sv_harder;
 535          next unless $sv->FLAGS & SVf_POK;
 536  
 537          my $sub     = $sv->PV;
 538          my $subname = "$curstash\::$sub";
 539  
 540          # I want to skip over things that were declared with the
 541          # constant pragma. Well... sometimes. Hmm. I want to ignore
 542          # C<<use constant FOO => ...>> but warn on C<<FOO => ...>>
 543          # later. The former is typical declaration syntax and the
 544          # latter would be an error.
 545          #
 546          # Skipping over both could be handled by looking if
 547          # $constant::declared{$subname} is true.
 548  
 549          # Check that it's a function.
 550          next
 551              unless exists &{"$curstash\::$sub"};
 552  
 553          warning q[Bare sub name '%s' interpreted as string], $sub;
 554      }
 555  
 556  PRIVATE_NAMES: {
 557          next unless $check{private_names};
 558  
 559          my $opname = $op->name;
 560          if ( $opname =~ m/\Agv(?:sv)?\z/xms ) {
 561  
 562              # Looks for uses of variables and stuff that are named
 563              # private and we're not in the same package.
 564              my $gv   = $op->gv_harder;
 565              my $name = $gv->NAME;
 566              next
 567                  unless $name =~ m/\A_./xms
 568                  and $gv->STASH->NAME ne $curstash;
 569  
 570              warning q[Illegal reference to private name '%s'], $name;
 571          }
 572          elsif ( $opname eq "method_named" ) {
 573              my $method = $op->sv_harder->PV;
 574              next unless $method =~ m/\A_./xms;
 575  
 576              warning q[Illegal reference to private method name '%s'], $method;
 577          }
 578      }
 579  
 580  DOLLAR_UNDERSCORE: {
 581  
 582          # Warn on uses of $_ with a few exceptions. I'm not warning on
 583          # $_ inside grep, map, or statement modifer foreach because
 584          # they localize $_ and it'd be impossible to use these
 585          # features without getting warnings.
 586  
 587          next
 588              unless $check{dollar_underscore}
 589              and $op->name            eq "gvsv"
 590              and $op->gv_harder->NAME eq "_"
 591              and not( inside_grepmap
 592              or inside_foreach_modifier );
 593  
 594          warning 'Use of $_';
 595      }
 596  
 597  REGEXP_VARIABLES: {
 598  
 599          # Look for any uses of $`, $&, or $'.
 600          next
 601              unless $check{regexp_variables}
 602              and $op->name eq "gvsv";
 603  
 604          my $name = $op->gv_harder->NAME;
 605          next unless $name =~ m/\A[\&\'\`]\z/xms;
 606  
 607          warning 'Use of regexp variable $%s', $name;
 608      }
 609  
 610  UNDEFINED_SUBS: {
 611  
 612          # Look for calls to functions that either don't exist or don't
 613          # have a definition.
 614          next
 615              unless $check{undefined_subs}
 616              and $op->name       eq "gv"
 617              and $op->next->name eq "entersub";
 618  
 619          my $gv      = $op->gv_harder;
 620          my $subname = $gv->STASH->NAME . "::" . $gv->NAME;
 621  
 622          no strict 'refs';    ## no critic strict
 623          if ( not exists &$subname ) {
 624              $subname =~ s/\Amain:://;
 625              warning q[Nonexistant subroutine '%s' called], $subname;
 626          }
 627          elsif ( not defined &$subname ) {
 628              $subname =~ s/\A\&?main:://;
 629              warning q[Undefined subroutine '%s' called], $subname;
 630          }
 631      }
 632  
 633      # Call all registered plugins
 634      my $m;
 635      $m = $_->can('match'), $op->$m( \%check ) for @plugins;
 636      return;
 637  }
 638  
 639  sub B::GV::lintcv {
 640  
 641      # Example: B::svref_2object( \ *A::Glob )->lintcv
 642  
 643      my $gv = shift @_;
 644      my $cv = $gv->CV;
 645      return unless $cv->can('lintcv');
 646      $cv->lintcv;
 647      return;
 648  }
 649  
 650  sub B::CV::lintcv {
 651  
 652      # Example: B::svref_2object( \ &foo )->lintcv
 653  
 654      # Write to the *global* $
 655      $curcv = shift @_;
 656  
 657      #warn sprintf("lintcv: %s::%s (done=%d)\n",
 658      #         $gv->STASH->NAME, $gv->NAME, $done_cv{$$curcv});#debug
 659      return unless ref($curcv) and $$curcv and not $done_cv{$$curcv}++;
 660      my $root = $curcv->ROOT;
 661  
 662      #warn "    root = $root (0x$$root)\n";#debug
 663      walkoptree_slow( $root, "lint" ) if $$root;
 664      return;
 665  }
 666  
 667  sub do_lint {
 668      my %search_pack;
 669  
 670      # Copy to the global $curcv for use in pad lookups.
 671      $curcv = main_cv;
 672      walkoptree_slow( main_root, "lint" ) if ${ main_root() };
 673  
 674      # Do all the miscellaneous non-sub blocks.
 675      for my $av ( begin_av, init_av, check_av, end_av ) {
 676          next unless eval { $av->isa('B::AV') };
 677          for my $cv ( $av->ARRAY ) {
 678              next unless ref($cv) and $cv->FILE eq $0;
 679              $cv->lintcv;
 680          }
 681      }
 682  
 683      walksymtable(
 684          \%main::,
 685          sub {
 686              if ( $_[0]->FILE eq $0 ) { $_[0]->lintcv }
 687          },
 688          sub {1}
 689      );
 690      return;
 691  }
 692  
 693  sub compile {
 694      my @options = @_;
 695  
 696      # Turn on default lint checks
 697      for my $opt (@default_checks) {
 698          $check{$opt} = 1;
 699      }
 700  
 701  OPTION:
 702      while ( my $option = shift @options ) {
 703          my ( $opt, $arg );
 704          unless ( ( $opt, $arg ) = $option =~ m/\A-(.)(.*)/xms ) {
 705              unshift @options, $option;
 706              last OPTION;
 707          }
 708  
 709          if ( $opt eq "-" && $arg eq "-" ) {
 710              shift @options;
 711              last OPTION;
 712          }
 713          elsif ( $opt eq "D" ) {
 714              $arg ||= shift @options;
 715              foreach my $arg ( split //, $arg ) {
 716                  if ( $arg eq "o" ) {
 717                      B->debug(1);
 718                  }
 719                  elsif ( $arg eq "O" ) {
 720                      $debug_op = 1;
 721                  }
 722              }
 723          }
 724          elsif ( $opt eq "u" ) {
 725              $arg ||= shift @options;
 726              push @extra_packages, $arg;
 727          }
 728      }
 729  
 730      foreach my $opt ( @default_checks, @options ) {
 731          $opt =~ tr/-/_/;
 732          if ( $opt eq "all" ) {
 733              %check = %valid_check;
 734          }
 735          elsif ( $opt eq "none" ) {
 736              %check = ();
 737          }
 738          else {
 739              if ( $opt =~ s/\Ano_//xms ) {
 740                  $check{$opt} = 0;
 741              }
 742              else {
 743                  $check{$opt} = 1;
 744              }
 745              carp "No such check: $opt"
 746                  unless defined $valid_check{$opt};
 747          }
 748      }
 749  
 750      # Remaining arguments are things to check. So why aren't I
 751      # capturing them or something? I don't know.
 752  
 753      return \&do_lint;
 754  }
 755  
 756  sub register_plugin {
 757      my ( undef, $plugin, $new_checks ) = @_;
 758  
 759      # Allow the user to be lazy and not give us a name.
 760      $plugin = caller unless defined $plugin;
 761  
 762      # Register the plugin's named checks, if any.
 763      for my $check ( eval {@$new_checks} ) {
 764          if ( not defined $check ) {
 765              carp 'Undefined value in checks.';
 766              next;
 767          }
 768          if ( exists $valid_check{$check} ) {
 769              carp
 770                  "$check is already registered as a $valid_check{$check} feature.";
 771              next;
 772          }
 773  
 774          $valid_check{$check} = $plugin;
 775      }
 776  
 777      # Register a non-Module::Pluggable loaded module. @plugins already
 778      # contains whatever M::P found on disk. The user might load a
 779      # plugin manually from some arbitrary namespace and ask for it to
 780      # be registered.
 781      if ( not any { $_ eq $plugin } @plugins ) {
 782          push @plugins, $plugin;
 783      }
 784  
 785      return;
 786  }
 787  
 788  1;


Generated: Tue Mar 17 22:47:18 2015 Cross-referenced by PHPXref 0.7.1