File Coverage

bin/require-perl-tags-packed
Criterion Covered Total %
statement 139 449 30.9
branch 5 140 3.5
condition 1 34 2.9
subroutine 39 109 35.7
pod 44 48 91.6
total 228 780 29.2


line stmt bran cond sub pod time code
1             #!/usr/bin/env perl
2              
3             # This chunk of stuff was generated by App::FatPacker. To find the original
4             # file's code, look for the end of this BEGIN block or the string 'FATPACK'
5             BEGIN {
6 1     1   3 my %fatpacked;
7              
8 1         11 $fatpacked{"App/Perl/Tags.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'APP_PERL_TAGS';
9             #!/usr/bin/env perl
10             use 5.006;
11             use strict; use warnings;
12            
13             package App::Perl::Tags;
14             use Getopt::Long ();
15             use Pod::Usage qw/pod2usage/;
16             use File::Find::Rule;
17            
18             use Perl::Tags;
19             use Perl::Tags::Hybrid;
20             use Perl::Tags::Naive::Moose; # includes ::Naive
21            
22             our $VERSION = '0.02';
23            
24             sub run {
25             my $class = shift;
26            
27             my %options = (
28             outfile => 'perltags',
29             files => undef,
30             depth => 10,
31             variables => 1,
32             ppi => 0,
33             prune => [ ],
34             help => sub { $class->usage() },
35             version => sub { $class->version() },
36             );
37            
38             Getopt::Long::GetOptions(
39             \%options,
40             'help|h',
41             'version|v',
42             'outfile|o=s',
43             'files|L=s',
44             'prune=s@',
45             'depth|d=i',
46             'variables|vars!',
47             'ppi|p!',
48             );
49            
50             if (defined $options{files}) {
51             # Do not descend into explicitly specified files.
52             $options{depth} = 1;
53             } else {
54             # If not files are specified via -files options, we expect some
55             # paths after all the options.
56             $class->usage() unless @ARGV
57             }
58            
59             $options{paths} = \@ARGV;
60            
61             my $self = $class->new(%options);
62             $self->main();
63             exit();
64             }
65            
66             sub new {
67             my ($class, %options) = @_;
68             $options{prune} = [ '.git', '.svn' ] unless @{ $options{prune} || [] };
69             return bless \%options, $class;
70             }
71            
72             sub version {
73             print "perl-tags v. $VERSION (Perl Tags v. $Perl::Tags::VERSION)\n";
74             exit();
75             }
76            
77             sub usage {
78             pod2usage(0);
79             }
80            
81             sub main {
82             my $self = shift;
83            
84             my %args = (
85             max_level => $self->{depth},
86             exts => 1,
87             do_variables => $self->{variables},
88             );
89            
90             my @taggers = ( Perl::Tags::Naive::Moose->new( %args ) );
91             if ($self->{ppi}) {
92             require Perl::Tags::PPI;
93             push @taggers, Perl::Tags::PPI->new( %args );
94             }
95            
96             my $ptag = Perl::Tags::Hybrid->new( %args, \@taggers );
97            
98             my @files = do {
99             if (defined $self->{files}) {
100             if ('-' eq $self->{files}) {
101             map { chomp; $_ } <STDIN>;
102             } else {
103             my $fh = IO::File->new($self->{files})
104             or die "cannot open $$self{files} for reading: $!";
105             map { chomp; $_ } <$fh>;
106             }
107             } else {
108             $self->get_files;
109             }
110             };
111            
112             $ptag->process(files => \@files);
113             $ptag->output(outfile => $self->{outfile});
114             return;
115             }
116            
117             sub get_files {
118             my $self = shift;
119             my @prune = @{ $self->{prune} };
120             my @paths = @{ $self->{paths} };
121            
122             my $rule = File::Find::Rule->new;
123            
124             my @files =
125             $rule->or(
126             $rule->new
127             ->directory
128             ->name(@prune)
129             ->prune
130             ->discard,
131             $rule->new
132             ->file,
133             )->in(@paths);
134            
135             return @files;
136             }
137            
138             =head1 AUTHOR
139            
140             Copyright 2009-2014, Steffen Mueller, with contributions from osfameron
141            
142             =cut
143            
144             # vim:ts=2:sw=2
145            
146             1;
147             APP_PERL_TAGS
148              
149 1         46 $fatpacked{"Carp.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARP';
150             package Carp;
151            
152             { use 5.006; }
153             use strict;
154             use warnings;
155             BEGIN {
156             # Very old versions of warnings.pm load Carp. This can go wrong due
157             # to the circular dependency. If warnings is invoked before Carp,
158             # then warnings starts by loading Carp, then Carp (above) tries to
159             # invoke warnings, and gets nothing because warnings is in the process
160             # of loading and hasn't defined its import method yet. If we were
161             # only turning on warnings ("use warnings" above) this wouldn't be too
162             # bad, because Carp would just gets the state of the -w switch and so
163             # might not get some warnings that it wanted. The real problem is
164             # that we then want to turn off Unicode warnings, but "no warnings
165             # 'utf8'" won't be effective if we're in this circular-dependency
166             # situation. So, if warnings.pm is an affected version, we turn
167             # off all warnings ourselves by directly setting ${^WARNING_BITS}.
168             # On unaffected versions, we turn off just Unicode warnings, via
169             # the proper API.
170             if(!defined($warnings::VERSION) || eval($warnings::VERSION) < 1.06) {
171             ${^WARNING_BITS} = "";
172             } else {
173             "warnings"->unimport("utf8");
174             }
175             }
176            
177             sub _fetch_sub { # fetch sub without autovivifying
178             my($pack, $sub) = @_;
179             $pack .= '::';
180             # only works with top-level packages
181             return unless exists($::{$pack});
182             for ($::{$pack}) {
183             return unless ref \$_ eq 'GLOB' && *$_{HASH} && exists $$_{$sub};
184             for ($$_{$sub}) {
185             return ref \$_ eq 'GLOB' ? *$_{CODE} : undef
186             }
187             }
188             }
189            
190             # UTF8_REGEXP_PROBLEM is a compile-time constant indicating whether Carp
191             # must avoid applying a regular expression to an upgraded (is_utf8)
192             # string. There are multiple problems, on different Perl versions,
193             # that require this to be avoided. All versions prior to 5.13.8 will
194             # load utf8_heavy.pl for the swash system, even if the regexp doesn't
195             # use character classes. Perl 5.6 and Perls [5.11.2, 5.13.11) exhibit
196             # specific problems when Carp is being invoked in the aftermath of a
197             # syntax error.
198             BEGIN {
199             if("$]" < 5.013011) {
200             *UTF8_REGEXP_PROBLEM = sub () { 1 };
201             } else {
202             *UTF8_REGEXP_PROBLEM = sub () { 0 };
203             }
204             }
205            
206             # is_utf8() is essentially the utf8::is_utf8() function, which indicates
207             # whether a string is represented in the upgraded form (using UTF-8
208             # internally). As utf8::is_utf8() is only available from Perl 5.8
209             # onwards, extra effort is required here to make it work on Perl 5.6.
210             BEGIN {
211             if(defined(my $sub = _fetch_sub utf8 => 'is_utf8')) {
212             *is_utf8 = $sub;
213             } else {
214             # black magic for perl 5.6
215             *is_utf8 = sub { unpack("C", "\xaa".$_[0]) != 170 };
216             }
217             }
218            
219             # The downgrade() function defined here is to be used for attempts to
220             # downgrade where it is acceptable to fail. It must be called with a
221             # second argument that is a true value.
222             BEGIN {
223             if(defined(my $sub = _fetch_sub utf8 => 'downgrade')) {
224             *downgrade = \&{"utf8::downgrade"};
225             } else {
226             *downgrade = sub {
227             my $r = "";
228             my $l = length($_[0]);
229             for(my $i = 0; $i != $l; $i++) {
230             my $o = ord(substr($_[0], $i, 1));
231             return if $o > 255;
232             $r .= chr($o);
233             }
234             $_[0] = $r;
235             };
236             }
237             }
238            
239             our $VERSION = '1.3301';
240            
241             our $MaxEvalLen = 0;
242             our $Verbose = 0;
243             our $CarpLevel = 0;
244             our $MaxArgLen = 64; # How much of each argument to print. 0 = all.
245             our $MaxArgNums = 8; # How many arguments to print. 0 = all.
246             our $RefArgFormatter = undef; # allow caller to format reference arguments
247            
248             require Exporter;
249             our @ISA = ('Exporter');
250             our @EXPORT = qw(confess croak carp);
251             our @EXPORT_OK = qw(cluck verbose longmess shortmess);
252             our @EXPORT_FAIL = qw(verbose); # hook to enable verbose mode
253            
254             # The members of %Internal are packages that are internal to perl.
255             # Carp will not report errors from within these packages if it
256             # can. The members of %CarpInternal are internal to Perl's warning
257             # system. Carp will not report errors from within these packages
258             # either, and will not report calls *to* these packages for carp and
259             # croak. They replace $CarpLevel, which is deprecated. The
260             # $Max(EvalLen|(Arg(Len|Nums)) variables are used to specify how the eval
261             # text and function arguments should be formatted when printed.
262            
263             our %CarpInternal;
264             our %Internal;
265            
266             # disable these by default, so they can live w/o require Carp
267             $CarpInternal{Carp}++;
268             $CarpInternal{warnings}++;
269             $Internal{Exporter}++;
270             $Internal{'Exporter::Heavy'}++;
271            
272             # if the caller specifies verbose usage ("perl -MCarp=verbose script.pl")
273             # then the following method will be called by the Exporter which knows
274             # to do this thanks to @EXPORT_FAIL, above. $_[1] will contain the word
275             # 'verbose'.
276            
277             sub export_fail { shift; $Verbose = shift if $_[0] eq 'verbose'; @_ }
278            
279             sub _cgc {
280             no strict 'refs';
281             return \&{"CORE::GLOBAL::caller"} if defined &{"CORE::GLOBAL::caller"};
282             return;
283             }
284            
285             sub longmess {
286             local($!, $^E);
287             # Icky backwards compatibility wrapper. :-(
288             #
289             # The story is that the original implementation hard-coded the
290             # number of call levels to go back, so calls to longmess were off
291             # by one. Other code began calling longmess and expecting this
292             # behaviour, so the replacement has to emulate that behaviour.
293             my $cgc = _cgc();
294             my $call_pack = $cgc ? $cgc->() : caller();
295             if ( $Internal{$call_pack} or $CarpInternal{$call_pack} ) {
296             return longmess_heavy(@_);
297             }
298             else {
299             local $CarpLevel = $CarpLevel + 1;
300             return longmess_heavy(@_);
301             }
302             }
303            
304             our @CARP_NOT;
305            
306             sub shortmess {
307             local($!, $^E);
308             my $cgc = _cgc();
309            
310             # Icky backwards compatibility wrapper. :-(
311             local @CARP_NOT = $cgc ? $cgc->() : caller();
312             shortmess_heavy(@_);
313             }
314            
315             sub croak { die shortmess @_ }
316             sub confess { die longmess @_ }
317             sub carp { warn shortmess @_ }
318             sub cluck { warn longmess @_ }
319            
320             BEGIN {
321             if("$]" >= 5.015002 || ("$]" >= 5.014002 && "$]" < 5.015) ||
322             ("$]" >= 5.012005 && "$]" < 5.013)) {
323             *CALLER_OVERRIDE_CHECK_OK = sub () { 1 };
324             } else {
325             *CALLER_OVERRIDE_CHECK_OK = sub () { 0 };
326             }
327             }
328            
329             sub caller_info {
330             my $i = shift(@_) + 1;
331             my %call_info;
332             my $cgc = _cgc();
333             {
334             # Some things override caller() but forget to implement the
335             # @DB::args part of it, which we need. We check for this by
336             # pre-populating @DB::args with a sentinel which no-one else
337             # has the address of, so that we can detect whether @DB::args
338             # has been properly populated. However, on earlier versions
339             # of perl this check tickles a bug in CORE::caller() which
340             # leaks memory. So we only check on fixed perls.
341             @DB::args = \$i if CALLER_OVERRIDE_CHECK_OK;
342             package DB;
343             @call_info{
344             qw(pack file line sub has_args wantarray evaltext is_require) }
345             = $cgc ? $cgc->($i) : caller($i);
346             }
347            
348             unless ( defined $call_info{file} ) {
349             return ();
350             }
351            
352             my $sub_name = Carp::get_subname( \%call_info );
353             if ( $call_info{has_args} ) {
354             my @args;
355             if (CALLER_OVERRIDE_CHECK_OK && @DB::args == 1
356             && ref $DB::args[0] eq ref \$i
357             && $DB::args[0] == \$i ) {
358             @DB::args = (); # Don't let anyone see the address of $i
359             local $@;
360             my $where = eval {
361             my $func = $cgc or return '';
362             my $gv =
363             (_fetch_sub B => 'svref_2object' or return '')
364             ->($func)->GV;
365             my $package = $gv->STASH->NAME;
366             my $subname = $gv->NAME;
367             return unless defined $package && defined $subname;
368            
369             # returning CORE::GLOBAL::caller isn't useful for tracing the cause:
370             return if $package eq 'CORE::GLOBAL' && $subname eq 'caller';
371             " in &${package}::$subname";
372             } || '';
373             @args
374             = "** Incomplete caller override detected$where; \@DB::args were not set **";
375             }
376             else {
377             @args = @DB::args;
378             my $overflow;
379             if ( $MaxArgNums and @args > $MaxArgNums )
380             { # More than we want to show?
381             $#args = $MaxArgNums;
382             $overflow = 1;
383             }
384            
385             @args = map { Carp::format_arg($_) } @args;
386            
387             if ($overflow) {
388             push @args, '...';
389             }
390             }
391            
392             # Push the args onto the subroutine
393             $sub_name .= '(' . join( ', ', @args ) . ')';
394             }
395             $call_info{sub_name} = $sub_name;
396             return wantarray() ? %call_info : \%call_info;
397             }
398            
399             # Transform an argument to a function into a string.
400             our $in_recurse;
401             sub format_arg {
402             my $arg = shift;
403            
404             if ( ref($arg) ) {
405             # legitimate, let's not leak it.
406             if (!$in_recurse &&
407             do {
408             local $@;
409             local $in_recurse = 1;
410             local $SIG{__DIE__} = sub{};
411             eval {$arg->can('CARP_TRACE') }
412             })
413             {
414             return $arg->CARP_TRACE();
415             }
416             elsif (!$in_recurse &&
417             defined($RefArgFormatter) &&
418             do {
419             local $@;
420             local $in_recurse = 1;
421             local $SIG{__DIE__} = sub{};
422             eval {$arg = $RefArgFormatter->($arg); 1}
423             })
424             {
425             return $arg;
426             }
427             else
428             {
429             my $sub = _fetch_sub(overload => 'StrVal');
430             return $sub ? &$sub($arg) : "$arg";
431             }
432             }
433             return "undef" if !defined($arg);
434             downgrade($arg, 1);
435             return $arg if !(UTF8_REGEXP_PROBLEM && is_utf8($arg)) &&
436             $arg =~ /\A-?[0-9]+(?:\.[0-9]*)?(?:[eE][-+]?[0-9]+)?\z/;
437             my $suffix = "";
438             if ( 2 < $MaxArgLen and $MaxArgLen < length($arg) ) {
439             substr ( $arg, $MaxArgLen - 3 ) = "";
440             $suffix = "...";
441             }
442             if(UTF8_REGEXP_PROBLEM && is_utf8($arg)) {
443             for(my $i = length($arg); $i--; ) {
444             my $c = substr($arg, $i, 1);
445             my $x = substr($arg, 0, 0); # work around bug on Perl 5.8.{1,2}
446             if($c eq "\"" || $c eq "\\" || $c eq "\$" || $c eq "\@") {
447             substr $arg, $i, 0, "\\";
448             next;
449             }
450             my $o = ord($c);
451             substr $arg, $i, 1, sprintf("\\x{%x}", $o)
452             if $o < 0x20 || $o > 0x7f;
453             }
454             } else {
455             $arg =~ s/([\"\\\$\@])/\\$1/g;
456             $arg =~ s/([^ -~])/sprintf("\\x{%x}",ord($1))/eg;
457             }
458             downgrade($arg, 1);
459             return "\"".$arg."\"".$suffix;
460             }
461            
462             sub Regexp::CARP_TRACE {
463             my $arg = "$_[0]";
464             downgrade($arg, 1);
465             if(UTF8_REGEXP_PROBLEM && is_utf8($arg)) {
466             for(my $i = length($arg); $i--; ) {
467             my $o = ord(substr($arg, $i, 1));
468             my $x = substr($arg, 0, 0); # work around bug on Perl 5.8.{1,2}
469             substr $arg, $i, 1, sprintf("\\x{%x}", $o)
470             if $o < 0x20 || $o > 0x7f;
471             }
472             } else {
473             $arg =~ s/([^ -~])/sprintf("\\x{%x}",ord($1))/eg;
474             }
475             downgrade($arg, 1);
476             my $suffix = "";
477             if($arg =~ /\A\(\?\^?([a-z]*)(?:-[a-z]*)?:(.*)\)\z/s) {
478             ($suffix, $arg) = ($1, $2);
479             }
480             if ( 2 < $MaxArgLen and $MaxArgLen < length($arg) ) {
481             substr ( $arg, $MaxArgLen - 3 ) = "";
482             $suffix = "...".$suffix;
483             }
484             return "qr($arg)$suffix";
485             }
486            
487             # Takes an inheritance cache and a package and returns
488             # an anon hash of known inheritances and anon array of
489             # inheritances which consequences have not been figured
490             # for.
491             sub get_status {
492             my $cache = shift;
493             my $pkg = shift;
494             $cache->{$pkg} ||= [ { $pkg => $pkg }, [ trusts_directly($pkg) ] ];
495             return @{ $cache->{$pkg} };
496             }
497            
498             # Takes the info from caller() and figures out the name of
499             # the sub/require/eval
500             sub get_subname {
501             my $info = shift;
502             if ( defined( $info->{evaltext} ) ) {
503             my $eval = $info->{evaltext};
504             if ( $info->{is_require} ) {
505             return "require $eval";
506             }
507             else {
508             $eval =~ s/([\\\'])/\\$1/g;
509             return "eval '" . str_len_trim( $eval, $MaxEvalLen ) . "'";
510             }
511             }
512            
513             # this can happen on older perls when the sub (or the stash containing it)
514             # has been deleted
515             if ( !defined( $info->{sub} ) ) {
516             return '__ANON__::__ANON__';
517             }
518            
519             return ( $info->{sub} eq '(eval)' ) ? 'eval {...}' : $info->{sub};
520             }
521            
522             # Figures out what call (from the point of view of the caller)
523             # the long error backtrace should start at.
524             sub long_error_loc {
525             my $i;
526             my $lvl = $CarpLevel;
527             {
528             ++$i;
529             my $cgc = _cgc();
530             my @caller = $cgc ? $cgc->($i) : caller($i);
531             my $pkg = $caller[0];
532             unless ( defined($pkg) ) {
533            
534             # This *shouldn't* happen.
535             if (%Internal) {
536             local %Internal;
537             $i = long_error_loc();
538             last;
539             }
540             elsif (defined $caller[2]) {
541             # this can happen when the stash has been deleted
542             # in that case, just assume that it's a reasonable place to
543             # stop (the file and line data will still be intact in any
544             # case) - the only issue is that we can't detect if the
545             # deleted package was internal (so don't do that then)
546             # -doy
547             redo unless 0 > --$lvl;
548             last;
549             }
550             else {
551             return 2;
552             }
553             }
554             redo if $CarpInternal{$pkg};
555             redo unless 0 > --$lvl;
556             redo if $Internal{$pkg};
557             }
558             return $i - 1;
559             }
560            
561             sub longmess_heavy {
562             return @_ if ref( $_[0] ); # don't break references as exceptions
563             my $i = long_error_loc();
564             return ret_backtrace( $i, @_ );
565             }
566            
567             # Returns a full stack backtrace starting from where it is
568             # told.
569             sub ret_backtrace {
570             my ( $i, @error ) = @_;
571             my $mess;
572             my $err = join '', @error;
573             $i++;
574            
575             my $tid_msg = '';
576             if ( defined &threads::tid ) {
577             my $tid = threads->tid;
578             $tid_msg = " thread $tid" if $tid;
579             }
580            
581             my %i = caller_info($i);
582             $mess = "$err at $i{file} line $i{line}$tid_msg";
583             if( defined $. ) {
584             local $@ = '';
585             local $SIG{__DIE__};
586             eval {
587             CORE::die;
588             };
589             if($@ =~ /^Died at .*(, <.*?> line \d+).$/ ) {
590             $mess .= $1;
591             }
592             }
593             $mess .= "\.\n";
594            
595             while ( my %i = caller_info( ++$i ) ) {
596             $mess .= "\t$i{sub_name} called at $i{file} line $i{line}$tid_msg\n";
597             }
598            
599             return $mess;
600             }
601            
602             sub ret_summary {
603             my ( $i, @error ) = @_;
604             my $err = join '', @error;
605             $i++;
606            
607             my $tid_msg = '';
608             if ( defined &threads::tid ) {
609             my $tid = threads->tid;
610             $tid_msg = " thread $tid" if $tid;
611             }
612            
613             my %i = caller_info($i);
614             return "$err at $i{file} line $i{line}$tid_msg\.\n";
615             }
616            
617             sub short_error_loc {
618             # You have to create your (hash)ref out here, rather than defaulting it
619             # inside trusts *on a lexical*, as you want it to persist across calls.
620             # (You can default it on $_[2], but that gets messy)
621             my $cache = {};
622             my $i = 1;
623             my $lvl = $CarpLevel;
624             {
625             my $cgc = _cgc();
626             my $called = $cgc ? $cgc->($i) : caller($i);
627             $i++;
628             my $caller = $cgc ? $cgc->($i) : caller($i);
629            
630             if (!defined($caller)) {
631             my @caller = $cgc ? $cgc->($i) : caller($i);
632             if (@caller) {
633             # if there's no package but there is other caller info, then
634             # the package has been deleted - treat this as a valid package
635             # in this case
636             redo if defined($called) && $CarpInternal{$called};
637             redo unless 0 > --$lvl;
638             last;
639             }
640             else {
641             return 0;
642             }
643             }
644             redo if $Internal{$caller};
645             redo if $CarpInternal{$caller};
646             redo if $CarpInternal{$called};
647             redo if trusts( $called, $caller, $cache );
648             redo if trusts( $caller, $called, $cache );
649             redo unless 0 > --$lvl;
650             }
651             return $i - 1;
652             }
653            
654             sub shortmess_heavy {
655             return longmess_heavy(@_) if $Verbose;
656             return @_ if ref( $_[0] ); # don't break references as exceptions
657             my $i = short_error_loc();
658             if ($i) {
659             ret_summary( $i, @_ );
660             }
661             else {
662             longmess_heavy(@_);
663             }
664             }
665            
666             # If a string is too long, trims it with ...
667             sub str_len_trim {
668             my $str = shift;
669             my $max = shift || 0;
670             if ( 2 < $max and $max < length($str) ) {
671             substr( $str, $max - 3 ) = '...';
672             }
673             return $str;
674             }
675            
676             # Takes two packages and an optional cache. Says whether the
677             # first inherits from the second.
678             #
679             # Recursive versions of this have to work to avoid certain
680             # possible endless loops, and when following long chains of
681             # inheritance are less efficient.
682             sub trusts {
683             my $child = shift;
684             my $parent = shift;
685             my $cache = shift;
686             my ( $known, $partial ) = get_status( $cache, $child );
687            
688             # Figure out consequences until we have an answer
689             while ( @$partial and not exists $known->{$parent} ) {
690             my $anc = shift @$partial;
691             next if exists $known->{$anc};
692             $known->{$anc}++;
693             my ( $anc_knows, $anc_partial ) = get_status( $cache, $anc );
694             my @found = keys %$anc_knows;
695             @$known{@found} = ();
696             push @$partial, @$anc_partial;
697             }
698             return exists $known->{$parent};
699             }
700            
701             # Takes a package and gives a list of those trusted directly
702             sub trusts_directly {
703             my $class = shift;
704             no strict 'refs';
705             my $stash = \%{"$class\::"};
706             for my $var (qw/ CARP_NOT ISA /) {
707             # Don't try using the variable until we know it exists,
708             # to avoid polluting the caller's namespace.
709             if ( $stash->{$var} && *{$stash->{$var}}{ARRAY} && @{$stash->{$var}} ) {
710             return @{$stash->{$var}}
711             }
712             }
713             return;
714             }
715            
716             if(!defined($warnings::VERSION) ||
717             do { no warnings "numeric"; $warnings::VERSION < 1.03 }) {
718             # Very old versions of warnings.pm import from Carp. This can go
719             # wrong due to the circular dependency. If Carp is invoked before
720             # warnings, then Carp starts by loading warnings, then warnings
721             # tries to import from Carp, and gets nothing because Carp is in
722             # the process of loading and hasn't defined its import method yet.
723             # So we work around that by manually exporting to warnings here.
724             no strict "refs";
725             *{"warnings::$_"} = \&$_ foreach @EXPORT;
726             }
727            
728             1;
729            
730             __END__
731            
732             =head1 NAME
733            
734             Carp - alternative warn and die for modules
735            
736             =head1 SYNOPSIS
737            
738             use Carp;
739            
740             # warn user (from perspective of caller)
741             carp "string trimmed to 80 chars";
742            
743             # die of errors (from perspective of caller)
744             croak "We're outta here!";
745            
746             # die of errors with stack backtrace
747             confess "not implemented";
748            
749             # cluck, longmess and shortmess not exported by default
750             use Carp qw(cluck longmess shortmess);
751             cluck "This is how we got here!";
752             $long_message = longmess( "message from cluck() or confess()" );
753             $short_message = shortmess( "message from carp() or croak()" );
754            
755             =head1 DESCRIPTION
756            
757             The Carp routines are useful in your own modules because
758             they act like C<die()> or C<warn()>, but with a message which is more
759             likely to be useful to a user of your module. In the case of
760             C<cluck()> and C<confess()>, that context is a summary of every
761             call in the call-stack; C<longmess()> returns the contents of the error
762             message.
763            
764             For a shorter message you can use C<carp()> or C<croak()> which report the
765             error as being from where your module was called. C<shortmess()> returns the
766             contents of this error message. There is no guarantee that that is where the
767             error was, but it is a good educated guess.
768            
769             C<Carp> takes care not to clobber the status variables C<$!> and C<$^E>
770             in the course of assembling its error messages. This means that a
771             C<$SIG{__DIE__}> or C<$SIG{__WARN__}> handler can capture the error
772             information held in those variables, if it is required to augment the
773             error message, and if the code calling C<Carp> left useful values there.
774             Of course, C<Carp> can't guarantee the latter.
775            
776             You can also alter the way the output and logic of C<Carp> works, by
777             changing some global variables in the C<Carp> namespace. See the
778             section on C<GLOBAL VARIABLES> below.
779            
780             Here is a more complete description of how C<carp> and C<croak> work.
781             What they do is search the call-stack for a function call stack where
782             they have not been told that there shouldn't be an error. If every
783             call is marked safe, they give up and give a full stack backtrace
784             instead. In other words they presume that the first likely looking
785             potential suspect is guilty. Their rules for telling whether
786             a call shouldn't generate errors work as follows:
787            
788             =over 4
789            
790             =item 1.
791            
792             Any call from a package to itself is safe.
793            
794             =item 2.
795            
796             Packages claim that there won't be errors on calls to or from
797             packages explicitly marked as safe by inclusion in C<@CARP_NOT>, or
798             (if that array is empty) C<@ISA>. The ability to override what
799             @ISA says is new in 5.8.
800            
801             =item 3.
802            
803             The trust in item 2 is transitive. If A trusts B, and B
804             trusts C, then A trusts C. So if you do not override C<@ISA>
805             with C<@CARP_NOT>, then this trust relationship is identical to,
806             "inherits from".
807            
808             =item 4.
809            
810             Any call from an internal Perl module is safe. (Nothing keeps
811             user modules from marking themselves as internal to Perl, but
812             this practice is discouraged.)
813            
814             =item 5.
815            
816             Any call to Perl's warning system (eg Carp itself) is safe.
817             (This rule is what keeps it from reporting the error at the
818             point where you call C<carp> or C<croak>.)
819            
820             =item 6.
821            
822             C<$Carp::CarpLevel> can be set to skip a fixed number of additional
823             call levels. Using this is not recommended because it is very
824             difficult to get it to behave correctly.
825            
826             =back
827            
828             =head2 Forcing a Stack Trace
829            
830             As a debugging aid, you can force Carp to treat a croak as a confess
831             and a carp as a cluck across I<all> modules. In other words, force a
832             detailed stack trace to be given. This can be very helpful when trying
833             to understand why, or from where, a warning or error is being generated.
834            
835             This feature is enabled by 'importing' the non-existent symbol
836             'verbose'. You would typically enable it by saying
837            
838             perl -MCarp=verbose script.pl
839            
840             or by including the string C<-MCarp=verbose> in the PERL5OPT
841             environment variable.
842            
843             Alternately, you can set the global variable C<$Carp::Verbose> to true.
844             See the C<GLOBAL VARIABLES> section below.
845            
846             =head2 Stack Trace formatting
847            
848             At each stack level, the subroutine's name is displayed along with
849             its parameters. For simple scalars, this is sufficient. For complex
850             data types, such as objects and other references, this can simply
851             display C<'HASH(0x1ab36d8)'>.
852            
853             Carp gives two ways to control this.
854            
855             =over 4
856            
857             =item 1.
858            
859             For objects, a method, C<CARP_TRACE>, will be called, if it exists. If
860             this method doesn't exist, or it recurses into C<Carp>, or it otherwise
861             throws an exception, this is skipped, and Carp moves on to the next option,
862             otherwise checking stops and the string returned is used. It is recommended
863             that the object's type is part of the string to make debugging easier.
864            
865             =item 2.
866            
867             For any type of reference, C<$Carp::RefArgFormatter> is checked (see below).
868             This variable is expected to be a code reference, and the current parameter
869             is passed in. If this function doesn't exist (the variable is undef), or
870             it recurses into C<Carp>, or it otherwise throws an exception, this is
871             skipped, and Carp moves on to the next option, otherwise checking stops
872             and the string returned is used.
873            
874             =item 3.
875            
876             Otherwise, if neither C<CARP_TRACE> nor C<$Carp::RefArgFormatter> is
877             available, stringify the value ignoring any overloading.
878            
879             =back
880            
881             =head1 GLOBAL VARIABLES
882            
883             =head2 $Carp::MaxEvalLen
884            
885             This variable determines how many characters of a string-eval are to
886             be shown in the output. Use a value of C<0> to show all text.
887            
888             Defaults to C<0>.
889            
890             =head2 $Carp::MaxArgLen
891            
892             This variable determines how many characters of each argument to a
893             function to print. Use a value of C<0> to show the full length of the
894             argument.
895            
896             Defaults to C<64>.
897            
898             =head2 $Carp::MaxArgNums
899            
900             This variable determines how many arguments to each function to show.
901             Use a value of C<0> to show all arguments to a function call.
902            
903             Defaults to C<8>.
904            
905             =head2 $Carp::Verbose
906            
907             This variable makes C<carp()> and C<croak()> generate stack backtraces
908             just like C<cluck()> and C<confess()>. This is how C<use Carp 'verbose'>
909             is implemented internally.
910            
911             Defaults to C<0>.
912            
913             =head2 $Carp::RefArgFormatter
914            
915             This variable sets a general argument formatter to display references.
916             Plain scalars and objects that implement C<CARP_TRACE> will not go through
917             this formatter. Calling C<Carp> from within this function is not supported.
918            
919             local $Carp::RefArgFormatter = sub {
920             require Data::Dumper;
921             Data::Dumper::Dump($_[0]); # not necessarily safe
922             };
923            
924             =head2 @CARP_NOT
925            
926             This variable, I<in your package>, says which packages are I<not> to be
927             considered as the location of an error. The C<carp()> and C<cluck()>
928             functions will skip over callers when reporting where an error occurred.
929            
930             NB: This variable must be in the package's symbol table, thus:
931            
932             # These work
933             our @CARP_NOT; # file scope
934             use vars qw(@CARP_NOT); # package scope
935             @My::Package::CARP_NOT = ... ; # explicit package variable
936            
937             # These don't work
938             sub xyz { ... @CARP_NOT = ... } # w/o declarations above
939             my @CARP_NOT; # even at top-level
940            
941             Example of use:
942            
943             package My::Carping::Package;
944             use Carp;
945             our @CARP_NOT;
946             sub bar { .... or _error('Wrong input') }
947             sub _error {
948             # temporary control of where'ness, __PACKAGE__ is implicit
949             local @CARP_NOT = qw(My::Friendly::Caller);
950             carp(@_)
951             }
952            
953             This would make C<Carp> report the error as coming from a caller not
954             in C<My::Carping::Package>, nor from C<My::Friendly::Caller>.
955            
956             Also read the L</DESCRIPTION> section above, about how C<Carp> decides
957             where the error is reported from.
958            
959             Use C<@CARP_NOT>, instead of C<$Carp::CarpLevel>.
960            
961             Overrides C<Carp>'s use of C<@ISA>.
962            
963             =head2 %Carp::Internal
964            
965             This says what packages are internal to Perl. C<Carp> will never
966             report an error as being from a line in a package that is internal to
967             Perl. For example:
968            
969             $Carp::Internal{ (__PACKAGE__) }++;
970             # time passes...
971             sub foo { ... or confess("whatever") };
972            
973             would give a full stack backtrace starting from the first caller
974             outside of __PACKAGE__. (Unless that package was also internal to
975             Perl.)
976            
977             =head2 %Carp::CarpInternal
978            
979             This says which packages are internal to Perl's warning system. For
980             generating a full stack backtrace this is the same as being internal
981             to Perl, the stack backtrace will not start inside packages that are
982             listed in C<%Carp::CarpInternal>. But it is slightly different for
983             the summary message generated by C<carp> or C<croak>. There errors
984             will not be reported on any lines that are calling packages in
985             C<%Carp::CarpInternal>.
986            
987             For example C<Carp> itself is listed in C<%Carp::CarpInternal>.
988             Therefore the full stack backtrace from C<confess> will not start
989             inside of C<Carp>, and the short message from calling C<croak> is
990             not placed on the line where C<croak> was called.
991            
992             =head2 $Carp::CarpLevel
993            
994             This variable determines how many additional call frames are to be
995             skipped that would not otherwise be when reporting where an error
996             occurred on a call to one of C<Carp>'s functions. It is fairly easy
997             to count these call frames on calls that generate a full stack
998             backtrace. However it is much harder to do this accounting for calls
999             that generate a short message. Usually people skip too many call
1000             frames. If they are lucky they skip enough that C<Carp> goes all of
1001             the way through the call stack, realizes that something is wrong, and
1002             then generates a full stack backtrace. If they are unlucky then the
1003             error is reported from somewhere misleading very high in the call
1004             stack.
1005            
1006             Therefore it is best to avoid C<$Carp::CarpLevel>. Instead use
1007             C<@CARP_NOT>, C<%Carp::Internal> and C<%Carp::CarpInternal>.
1008            
1009             Defaults to C<0>.
1010            
1011             =head1 BUGS
1012            
1013             The Carp routines don't handle exception objects currently.
1014             If called with a first argument that is a reference, they simply
1015             call die() or warn(), as appropriate.
1016            
1017             Some of the Carp code assumes that Perl's basic character encoding is
1018             ASCII, and will go wrong on an EBCDIC platform.
1019            
1020             =head1 SEE ALSO
1021            
1022             L<Carp::Always>,
1023             L<Carp::Clan>
1024            
1025             =head1 AUTHOR
1026            
1027             The Carp module first appeared in Larry Wall's perl 5.000 distribution.
1028             Since then it has been modified by several of the perl 5 porters.
1029             Andrew Main (Zefram) <zefram@fysh.org> divested Carp into an independent
1030             distribution.
1031            
1032             =head1 COPYRIGHT
1033            
1034             Copyright (C) 1994-2013 Larry Wall
1035            
1036             Copyright (C) 2011, 2012, 2013 Andrew Main (Zefram) <zefram@fysh.org>
1037            
1038             =head1 LICENSE
1039            
1040             This module is free software; you can redistribute it and/or modify it
1041             under the same terms as Perl itself.
1042             CARP
1043              
1044 1         3 $fatpacked{"Carp/Heavy.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'CARP_HEAVY';
1045             package Carp::Heavy;
1046            
1047             use Carp ();
1048            
1049             our $VERSION = '1.3301';
1050            
1051             my $cv = defined($Carp::VERSION) ? $Carp::VERSION : "undef";
1052             if($cv ne $VERSION) {
1053             die "Version mismatch between Carp $cv ($INC{q(Carp.pm)}) and Carp::Heavy $VERSION ($INC{q(Carp/Heavy.pm)}). Did you alter \@INC after Carp was loaded?\n";
1054             }
1055            
1056             1;
1057            
1058             # Most of the machinery of Carp used to be here.
1059             # It has been moved in Carp.pm now, but this placeholder remains for
1060             # the benefit of modules that like to preload Carp::Heavy directly.
1061             # This must load Carp, because some modules rely on the historical
1062             # behaviour of Carp::Heavy loading Carp.
1063             CARP_HEAVY
1064              
1065 1         14 $fatpacked{"Module/Locate.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'MODULE_LOCATE';
1066             {
1067             package Module::Locate;
1068            
1069 1     1   5 use warnings;
  1         2  
  1         23  
1070 1     1   12 use 5.8.8;
  1         3  
  1         544  
1071            
1072             our $VERSION = '1.79';
1073             our $Cache = 0;
1074             our $Global = 1;
1075            
1076             my $ident_re = qr{[_a-z]\w*}i;
1077             my $sep_re = qr{'|::};
1078             our $PkgRe = qr{\A(?:$ident_re(?:$sep_re$ident_re)*)\z};
1079            
1080             my @All = qw(
1081             locate get_source acts_like_fh
1082             mod_to_path is_mod_loaded is_pkg_loaded
1083             );
1084            
1085             sub import {
1086 1     1   3 my $pkg = caller;
1087 1         6 my @args = @_[ 1 .. $#_ ];
1088            
1089 1         8 while(local $_ = shift @args) {
1090 1 50 50     6 *{ "$pkg\::$_" } = \&$_ and next
  1         159  
1091             if defined &$_;
1092            
1093 0 0         $Cache = shift @args, next
1094             if /^cache$/i;
1095            
1096 0 0         $Global = shift @args, next
1097             if /^global$/i;
1098            
1099 0 0         if(/^:all$/i) {
1100 0           *{ "$pkg\::$_" } = \&$_
1101 0           for @All;
1102 0           next;
1103             }
1104            
1105 0           warn("not in ".__PACKAGE__." import list: '$_'");
1106             }
1107             }
1108            
1109 1     1   6 use strict;
  1         1  
  1         41  
1110            
1111 1     1   10 use IO::File;
  1         5873  
  1         200  
1112 1     1   9 use overload ();
  1         2  
  1         19  
1113 1     1   6 use Carp 'croak';
  1         2  
  1         66  
1114 1     1   13 use File::Spec::Functions 'catfile';
  1         992  
  1         754  
1115            
1116             sub get_source {
1117 0     0 1   my $pkg = $_[-1];
1118            
1119 0           my $f = locate($pkg);
1120            
1121             my $fh = ( acts_like_fh($f) ?
1122             $f
1123             :
1124 0 0         do { my $tmp = IO::File->new($f)
  0 0          
1125 0           or croak("invalid module '$pkg' [$f] - $!"); $tmp }
1126             );
1127            
1128 0           local $/;
1129 0           return <$fh>;
1130             }
1131            
1132             sub locate {
1133 0     0 1   my $pkg = $_[-1];
1134            
1135 0 0         croak("Undefined filename provided")
1136             unless defined $pkg;
1137            
1138 0           my $inc_path = mod_to_path($pkg);
1139            
1140 0 0 0       return $INC{$inc_path} if exists($INC{$inc_path}) && !wantarray;
1141            
1142             # On Windows the inc_path will use '/' for directory separator,
1143             # but when looking for a module, we need to use the OS's separator.
1144 0           my $partial_path = _mod_to_partial_path($pkg);
1145            
1146 0           my @paths;
1147            
1148 0           for(@INC) {
1149 0 0         if(ref $_) {
1150 0           my $ret = coderefs_in_INC($_, $inc_path);
1151            
1152             next
1153 0 0         unless defined $ret;
1154            
1155 0 0         croak("invalid \@INC subroutine return $ret")
1156             unless acts_like_fh($ret);
1157            
1158 0           return $ret;
1159             }
1160            
1161 0           my $fullpath = catfile($_, $partial_path);
1162 0 0         push(@paths, $fullpath) if -f $fullpath;
1163             }
1164            
1165 0 0         return unless @paths > 0;
1166            
1167 0 0         return wantarray ? @paths : $paths[0];
1168             }
1169            
1170             sub mod_to_path {
1171 0     0 1   my $pkg = shift;
1172 0           my $path = $pkg;
1173            
1174 0 0         croak("Invalid package name '$pkg'")
1175             unless $pkg =~ $Module::Locate::PkgRe;
1176            
1177             # %INC always uses / as a directory separator, even on Windows
1178 0           $path =~ s!::!/!g;
1179 0 0         $path .= '.pm' unless $path =~ m!\.pm$!;
1180            
1181 0           return $path;
1182             }
1183            
1184             sub coderefs_in_INC {
1185 0     0 0   my($path, $c) = reverse @_;
1186            
1187 0 0         my $ret = ref($c) eq 'CODE' ?
    0          
    0          
1188             $c->( $c, $path )
1189             :
1190             ref($c) eq 'ARRAY' ?
1191             $c->[0]->( $c, $path )
1192             :
1193             UNIVERSAL::can($c, 'INC') ?
1194             $c->INC( $path )
1195             :
1196             warn("invalid reference in \@INC '$c'")
1197             ;
1198            
1199 0           return $ret;
1200             }
1201            
1202             sub acts_like_fh {
1203 1     1   6 no strict 'refs';
  1         2  
  1         487  
1204             return ( ref $_[0] and (
1205             ( ref $_[0] eq 'GLOB' and defined *{$_[0]}{IO} )
1206             or ( UNIVERSAL::isa($_[0], 'IO::Handle') )
1207             or ( overload::Method($_[0], '<>') )
1208 0   0 0 1   ) or ref \$_[0] eq 'GLOB' and defined *{$_[0]}{IO} );
1209             }
1210            
1211             sub is_mod_loaded {
1212 0     0 1   my $mod = shift;
1213            
1214 0 0         croak("Invalid package name '$mod'")
1215             unless $mod =~ $Module::Locate::PkgRe;
1216            
1217             ## it looks like %INC entries automagically use / as a separator
1218 0           my $path = join '/', split '::' => "$mod.pm";
1219            
1220 0   0       return (exists $INC{$path} && defined $INC{$path});
1221             }
1222            
1223             sub _mod_to_partial_path {
1224 0     0     my $package = shift;
1225            
1226 0           return catfile(split(/::/, $package)).'.pm';
1227             }
1228            
1229             sub is_pkg_loaded {
1230 0     0 1   my $pkg = shift;
1231            
1232 0 0         croak("Invalid package name '$pkg'")
1233             unless $pkg =~ $Module::Locate::PkgRe;
1234            
1235 0           my @tbls = map "${_}::", split('::' => $pkg);
1236 0           my $tbl = \%main::;
1237            
1238 0           for(@tbls) {
1239 0 0         return unless exists $tbl->{$_};
1240 0           $tbl = $tbl->{$_};
1241             }
1242            
1243 0           return !!$pkg;
1244             }
1245             }
1246            
1247             q[ That better be make-up, and it better be good ];
1248            
1249             =pod
1250            
1251             =head1 NAME
1252            
1253             Module::Locate - locate modules in the same fashion as C<require> and C<use>
1254            
1255             =head1 SYNOPSIS
1256            
1257             use Module::Locate qw/ locate get_source /;
1258            
1259             add_plugin( locate "This::Module" );
1260             eval 'use strict; ' . get_source('legacy_code.plx');
1261            
1262             =head1 DESCRIPTION
1263            
1264             Using C<locate()>, return the path that C<require> would find for a given
1265             module or filename (it can also return a filehandle if a reference in C<@INC>
1266             has been used). This means you can test for the existence, or find the path
1267             for, modules without having to evaluate the code they contain.
1268            
1269             This module also comes with accompanying utility functions that are used within
1270             the module itself (except for C<get_source>) and are available for import.
1271            
1272             =head1 FUNCTIONS
1273            
1274             =over 4
1275            
1276             =item C<import>
1277            
1278             Given function names, the appropriate functions will be exported into the
1279             caller's package.
1280            
1281             If C<:all> is passed then all subroutines are exported.
1282            
1283             The B<Global> and B<Cache> options are no longer supported.
1284             See the BUGS section below.
1285            
1286            
1287             =item C<locate($module_name)>
1288            
1289             Given a module name as a string (in standard perl bareword format) locate the
1290             path of the module. If called in a scalar context the first path found will be
1291             returned, if called in a list context a list of paths where the module was
1292             found. Also, if references have been placed in C<@INC> then a filehandle will
1293             be returned, as defined in the C<require> documentation. An empty C<return> is
1294             used if the module couldn't be located.
1295            
1296             As of version C<1.7> a filename can also be provided to further mimic the lookup
1297             behaviour of C<require>/C<use>.
1298            
1299             =item C<get_source($module_name)>
1300            
1301             When provided with a package name, gets the path using C<locate()>.
1302             If C<locate()> returned a path, then the contents of that file are returned
1303             by C<get_source()> in a scalar.
1304            
1305             =item C<acts_like_fh>
1306            
1307             Given a scalar, check if it behaves like a filehandle. Firstly it checks if it
1308             is a bareword filehandle, then if it inherits from C<IO::Handle> and lastly if
1309             it overloads the C<E<lt>E<gt>> operator. If this is missing any other standard
1310             filehandle behaviour, please send me an e-mail.
1311            
1312             =item C<mod_to_path($module_name)>
1313            
1314             Given a module name,
1315             converts it to a relative path e.g C<Foo::Bar> would become C<Foo/Bar.pm>.
1316            
1317             Note that this path will always use '/' for the directory separator,
1318             even on Windows,
1319             as that's the format used in C<%INC>.
1320            
1321             =item C<is_mod_loaded($module_name)>
1322            
1323             Given a module name, return true if the module has been
1324             loaded (i.e exists in the C<%INC> hash).
1325            
1326             =item C<is_pkg_loaded($package_name)>
1327            
1328             Given a package name (like C<locate()>), check if the package has an existing
1329             symbol table loaded (checks by walking the C<%main::> stash).
1330            
1331             =back
1332            
1333             =head1 SEE ALSO
1334            
1335             A review of modules that can be used to get the path (and often other information)
1336             for one or more modules: L<http://neilb.org/reviews/module-path.html>.
1337            
1338             L<App::Module::Locate> and L<mlocate>.
1339            
1340             =head1 REPOSITORY
1341            
1342             L<https://github.com/neilbowers/Module-Locate>
1343            
1344             =head1 BUGS
1345            
1346             In previous versions of this module, if you specified C<Global =E<gt> 1>
1347             when use'ing this module,
1348             then looking up a module's path would update C<%INC>,
1349             even if the module hadn't actually been loaded (yet).
1350             This meant that if you subsequently tried to load the module,
1351             it would wrongly not be loaded.
1352            
1353             Bugs are tracked using RT (bug you can also raise Github issues if you prefer):
1354            
1355             L<http://rt.cpan.org/NoAuth/ReportBug.html?Queue=Module-Locate>
1356            
1357             =head1 AUTHOR
1358            
1359             Dan Brook C<< <cpan@broquaint.com> >>
1360            
1361             =head1 LICENSE
1362            
1363             This is free software; you can redistribute it and/or modify it under the same terms as
1364             Perl itself.
1365            
1366             =cut
1367             MODULE_LOCATE
1368              
1369 1         23 $fatpacked{"Perl/Tags.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERL_TAGS';
1370             #!/usr/bin/perl
1371            
1372             =head1 NAME
1373            
1374             Perl::Tags - Generate (possibly exuberant) Ctags style tags for Perl sourcecode
1375            
1376             =head1 SYNOPSIS
1377            
1378             =head2 Using Perl::Tags to assist your development
1379            
1380             C<Perl::Tags> is designed to be integrated into your development
1381             environment. Here are a few ways to use it:
1382            
1383             =head3 With Vim
1384            
1385             C<Perl::Tags> was originally designed to be used with vim. See
1386             L<https://github.com/osfameron/perl-tags-vim> for an easily installable Plugin.
1387            
1388             NB: You will need to have a vim with perl compiled in it. Debuntu packages
1389             this as C<vim-perl>. Alternatively you can compile from source (you'll need
1390             Perl + the development headers C<libperl-dev>).
1391            
1392             (Note that C<perl-tags-vim> includes its own copy of C<Perl::Tags> through
1393             the magic of git submodules and L<App::FatPacker>, so you don't need to install
1394             this module from CPAN if you are only intending to use it with Vim as above!)
1395            
1396             =head3 From the Command Line
1397            
1398             See the L<bin/perl-tags> script provided.
1399            
1400             =head3 From other editors
1401            
1402             Any editor that supports ctags should be able to use this output. Documentation
1403             and code patches on how to do this are welcome.
1404            
1405             =head2 Using the Perl::Tags module within your code
1406            
1407             use Perl::Tags;
1408             my $naive_tagger = Perl::Tags::Naive->new( max_level=>2 );
1409             $naive_tagger->process(
1410             files => ['Foo.pm', 'bar.pl'],
1411             refresh=>1
1412             );
1413            
1414             print $naive_tagger; # stringifies to ctags file
1415            
1416             Recursively follows C<use> and C<require> statements, up to a maximum
1417             of C<max_level>.
1418            
1419             =head1 DETAILS
1420            
1421             There are several taggers distributed with this distribution, including:
1422            
1423             =over 4
1424            
1425             =item L<Perl::Tags::Naive>
1426            
1427             This is a more-or-less straight ripoff, slightly updated, of the original
1428             pltags code. This is a "naive" tagger, in that it makes pragmatic assumptions
1429             about what Perl code usually looks like (e.g. it doesn't actually parse the
1430             code.) This is fast, lightweight, and often Good Enough.
1431            
1432             This has additional subclasses such as L<Perl::Tags::Naive::Moose> to parse
1433             Moose declarations, and L<Perl::Tags::Naive::Lib> to parse C<use lib>.
1434            
1435             =item L<Perl::Tags::PPI>
1436            
1437             Uses the L<PPI> module to do a deeper analysis and parsing of your Perl code.
1438             This is more accurate, but slower.
1439            
1440             =item L<Perl::Tags::Hybrid>
1441            
1442             Can run multiple taggers, such as ::Naive and ::PPI, combining the results.
1443            
1444             =back
1445            
1446             =head1 EXTENDING
1447            
1448             Documentation patches are welcome: in the meantime, have a look at
1449             L<Perl::Tags::Naive> and its subclasses for a simple line-by-line method of
1450             tagging files. Alternatively L<Perl::Tags::PPI> uses L<PPI>'s built in
1451             method of parsing Perl documents.
1452            
1453             In general, you will want to override the C<get_tags_for_file> method,
1454             returning a list of C<Perl::Tags::Tag> objects to be registered.
1455            
1456             For recursively checking other modules, return a C<Perl::Tags::Tag::Recurse>
1457             object, which does I<not> create a new tag in the resulting perltags file,
1458             but instead processes the next file recursively.
1459            
1460             =head1 FEATURES
1461            
1462             * Recursive, incremental tagging.
1463             * parses `use_ok`/`require_ok` line from Test::More
1464            
1465             =head1 METHODS
1466            
1467             =cut
1468            
1469             package Perl::Tags;
1470            
1471 1     1   5 use strict; use warnings;
  1     1   3  
  1         26  
  1         5  
  1         2  
  1         21  
1472            
1473 1     1   10 use Perl::Tags::Tag;
  1         2  
  1         29  
1474 1     1   12 use Data::Dumper;
  1         7693  
  1         68  
1475 1     1   8 use File::Spec;
  1         2  
  1         71  
1476            
1477 1     1   5 use overload q("") => \&to_string;
  1         2  
  1         11  
1478             our $VERSION = 0.28;
1479            
1480             =head2 C<new>
1481            
1482             L<Perl::Tags> is an abstract baseclass. Use a class such as
1483             L<Perl::Tags::Naive> and instantiate it with C<new>.
1484            
1485             $naive_tagger = Perl::Tags::Naive->new( max_level=>2 );
1486            
1487             Accepts the following parameters
1488            
1489             max_level: levels of "use" statements to descend into, default 2
1490             do_variables: tag variables? default 1 (true)
1491             exts: use the Exuberant extensions
1492            
1493             =cut
1494            
1495             sub new {
1496 0     0 1   my $class = shift;
1497 0           my %options = (
1498             max_level => 2, # go into next file, but not down the whole tree
1499             do_variables => 1,
1500             @_);
1501            
1502 0           my $self = \%options;
1503            
1504 0           return bless $self, $class;
1505             }
1506            
1507             =head2 C<to_string>
1508            
1509             A L<Perl::Tags> object will stringify to a textual representation of a ctags
1510             file.
1511            
1512             print $tagger;
1513            
1514             =cut
1515            
1516             sub to_string {
1517 0     0 1   my $self = shift;
1518 0 0         my $tags = $self->{tags} or return '';
1519 0           my %tags = %$tags;
1520            
1521 0           my $s; # to test
1522            
1523             my @lines;
1524            
1525             # the structure is an HoHoA of
1526             #
1527             # {tag_name}
1528             # {file_name}
1529             # [ tags ]
1530             #
1531             # where the file_name level is to allow us to prioritize tags from
1532             # first-included files (on the basis that they may well be the files we
1533             # want to see first.
1534            
1535 0           my $ord = $self->{order};
1536 0           my @names = sort keys %$tags;
1537 0           for (@names) {
1538 0           my $files = $tags{$_};
1539 0           push @lines, map { @{$files->{$_}} }
  0            
  0            
1540 0           sort { $ord->{$a} <=> $ord->{$b} } keys %$files;
1541             }
1542 0           return join "\n", @lines;
1543             }
1544            
1545             =head2 C<clean_file>
1546            
1547             Delete all tags, but without touching the "order" seen, that way, if the tags
1548             are recreated, they will remain near the top of the "interestingness" tree
1549            
1550             =cut
1551            
1552             sub clean_file {
1553 0     0 1   my ($self, $file) = @_;
1554            
1555 0 0         my $tags = $self->{tags} or die "Trying to clean '$file', but there's no tags";
1556            
1557 0           for my $name (keys %$tags) {
1558 0           delete $tags->{$name}{$file};
1559             }
1560 0           delete $self->{seen}{$file};
1561             # we don't delete the {order} though
1562             }
1563            
1564             =head2 C<output>
1565            
1566             Save the file to disk if it has changed. (The private C<{is_dirty}> attribute
1567             is used, as the tags object may be made up incrementally and recursively within
1568             your IDE.
1569            
1570             =cut
1571            
1572             sub output {
1573 0     0 1   my $self = shift;
1574 0           my %options = @_;
1575 0 0         my $outfile = $options{outfile} or die "No file to write to";
1576            
1577 0 0 0       return unless $self->{is_dirty} || ! -e $outfile;
1578            
1579 0 0         open (my $OUT, '>', $outfile) or die "Couldn't open $outfile for write: $!";
1580 0           binmode STDOUT, ":encoding(UTF-8)";
1581 0           print $OUT $self;
1582 0 0         close $OUT or die "Couldn't close $outfile for write: $!";
1583            
1584 0           $self->{is_dirty} = 0;
1585             }
1586            
1587             =head2 C<process>
1588            
1589             Scan one or more Perl file for tags
1590            
1591             $tagger->process(
1592             files => [ 'Module.pm', 'script.pl' ]
1593             );
1594             $tagger->process(
1595             files => 'script.pl',
1596             refresh => 1,
1597             );
1598            
1599             =cut
1600            
1601             sub process {
1602 0     0 1   my $self = shift;
1603 0           my %options = @_;
1604 0   0       my $files = $options{files} || die "No file passed to process";
1605 0 0         my @files = ref $files ? @$files : ($files);
1606            
1607 0           $self->queue( map {
1608 0           { file=>$_, level=>1, refresh=>$options{refresh} }
1609             } @files);
1610            
1611 0           while (my $file = $self->popqueue) {
1612 0           $self->process_item( %options, %$file );
1613             }
1614 0           return 1;
1615             }
1616            
1617             =head2 C<queue>, C<popqueue>
1618            
1619             Internal methods managing the processing
1620            
1621             =cut
1622            
1623             sub queue {
1624 0     0 1   my $self = shift;
1625 0           for (@_) {
1626 0 0         push @{$self->{queue}}, $_ unless $_->{level} > $self->{max_level};
  0            
1627             }
1628             }
1629            
1630             sub popqueue {
1631 0     0 1   my $self = shift;
1632 0           return pop @{$self->{queue}};
  0            
1633             }
1634            
1635             =head2 C<process_item>, C<process_file>, C<get_tags_for_file>
1636            
1637             Do the heavy lifting for C<process> above.
1638            
1639             Taggers I<must> override the abstract method C<get_tags_for_file>.
1640            
1641             =cut
1642            
1643             sub process_item {
1644 0     0 1   my $self = shift;
1645 0           my %options = @_;
1646 0   0       my $file = $options{file} || die "No file passed to proces";
1647            
1648             # make filename absolute, (this could become an option if appropriately
1649             # refactored) but because of my usage (tags_$PID file in /tmp) I need the
1650             # absolute path anyway, and it prevents the file being included twice under
1651             # slightly different names (unless you have 2 hardlinked copies, as I do
1652             # for my .vim/ directory... bah)
1653            
1654 0           $file = File::Spec->rel2abs( $file ) ;
1655            
1656 0 0         if ($self->{seen}{$file}++) {
1657 0 0         return unless $options{refresh};
1658 0           $self->clean_file( $file );
1659             }
1660            
1661 0           $self->{is_dirty}++; # we haven't yet been written out
1662            
1663 0   0       $self->{order}{$file} = $self->{curr_order}++ || 0;
1664            
1665 0           $self->{current} = {
1666             file => $file,
1667             package_name => '',
1668             has_subs => 0,
1669             var_continues => 0,
1670             level => $options{level},
1671             };
1672            
1673 0           $self->process_file( $file );
1674            
1675 0           return $self->{tags};
1676             }
1677            
1678             sub process_file {
1679 0     0 1   my ($self, $file) = @_;
1680            
1681 0           my @tags = $self->get_tags_for_file( $file );
1682            
1683 0           $self->register( $file, @tags );
1684             }
1685            
1686             sub get_tags_for_file {
1687 1     1   1064 use Carp 'confess';
  1         1  
  1         409  
1688 0     0 1   confess "Abstract method get_tags_for_file called";
1689             }
1690            
1691             =head2 C<register>
1692            
1693             The parsing is done by a number of lightweight objects (parsers) which look for
1694             subroutine references, variables, module inclusion etc. When they are
1695             successful, they call the C<register> method in the main tags object.
1696            
1697             Note that if your tagger wants to register not a new I<declaration> but rather
1698             a I<usage> of another module, then your tagger should return a
1699             C<Perl::Tags::Tag::Recurse> object. This is a pseudo-tag which causes the linked
1700             module to be scanned in turn. See L<Perl::Tags::Naive>'s handling of C<use>
1701             statements as an example!
1702            
1703             =cut
1704            
1705             sub register {
1706 0     0 1   my ($self, $file, @tags) = @_;
1707 0           for my $tag (@tags) {
1708 0 0         $tag->on_register( $self ) or next;
1709 0   0       $tag->{pkg} ||= $self->{current}{package_name};
1710 0   0       $tag->{exts} ||= $self->{exts};
1711            
1712             # and copy absolute file if requested
1713             # $tag->{file} = $file if $self->{absolute};
1714            
1715 0           my $name = $tag->{name};
1716 0           push @{ $self->{tags}{$name}{$file} }, $tag;
  0            
1717             }
1718             }
1719            
1720             ##
1721             1;
1722            
1723             =head1 SEE ALSO
1724            
1725             L<bin/perl-tags>
1726            
1727             =head1 CONTRIBUTIONS
1728            
1729             Contributions are always welcome. The repo is in git:
1730            
1731             http://github.com/osfameron/perl-tags
1732            
1733             Please fork and make pull request. Maint bits available on request.
1734            
1735             =over 4
1736            
1737             =item wolverian
1738            
1739             ::PPI subclass
1740            
1741             =item Ian Tegebo
1742            
1743             patch to use File::Temp
1744            
1745             =item DMITRI
1746            
1747             patch to parse constant and label declarations
1748            
1749             =item drbean
1750            
1751             ::Naive::Moose, ::Naive::Spiffy and ::Naive::Lib subclasses
1752            
1753             =item Alias
1754            
1755             prodding me to make repo public
1756            
1757             =item nothingmuch
1758            
1759             ::PPI fixes
1760            
1761             =item tsee
1762            
1763             Command line interface, applying patches
1764            
1765             =back
1766            
1767             =head1 AUTHOR and LICENSE
1768            
1769             osfameron (2006-2009) - osfameron@cpan.org
1770             and contributors, as above
1771            
1772             For support, try emailing me or grabbing me on irc #london.pm on irc.perl.org
1773            
1774             This was originally ripped off pltags.pl, as distributed with vim
1775             and available from L<http://www.mscha.com/mscha.html?pltags#tools>
1776             Version 2.3, 28 February 2002
1777             Written by Michael Schaap <pltags@mscha.com>.
1778            
1779             This is licensed under the same terms as Perl itself. (Or as Vim if you prefer).
1780            
1781             =cut
1782             PERL_TAGS
1783              
1784 1         3 $fatpacked{"Perl/Tags/Hybrid.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERL_TAGS_HYBRID';
1785             package Perl::Tags::Hybrid;
1786            
1787 1     1   6 use strict; use warnings;
  1     1   2  
  1         31  
  1         5  
  1         1  
  1         31  
1788 1     1   15 use parent 'Perl::Tags';
  1         561  
  1         6  
1789            
1790             =head1 C<Perl::Tags::Hybrid>
1791            
1792             Combine the results of multiple parsers, for example C<Perl::Tags::Naive>
1793             and C<Perl::Tags::PPI>.
1794            
1795             =head1 SYNOPSIS
1796            
1797             my $parser = Perl::Tags::Hybrid->new(
1798             taggers => [
1799             Perl::Tags::Naive->new,
1800             Perl::Tags::PPI->new,
1801             ],
1802             );
1803            
1804             =head2 C<get_tags_for_file>
1805            
1806             Registers the results from running each sub-taggers
1807            
1808             =cut
1809            
1810             sub get_taggers {
1811 0     0 0   my $self = shift;
1812 0 0         return @{ $self->{taggers} || [] };
  0            
1813             }
1814            
1815             sub get_tags_for_file {
1816 0     0 1   my ($self, $file) = @_;
1817            
1818 0           my @taggers = $self->get_taggers;
1819            
1820 0           return map { $_->get_tags_for_file( $file ) } @taggers;
  0            
1821             }
1822            
1823             1;
1824             PERL_TAGS_HYBRID
1825              
1826 1         13 $fatpacked{"Perl/Tags/Naive.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERL_TAGS_NAIVE';
1827             package Perl::Tags::Naive;
1828            
1829 1     1   5 use strict; use warnings;
  1     1   2  
  1         35  
  1         4  
  1         2  
  1         21  
1830 1     1   5 use parent 'Perl::Tags';
  1         2  
  1         7  
1831            
1832             =head1 C<Perl::Tags::Naive>
1833            
1834             A naive implementation. That is to say, it's based on the classic C<pltags.pl>
1835             script distributed with Perl, which is by and large a better bet than the
1836             results produced by C<ctags>. But a "better" approach may be to integrate this
1837             with PPI.
1838            
1839             =head2 Subclassing
1840            
1841             See L<TodoTagger> in the C<t/> directory of the distribution for a fully
1842             working example (tested in <t/02_subclass.t>). You may want to reuse parsers
1843             in the ::Naive package, or use all of the existing parsers and add your own.
1844            
1845             package My::Tagger;
1846             use Perl::Tags;
1847             use parent 'Perl::Tags::Naive';
1848            
1849             sub get_parsers {
1850             my $self = shift;
1851             return (
1852             $self->can('todo_line'), # a new parser
1853             $self->SUPER::get_parsers(), # all ::Naive's parsers
1854             # or maybe...
1855             $self->can('variable'), # one of ::Naive's parsers
1856             );
1857             }
1858            
1859             sub todo_line {
1860             # your new parser code here!
1861             }
1862             sub package_line {
1863             # override one of ::Naive's parsers
1864             }
1865            
1866             Because ::Naive uses C<can('parser')> instead of C<\&parser>, you
1867             can just override a particular parser by redefining in the subclass.
1868            
1869             =head2 C<get_tags_for_file>
1870            
1871             ::Naive uses a simple line-by-line analysis of Perl code, comparing
1872             each line against an array of parsers returned by the L<get_parsers> method.
1873            
1874             The first of these parsers that matches (if any) will return the
1875             tag/control to be registred by the tagger.
1876            
1877             =cut
1878            
1879             {
1880             # Tags that start POD:
1881             my @start_tags = qw(pod head1 head2 head3 head4 over item back begin
1882             end for encoding);
1883             my @end_tags = qw(cut);
1884            
1885             my $startpod = '^=(?:' . join('|', @start_tags) . ')\b';
1886             my $endpod = '^=(?:' . join('|', @end_tags) . ')\b';
1887            
1888 0     0 0   sub STARTPOD { qr/$startpod/ }
1889 0     0 0   sub ENDPOD { qr/$endpod/ }
1890             }
1891            
1892             sub get_tags_for_file {
1893 0     0 1   my ($self, $file) = @_;
1894            
1895 0           my @parsers = $self->get_parsers(); # function refs
1896            
1897 0 0         open (my $IN, '<', $file) or die "Couldn't open file `$file`: $!\n";
1898            
1899 0           my $start = STARTPOD();
1900 0           my $end = ENDPOD();
1901            
1902 0           my @all_tags;
1903            
1904 0           while (<$IN>) {
1905 0 0         next if (/$start/o .. /$end/o); # Skip over POD.
1906 0           chomp;
1907 0           my $statement = my $line = $_;
1908 0           PARSELOOP: for my $parser (@parsers) {
1909 0           my @tags = $parser->(
1910             $self,
1911             $line,
1912             $statement,
1913             $file
1914             );
1915 0           push @all_tags, @tags;
1916             }
1917             }
1918 0           return @all_tags;
1919             }
1920            
1921             =head2 C<get_parsers>
1922            
1923             The following parsers are defined by this module.
1924            
1925             =over 4
1926            
1927             =cut
1928            
1929             sub get_parsers {
1930 0     0 1   my $self = shift;
1931             return (
1932 0           $self->can('trim'),
1933             $self->can('variable'),
1934             $self->can('package_line'),
1935             $self->can('sub_line'),
1936             $self->can('use_constant'),
1937             $self->can('use_line'),
1938             $self->can('label_line'),
1939             );
1940             }
1941            
1942             =item C<trim>
1943            
1944             A filter rather than a parser, removes whitespace and comments.
1945            
1946             =cut
1947            
1948             sub trim {
1949 0     0 1   shift;
1950             # naughtily work on arg inplace
1951 0           $_[1] =~ s/#.*//; # remove comment. Naively
1952 0           $_[1] =~ s/^\s*//; # Trim spaces
1953 0           $_[1] =~ s/\s*$//;
1954            
1955 0           return;
1956             }
1957            
1958             =item C<variable>
1959            
1960             Tags definitions of C<my>, C<our>, and C<local> variables.
1961            
1962             Returns a L<Perl::Tags::Tag::Var> if found
1963            
1964             =cut
1965            
1966             sub variable {
1967             # don't handle continuing thingy for now
1968 0     0 1   my ($self, $line, $statement, $file) = @_;
1969            
1970 0 0         return unless $self->{do_variables};
1971             # I'm not sure I see this as all that useful
1972            
1973 0 0 0       if ($self->{var_continues} || $statement =~/^(my|our|local)\b/) {
1974            
1975 0           $self->{current}{var_continues} = ! ($statement=~/;$/);
1976 0           $statement =~s/=.*$//;
1977             # remove RHS with extreme prejudice
1978             # and also not accounting for things like
1979             # my $x=my $y=my $z;
1980            
1981 0           my @vars = $statement=~/[\$@%]((?:\w|:)+)\b/g;
1982            
1983             # use Data::Dumper;
1984             # print Dumper({ vars => \@vars, statement => $statement });
1985            
1986 0           return map {
1987 0           Perl::Tags::Tag::Var->new(
1988             name => $_,
1989             file => $file,
1990             line => $line,
1991             linenum => $.,
1992             );
1993             } @vars;
1994             }
1995 0           return;
1996             }
1997            
1998             =item C<package_line>
1999            
2000             Parse a package declaration, returning a L<Perl::Tags::Tag::Package> if found.
2001            
2002             =cut
2003            
2004             sub package_line {
2005 0     0 1   my ($self, $line, $statement, $file) = @_;
2006            
2007 0 0         if ($statement=~/^package\s+((?:\w|:)+)\b/) {
2008             return (
2009 0           Perl::Tags::Tag::Package->new(
2010             name => $1,
2011             file => $file,
2012             line => $line,
2013             linenum => $.,
2014             )
2015             );
2016             }
2017 0           return;
2018             }
2019            
2020             =item C<sub_line>
2021            
2022             Parse the declaration of a subroutine, returning a L<Perl::Tags::Tag::Sub> if found.
2023            
2024             =cut
2025            
2026             sub sub_line {
2027 0     0 1   my ($self, $line, $statement, $file) = @_;
2028 0 0         if ($statement=~/sub\s+(\w+)\b/) {
2029             return (
2030 0           Perl::Tags::Tag::Sub->new(
2031             name => $1,
2032             file => $file,
2033             line => $line,
2034             linenum => $.,
2035             )
2036             );
2037             }
2038            
2039 0           return;
2040             }
2041            
2042             =item C<use_constant>
2043            
2044             Parse a use constant directive
2045            
2046             =cut
2047            
2048             sub use_constant {
2049 0     0 1   my ($self, $line, $statement, $file) = @_;
2050 0 0         if ($statement =~/^\s*use\s+constant\s+([^=[:space:]]+)/) {
2051             return (
2052 0           Perl::Tags::Tag::Constant->new(
2053             name => $1,
2054             file => $file,
2055             line => $line,
2056             linenum => $.,
2057             )
2058             );
2059             }
2060 0           return;
2061             }
2062            
2063             =item C<use_line>
2064            
2065             Parse a use, require, and also a use_ok line (from Test::More).
2066             Uses a dummy tag (L<Perl::Tags::Tag::Recurse> to do so).
2067            
2068             =cut
2069            
2070             sub use_line {
2071 0     0 1   my ($self, $line, $statement, $file) = @_;
2072            
2073 0           my @ret;
2074 0 0         if ($statement=~/^(?:use|require)(_ok\(?)?\s+(.*)/) {
2075 0           my @packages = split /\s+/, $2; # may be more than one if base
2076 0 0         @packages = ($packages[0]) if $1; # if use_ok ecc. from Test::More
2077            
2078 0           for (@packages) {
2079 0           s/^q[wq]?[[:punct:]]//;
2080 0           /((?:\w|:)+)/;
2081 0 0         $1 and push @ret, Perl::Tags::Tag::Recurse->new(
2082             name => $1,
2083             line=>'dummy' );
2084             }
2085             }
2086 0           return @ret;
2087             }
2088            
2089             =item C<label_line>
2090            
2091             Parse label declaration
2092            
2093             =cut
2094            
2095             sub label_line {
2096 0     0 1   my ($self, $line, $statement, $file) = @_;
2097 0 0         if ($statement=~/^\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*:(?:[^:]|$)/) {
2098             return (
2099 0           Perl::Tags::Tag::Label->new(
2100             name => $1,
2101             file => $file,
2102             line => $line,
2103             linenum => $.,
2104             )
2105             );
2106             }
2107 0           return;
2108             }
2109            
2110             =back
2111            
2112             =cut
2113            
2114             1;
2115             PERL_TAGS_NAIVE
2116              
2117 1         10 $fatpacked{"Perl/Tags/Naive/Lib.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERL_TAGS_NAIVE_LIB';
2118             package Perl::Tags::Naive::Lib;
2119            
2120             use strict; use warnings;
2121             use parent 'Perl::Tags::Naive';
2122            
2123             =head2 C<get_parsers>
2124            
2125             The following parsers are defined by this module.
2126            
2127             =over 4
2128            
2129             =cut
2130            
2131             sub get_parsers
2132             {
2133             my $self = shift;
2134             return (
2135             $self->SUPER::get_parsers(),
2136             $self->can('uselib_line'),
2137             );
2138             }
2139            
2140            
2141             =item C<uselib_line>
2142            
2143             Parse a use/require lib line
2144             Unshift libraries found onto @INC.
2145            
2146             =cut
2147            
2148             sub uselib_line {
2149             my ($self, $line, $statement, $file) = @_;
2150            
2151             my @ret;
2152             if ($statement=~/^(?:use|require)\s+lib\s+(.*)/) {
2153             my @libraries = split /\s+/, $1; # may be more than one
2154            
2155             for (@libraries) {
2156             s/^q[wq]?[[:punct:]]//;
2157             /((?:\w|:)+)/;
2158             $1 and unshift @INC, $1;
2159             }
2160             }
2161             return @ret;
2162             }
2163            
2164             1;
2165            
2166             =back
2167            
2168             #package Perl::Tags::Tag::Recurse::Lib;
2169             #
2170             #our @ISA = qw/Perl::Tags::Tag::Recurse/;
2171             #
2172             #=head1 C<Perl::Tags::Tag::Recurse::Lib>
2173             #
2174             #=head2 C<type>: dummy
2175             #
2176             #=head2 C<on_register>
2177             #
2178             #Recurse adding this new module accessible from a use lib statement to the queue.
2179             #
2180             #=cut
2181             #
2182             #package Perl::Tags::Tag::Recurse;
2183             #
2184             #sub on_register {
2185             # my ($self, $tags) = @_;
2186             #
2187             # my $name = $self->{name};
2188             # my $path;
2189             # my @INC_ORIG = @INC;
2190             # my @INC =
2191             # eval {
2192             # $path = locate( $name ); # or warn "Couldn't find path for $module";
2193             # };
2194             # # return if $@;
2195             # return unless $path;
2196             # $tags->queue( { file=>$path, level=>$tags->{current}{level}+1 , refresh=>0} +);
2197             # return; # don't get added
2198             #}
2199            
2200             ##
2201            
2202             1;
2203            
2204             =head1 AUTHOR and LICENSE
2205            
2206             dr bean - drbean at sign cpan a dot org
2207             osfameron (2006) - osfameron@gmail.com
2208            
2209             For support, try emailing me or grabbing me on irc #london.pm on irc.perl.org
2210            
2211             This was originally ripped off pltags.pl, as distributed with vim
2212             and available from L<http://www.mscha.com/mscha.html?pltags#tools>
2213             Version 2.3, 28 February 2002
2214             Written by Michael Schaap <pltags@mscha.com>.
2215            
2216             This is licensed under the same terms as Perl itself. (Or as Vim if you +prefer).
2217            
2218             =cut
2219             PERL_TAGS_NAIVE_LIB
2220              
2221 1         13 $fatpacked{"Perl/Tags/Naive/Moose.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERL_TAGS_NAIVE_MOOSE';
2222 1     1   5 use strict; use warnings;
  1     1   2  
  1         25  
  1         5  
  1         1  
  1         54  
2223             package Perl::Tags::Naive::Moose;
2224            
2225 1     1   5 use parent 'Perl::Tags::Naive';
  1         2  
  1         5  
2226            
2227             =head2 C<get_parsers>
2228            
2229             The following parsers are defined by this module.
2230            
2231             =over 4
2232            
2233             =cut
2234            
2235             sub get_parsers
2236             {
2237 0     0 1   my $self = shift;
2238             return (
2239 0           $self->SUPER::get_parsers(),
2240             $self->can('extends_line'),
2241             $self->can('with_line'),
2242             $self->can('has_line'),
2243             $self->can('around_line'),
2244             $self->can('before_line'),
2245             $self->can('after_line'),
2246             $self->can('override_line'),
2247             $self->can('augment_line'),
2248             $self->can('class_line'),
2249             $self->can('method_line'),
2250             $self->can('role_line'),
2251             );
2252             }
2253            
2254             =item C<extends_line>
2255            
2256             Parse the declaration of a 'extends' Moose keyword, returning a L<Perl::Tags::Tag::Extends> if found.
2257            
2258             =cut
2259            
2260             sub extends_line {
2261 0     0 1   my ($self, $line, $statement, $file) = @_;
2262 0 0         if ($statement=~/extends\s+["']?((?:\w+|::)+)\b/) {
2263 0           return Perl::Tags::Tag::Recurse->new(
2264             name => $1,
2265             line => 'dummy',
2266             );
2267             }
2268 0           return;
2269             }
2270            
2271             =item C<with_line>
2272            
2273             Parse the declaration of a 'with' Moose keyword, returning a L<Perl::Tags::Tag::With> tag if found.
2274            
2275             =cut
2276            
2277             sub with_line {
2278 0     0 1   my ( $self, $line, $statement, $file ) = @_;
2279 0 0         if ( $statement =~ m/\bwith\s+(?:qw.)?\W*([a-zA-Z0-9_: ]+)/ ) {
2280 0           my @roles = split /\s+/, $1;
2281 0           my @returns;
2282 0           foreach my $role (@roles) {
2283 0           push @returns, Perl::Tags::Tag::Recurse->new(
2284             name => $role,
2285             line => 'dummy',
2286             );
2287             }
2288 0           return @returns;
2289             }
2290 0           return;
2291             }
2292            
2293             =item C<has_line>
2294            
2295             Parse the declaration of a 'has' Moose keyword, returning a L<Perl::Tags::Tag::Has> if found.
2296            
2297             =cut
2298            
2299             sub has_line {
2300 0     0 1   my ($self, $line, $statement, $file) = @_;
2301 0 0         if ($statement=~/\bhas\s+["']?(\w+)\b/) {
2302             return (
2303 0           Perl::Tags::Tag::Has->new(
2304             name => $1,
2305             file => $file,
2306             line => $line,
2307             linenum => $.,
2308             )
2309             );
2310             }
2311 0           return;
2312             }
2313            
2314             =item C<around_line>
2315            
2316             Parse the declaration of a 'around' Moose keyword, returning a L<Perl::Tags::Tag::Around> tag if found.
2317            
2318             =cut
2319            
2320             sub around_line {
2321 0     0 1   my ($self, $line, $statement, $file) = @_;
2322 0 0         if ($statement=~/around\s+["'](\w+)\b/) {
2323             return (
2324 0           Perl::Tags::Tag::Around->new(
2325             name => $1,
2326             file => $file,
2327             line => $line,
2328             linenum => $.,
2329             )
2330             );
2331             }
2332 0           return;
2333             }
2334            
2335             =item C<before_line>
2336            
2337             Parse the declaration of a 'before' Moose keyword, returning a L<Perl::Tags::Tag::Before> tag if found.
2338            
2339             =cut
2340            
2341             sub before_line {
2342 0     0 1   my ($self, $line, $statement, $file) = @_;
2343 0 0         if ($statement=~/before\s+["'](\w+)\b/) {
2344             return (
2345 0           Perl::Tags::Tag::Before->new(
2346             name => $1,
2347             file => $file,
2348             line => $line,
2349             linenum => $.,
2350             )
2351             );
2352             }
2353 0           return;
2354             }
2355            
2356             =item C<after_line>
2357            
2358             Parse the declaration of a 'after' Moose keyword, returning a L<Perl::Tags::Tag::After> tag if found.
2359            
2360             =cut
2361            
2362             sub after_line {
2363 0     0 1   my ($self, $line, $statement, $file) = @_;
2364 0 0         if ($statement=~/after\s+["'](\w+)\b/) {
2365             return (
2366 0           Perl::Tags::Tag::After->new(
2367             name => $1,
2368             file => $file,
2369             line => $line,
2370             linenum => $.,
2371             )
2372             );
2373             }
2374 0           return;
2375             }
2376            
2377             =item C<override_line>
2378            
2379             Parse the declaration of a 'override' Moose keyword, returning a L<Perl::Tags::Tag::Override> tag if found.
2380            
2381             =cut
2382            
2383             sub override_line {
2384 0     0 1   my ($self, $line, $statement, $file) = @_;
2385 0 0         if ($statement=~/override\s+["'](\w+)\b/) {
2386             return (
2387 0           Perl::Tags::Tag::Override->new(
2388             name => $1,
2389             file => $file,
2390             line => $line,
2391             linenum => $.,
2392             )
2393             );
2394             }
2395 0           return;
2396             }
2397            
2398             =item C<augment_line>
2399            
2400             Parse the declaration of a 'augment' Moose keyword, returning a L<Perl::Tags::Tag::Augment> tag if found.
2401            
2402             =cut
2403            
2404             sub augment_line {
2405 0     0 1   my ($self, $line, $statement, $file) = @_;
2406 0 0         if ($statement=~/augment\s+["']?(\w+)\b/) {
2407             return (
2408 0           Perl::Tags::Tag::Augment->new(
2409             name => $1,
2410             file => $file,
2411             line => $line,
2412             linenum => $.,
2413             )
2414             );
2415             }
2416 0           return;
2417             }
2418            
2419             =item C<class_line>
2420            
2421             Parse the declaration of a 'class' Moose keyword, returning a L<Perl::Tags::Tag::Class> tag if found.
2422            
2423             =cut
2424            
2425             sub class_line {
2426 0     0 1   my ($self, $line, $statement, $file) = @_;
2427 0 0         if ($statement=~/class\s+(\w+)\b/) {
2428             return (
2429 0           Perl::Tags::Tag::Class->new(
2430             name => $1,
2431             file => $file,
2432             line => $line,
2433             linenum => $.,
2434             )
2435             );
2436             }
2437 0           return;
2438             }
2439            
2440             =item C<method_line>
2441            
2442             Parse the declaration of a 'method' Moose keyword, returning a L<Perl::Tags::Tag::Method> tag if found.
2443            
2444             =cut
2445            
2446             sub method_line {
2447 0     0 1   my ($self, $line, $statement, $file) = @_;
2448 0 0         if ($statement=~/method\s+(\w+)\b/) {
2449             return (
2450 0           Perl::Tags::Tag::Method->new(
2451             name => $1,
2452             file => $file,
2453             line => $line,
2454             linenum => $.,
2455             )
2456             );
2457             }
2458 0           return;
2459             }
2460            
2461             =item C<role_line>
2462            
2463             Parse the declaration of a 'role' Moose keyword, returning a L<Perl::Tags::Tag::Role> tag if found.
2464            
2465             =cut
2466            
2467             sub role_line {
2468 0     0 1   my ($self, $line, $statement, $file) = @_;
2469 0 0         if ($statement=~/role\s+(\w+)\b/) {
2470             return (
2471 0           Perl::Tags::Tag::Role->new(
2472             name => $1,
2473             file => $file,
2474             line => $line,
2475             linenum => $.,
2476             )
2477             );
2478             }
2479 0           return;
2480             }
2481            
2482             =head1 C<Perl::Tags::Tag::Method>
2483            
2484             =head2 C<type>: Method
2485            
2486             =cut
2487            
2488             package Perl::Tags::Tag::Method;
2489             our @ISA = qw/Perl::Tags::Tag::Sub/;
2490            
2491 0     0     sub type { 'Method' }
2492            
2493            
2494             =head1 C<Perl::Tags::Tag::Has>
2495            
2496             =head2 C<type>: Has
2497            
2498             =cut
2499            
2500             package Perl::Tags::Tag::Has;
2501             our @ISA = qw/Perl::Tags::Tag::Method/;
2502            
2503 0     0     sub type { 'Has' }
2504            
2505             =head1 C<Perl::Tags::Tag::Around>
2506            
2507             =head2 C<type>: Around
2508            
2509             =cut
2510            
2511             package Perl::Tags::Tag::Around;
2512             our @ISA = qw/Perl::Tags::Tag::Method/;
2513            
2514 0     0     sub type { 'Around' }
2515            
2516             =head1 C<Perl::Tags::Tag::Before>
2517            
2518             =head2 C<type>: Before
2519            
2520             =cut
2521            
2522             package Perl::Tags::Tag::Before;
2523             our @ISA = qw/Perl::Tags::Tag::Method/;
2524            
2525 0     0     sub type { 'Before' }
2526            
2527             =head1 C<Perl::Tags::Tag::After>
2528            
2529             =head2 C<type>: After
2530            
2531             =cut
2532            
2533             package Perl::Tags::Tag::After;
2534             our @ISA = qw/Perl::Tags::Tag::Method/;
2535            
2536 0     0     sub type { 'After' }
2537            
2538             =head1 C<Perl::Tags::Tag::Override>
2539            
2540             =head2 C<type>: Override
2541            
2542             =cut
2543            
2544             package Perl::Tags::Tag::Override;
2545             our @ISA = qw/Perl::Tags::Tag::Method/;
2546            
2547 0     0     sub type { 'Override' }
2548            
2549             =head1 C<Perl::Tags::Tag::Augment>
2550            
2551             =head2 C<type>: Augment
2552            
2553             =cut
2554            
2555             package Perl::Tags::Tag::Augment;
2556             our @ISA = qw/Perl::Tags::Tag::Method/;
2557            
2558 0     0     sub type { 'Augment' }
2559            
2560             =head1 C<Perl::Tags::Tag::Class>
2561            
2562             =head2 C<type>: Class
2563            
2564             =cut
2565            
2566             package Perl::Tags::Tag::Class;
2567             our @ISA = qw/Perl::Tags::Tag::Package/;
2568            
2569 0     0     sub type { 'Class' }
2570            
2571             =head1 C<Perl::Tags::Tag::Role>
2572            
2573             =head2 C<type>: Role
2574            
2575             =cut
2576            
2577             package Perl::Tags::Tag::Role;
2578             our @ISA = qw/Perl::Tags::Tag::Package/;
2579            
2580 0     0     sub type { 'Role' }
2581            
2582             1;
2583            
2584             =head1 AUTHOR and LICENSE
2585            
2586             dr bean - drbean at sign cpan a dot org
2587            
2588             This is licensed under the same terms as Perl itself. (Or as Vim if you +prefer).
2589            
2590             =cut
2591            
2592             # vim: set ts=8 sts=4 sw=4 noet:
2593             PERL_TAGS_NAIVE_MOOSE
2594              
2595 1         7 $fatpacked{"Perl/Tags/Naive/Spiffy.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERL_TAGS_NAIVE_SPIFFY';
2596             package Perl::Tags::Naive::Spiffy;
2597            
2598             use strict; use warnings;
2599             use parent 'Perl::Tags::Naive';
2600            
2601             =head2 C<get_parsers>
2602            
2603             The following parsers are defined by this module.
2604            
2605             =over 4
2606            
2607             =cut
2608            
2609             sub get_parsers
2610             {
2611             my $self = shift;
2612             return (
2613             $self->SUPER::get_parsers(),
2614             $self->can('field_line'),
2615             $self->can('stub_line'),
2616             );
2617             }
2618            
2619             =item C<field_line>
2620            
2621             Parse the declaration of a Spiffy class accessor method, returning a L<Perl::Tags::Tag::Field> if found.
2622            
2623             =cut
2624            
2625             sub field_line {
2626             my ($self, $line, $statement, $file) = @_;
2627             if ($statement=~/field\s+["']?(\w+)\b/) {
2628             return (
2629             Perl::Tags::Tag::Field->new(
2630             name => $1,
2631             file => $file,
2632             line => $line,
2633             linenum => $.,
2634             )
2635             );
2636             }
2637             return;
2638             }
2639            
2640             =item C<stub_line>
2641            
2642             Parse the declaration of a Spiffy stub method, returning a L<Perl::Tags::Tag::Stub> if found.
2643            
2644             =cut
2645            
2646             sub stub_line {
2647             my ($self, $line, $statement, $file) = @_;
2648             if ($statement=~/stub\s+["']?(\w+)\b/) {
2649             return (
2650             Perl::Tags::Tag::Stub->new(
2651             name => $1,
2652             file => $file,
2653             line => $line,
2654             linenum => $.,
2655             )
2656             );
2657             }
2658             return;
2659             }
2660            
2661             =back
2662            
2663             =head1 C<Perl::Tags::Tag::Field>
2664            
2665             =head2 C<type>: Field
2666            
2667             =cut
2668            
2669             package Perl::Tags::Tag::Field;
2670             our @ISA = qw/Perl::Tags::Tag/;
2671            
2672             sub type { 'Field' }
2673            
2674             =head1 C<Perl::Tags::Tag::Stub>
2675            
2676             =head2 C<type>: Stub
2677            
2678             =cut
2679            
2680             package Perl::Tags::Tag::Stub;
2681             our @ISA = qw/Perl::Tags::Tag/;
2682            
2683             sub type { 'Stub' }
2684            
2685             1;
2686            
2687             =head1 AUTHOR and LICENSE
2688            
2689             dr bean - drbean at sign cpan a dot org
2690             osfameron (2006) - osfameron@gmail.com
2691            
2692             For support, try emailing me or grabbing me on irc #london.pm on irc.perl.org
2693            
2694             This was originally ripped off pltags.pl, as distributed with vim
2695             and available from L<http://www.mscha.com/mscha.html?pltags#tools>
2696             Version 2.3, 28 February 2002
2697             Written by Michael Schaap <pltags@mscha.com>.
2698            
2699             This is licensed under the same terms as Perl itself. (Or as Vim if you +prefer).
2700            
2701             =cut
2702             PERL_TAGS_NAIVE_SPIFFY
2703              
2704 1         3 $fatpacked{"Perl/Tags/PPI.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERL_TAGS_PPI';
2705             package Perl::Tags::PPI;
2706            
2707             use strict; use warnings;
2708            
2709             use base qw(Perl::Tags);
2710            
2711             use PPI;
2712            
2713             sub ppi_all {
2714             my ( $self, $file ) = @_;
2715            
2716             my $doc = PPI::Document->new($file) || return;
2717            
2718             $doc->index_locations;
2719            
2720             return map { $self->_tagify( $_, "$file" ) }
2721             @{ $doc->find(sub { $_[1]->isa("PPI::Statement") }) || [] }
2722             }
2723            
2724             sub get_tags_for_file {
2725             my ( $self, $file, @parsers ) = @_;
2726            
2727             my @tags = $self->ppi_all( $file );
2728            
2729             return @tags;
2730             }
2731            
2732             sub _tagify {
2733             my ( $self, $thing, $file ) = @_;
2734            
2735             my $class = $thing->class;
2736            
2737             my ( $first_line ) = split /\n/, $thing;
2738            
2739             if ( my ( $subtype ) = ( $class =~ /^PPI::Statement::(.*)$/ ) ) {
2740            
2741             my $method = "_tagify_" . lc($subtype);
2742            
2743             if ( $self->can($method) ) {
2744             return $self->$method( $thing, $file, $first_line );
2745             }
2746             }
2747            
2748             return $self->_tagify_statement($thing, $file, $first_line);
2749             }
2750            
2751             # catch all
2752             sub _tagify_statement {
2753             my ( $self, $thing, $file, $first_line ) = @_;
2754            
2755             return;
2756             }
2757            
2758             sub _tagify_sub {
2759             my ( $self, $thing, $file, $line ) = @_;
2760            
2761             return Perl::Tags::Tag::Sub->new(
2762             name => $thing->name,
2763             file => $file,
2764             line => $line,
2765             linenum => $thing->location->[0],
2766             pkg => $thing->guess_package
2767             );
2768             }
2769            
2770             sub _tagify_variable {
2771             my ( $self, $thing, $file, $line ) = @_;
2772             return map {
2773             Perl::Tags::Tag::Var->new(
2774             name => $_,
2775             file => $file,
2776             line => $line,
2777             linenum => $thing->location->[0],
2778             )
2779             } $thing->variables;
2780             }
2781            
2782             sub _tagify_package {
2783             my ( $self, $thing, $file, $line ) = @_;
2784            
2785             return Perl::Tags::Tag::Package->new(
2786             name => $thing->namespace,
2787             file => $file,
2788             line => $line,
2789             linenum => $thing->location->[0],
2790             );
2791             }
2792            
2793             sub _tagify_include {
2794             my ( $self, $thing, $file ) = @_;
2795            
2796             if ( my $module = $thing->module ) {
2797             return Perl::Tags::Tag::Recurse->new(
2798             name => $module,
2799             line => "dummy",
2800             );
2801             }
2802            
2803             return;
2804             }
2805            
2806             sub PPI::Statement::Sub::guess_package {
2807             my ($self) = @_;
2808            
2809             my $temp = $self;
2810             my $package;
2811            
2812             while (1) {
2813             $temp = $temp->sprevious_sibling
2814             or last;
2815            
2816             if ( $temp->class eq 'PPI::Statement::Package' ) {
2817             $package = $temp;
2818             last;
2819             }
2820             }
2821            
2822             return $package;
2823             }
2824            
2825             =head1 NAME
2826            
2827             Perl::Tags::PPI - use PPI to parse
2828            
2829             =head1 DESCRIPTION
2830            
2831             This is a drop-in replacement for the basic L<Perl::Tags> parser. Please see that module's
2832             perldoc, and test C<t/04_ppi.t> for details.
2833            
2834             (Doc patches very welcome!)
2835            
2836             =head1 AUTHOR
2837            
2838             (c) Wolverian 2006
2839            
2840             Modifications by nothingmuch
2841            
2842             =cut
2843            
2844             1;
2845             PERL_TAGS_PPI
2846              
2847 1         14 $fatpacked{"Perl/Tags/Tag.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'PERL_TAGS_TAG';
2848             package Perl::Tags::Tag;
2849 1     1   4 use strict; use warnings;
  1     1   2  
  1         28  
  1         5  
  1         2  
  1         35  
2850            
2851 1     1   5 use overload q("") => \&to_string;
  1         2  
  1         10  
2852            
2853             =head2 C<new>
2854            
2855             Returns a new tag object
2856            
2857             =cut
2858            
2859             sub new {
2860 0     0 1   my $class = shift;
2861 0           my %options = @_;
2862            
2863 0           $options{type} = $class->type;
2864            
2865             # chomp and escape line
2866 0           chomp (my $line = $options{line});
2867            
2868 0           $line =~ s{\\}{\\\\}g;
2869 0           $line =~ s{/}{\\/}g;
2870             # $line =~ s{\$}{\\\$}g;
2871            
2872 0           my $self = bless {
2873             name => $options{name},
2874             file => $options{file},
2875             type => $options{type},
2876             is_static => $options{is_static},
2877             line => $line,
2878             linenum => $options{linenum},
2879             exts => $options{exts}, # exuberant?
2880             pkg => $options{pkg}, # package name
2881             }, $class;
2882            
2883 0           $self->modify_options();
2884 0           return $self;
2885             }
2886            
2887             =head2 C<type>, C<modify_options>
2888            
2889             Abstract methods
2890            
2891             =cut
2892            
2893             sub type {
2894 0     0 1   die "Tried to call 'type' on virtual superclass";
2895             }
2896            
2897 0     0 1   sub modify_options { return } # no change
2898            
2899             =head2 C<to_string>
2900            
2901             A tag stringifies to an appropriate line in a ctags file.
2902            
2903             =cut
2904            
2905             sub to_string {
2906 0     0 1   my $self = shift;
2907            
2908 0 0         my $name = $self->{name} or die;
2909 0 0         my $file = $self->{file} or die;
2910 0 0         my $line = $self->{line} or die;
2911 0           my $linenum = $self->{linenum};
2912 0   0       my $pkg = $self->{pkg} || '';
2913            
2914 0           my $tagline = "$name\t$file\t/$line/";
2915            
2916             # Exuberant extensions
2917 0 0         if ($self->{exts}) {
2918 0           $tagline .= qq(;"\t$self->{type});
2919 0           $tagline .= "\tline:$linenum";
2920 0 0         $tagline .= ($self->{is_static} ? "\tfile:" : '');
2921 0 0         $tagline .= ($self->{pkg} ? "\tclass:$self->{pkg}" : '');
2922             }
2923 0           return $tagline;
2924             }
2925            
2926             =head2 C<on_register>
2927            
2928             Allows tag to meddle with process when registered with the main tagger object.
2929             Return false if want to prevent registration (e.g. for control tags such as
2930             C<Perl::Tags::Tag::Recurse>.)
2931            
2932             =cut
2933            
2934             sub on_register {
2935             # my $self = shift;
2936             # my $tags = shift;
2937             # .... do stuff in subclasses
2938            
2939 0     0 1   return 1; # or undef to prevent registration
2940             }
2941            
2942             =head1 C<Perl::Tags::Tag::Package>
2943            
2944             =head2 C<type>: p
2945            
2946             =head2 C<modify_options>
2947            
2948             Sets static=0
2949            
2950             =head2 C<on_register>
2951            
2952             Sets the package name
2953            
2954             =cut
2955            
2956             package Perl::Tags::Tag::Package;
2957             our @ISA = qw/Perl::Tags::Tag/;
2958            
2959             # QUOTE:
2960             # Make a tag for this package unless we're told not to. A
2961             # package is never static.
2962            
2963 0     0     sub type { 'p' }
2964            
2965             sub modify_options {
2966 0     0     my $self = shift;
2967 0           $self->{is_static} = 0;
2968             }
2969            
2970             sub on_register {
2971 0     0     my ($self, $tags) = @_;
2972 0           $tags->{current}{package_name} = $self->{name};
2973             }
2974            
2975             =head1 C<Perl::Tags::Tag::Var>
2976            
2977             =head2 C<type>: v
2978            
2979             =head2 C<on_register>
2980            
2981             Make a tag for this variable unless we're told not to. We
2982             assume that a variable is always static, unless it appears
2983             in a package before any sub. (Not necessarily true, but
2984             it's ok for most purposes and Vim works fine even if it is
2985             incorrect)
2986             - pltags.pl comments
2987            
2988             =cut
2989            
2990             package Perl::Tags::Tag::Var;
2991             our @ISA = qw/Perl::Tags::Tag/;
2992            
2993 0     0     sub type { 'v' }
2994            
2995             # QUOTE:
2996            
2997             sub on_register {
2998 0     0     my ($self, $tags) = @_;
2999 0 0 0       $self->{is_static} = ( $tags->{current}{package_name} || $tags->{current}{has_subs} ) ? 1 : 0;
3000            
3001 0           return 1;
3002             }
3003             =head1 C<Perl::Tags::Tag::Sub>
3004            
3005             =head2 C<type>: s
3006            
3007             =head2 C<on_register>
3008            
3009             Make a tag for this sub unless we're told not to. We assume
3010             that a sub is static, unless it appears in a package. (Not
3011             necessarily true, but it's ok for most purposes and Vim works
3012             fine even if it is incorrect)
3013             - pltags comments
3014            
3015             =cut
3016            
3017             package Perl::Tags::Tag::Sub;
3018             our @ISA = qw/Perl::Tags::Tag/;
3019            
3020 0     0     sub type { 's' }
3021            
3022             sub on_register {
3023 0     0     my ($self, $tags) = @_;
3024 0           $tags->{current}{has_subs}++ ;
3025 0 0         $self->{is_static}++ unless $tags->{current}{package_name};
3026            
3027 0           return 1;
3028             }
3029            
3030             =head1 C<Perl::Tags::Tag::Constant>
3031            
3032             =head2 C<type>: c
3033            
3034             =cut
3035            
3036             package Perl::Tags::Tag::Constant;
3037             our @ISA = qw/Perl::Tags::Tag/;
3038            
3039 0     0     sub type { 'c' }
3040            
3041             =head1 C<Perl::Tags::Tag::Label>
3042            
3043             =head2 C<type>: l
3044            
3045             =cut
3046            
3047             package Perl::Tags::Tag::Label;
3048             our @ISA = qw/Perl::Tags::Tag/;
3049            
3050 0     0     sub type { 'l' }
3051            
3052             =head1 C<Perl::Tags::Tag::Recurse>
3053            
3054             =head2 C<type>: dummy
3055            
3056             This is a pseudo-tag, see L<Perl::Tags/register>.
3057            
3058             =head2 C<on_register>
3059            
3060             Recurse adding this new module to the queue.
3061            
3062             =cut
3063            
3064             package Perl::Tags::Tag::Recurse;
3065             our @ISA = qw/Perl::Tags::Tag/;
3066            
3067 1     1   950 use Module::Locate qw/locate/;
  1         3  
  1         6  
3068            
3069 0     0     sub type { 'dummy' }
3070            
3071             sub on_register {
3072 0     0     my ($self, $tags) = @_;
3073            
3074 0           my $name = $self->{name};
3075 0           my $path;
3076 0           eval {
3077 0           $path = locate( $name ); # or warn "Couldn't find path for $name";
3078             };
3079             # return if $@;
3080 0 0         return unless $path;
3081 0           $tags->queue( { file=>$path, level=>$tags->{current}{level}+1 , refresh=>0} );
3082 0           return; # don't get added
3083             }
3084            
3085             1;
3086             PERL_TAGS_TAG
3087              
3088 1         2 $fatpacked{"Test/Perl/Tags.pm"} = '#line '.(1+__LINE__).' "'.__FILE__."\"\n".<<'TEST_PERL_TAGS';
3089             package Test::Perl::Tags;
3090            
3091             use strict; use warnings;
3092             use parent 'Test::Builder::Module';
3093            
3094             use Path::Tiny 'path';
3095            
3096             our @EXPORT = qw(tag_ok);
3097            
3098             =head1 NAME
3099            
3100             Test::Perl::Tags - testing output of L<Perl::Tags>
3101            
3102             =head1 SYNOPSIS
3103            
3104             use Test::Perl::Tags;
3105            
3106             # do some tagging
3107            
3108             tag_ok $tagger,
3109             SYMBOL => 'path/to/file.pm' => 'searchable bookmark',
3110             'Description of this test';
3111            
3112             tag_ok $tagger,
3113             SYMBOL => 'path/to/file.pm' => 'searchable bookmark' => 'p' => 'line:3' => 'class:Test',
3114             'Add additional parameters for exuberant extension';
3115            
3116             =cut
3117            
3118             sub tag_ok {
3119             my ($tagger, $symbol, $path, $bookmark) = splice(@_, 0, 4);
3120             my $description = pop;
3121            
3122             my $canonpath = path($path)->absolute->canonpath;
3123            
3124             my $tag = join "\t",
3125             $symbol,
3126             $canonpath,
3127             "/$bookmark/";
3128            
3129             # exuberant extensions
3130             if (@_) {
3131             $tag .= join "\t",
3132             q<;">,
3133             @_;
3134             }
3135            
3136             my $ok = $tagger =~ /
3137             ^
3138             \Q$tag\E
3139             $
3140             /mx;
3141             my $builder = __PACKAGE__->builder;
3142            
3143             $builder->ok( $ok, $description )
3144             or $builder->diag( "Tags did not match:\n$tag" );
3145             }
3146            
3147             1;
3148             TEST_PERL_TAGS
3149              
3150 1         1849 s/^ //mg for values %fatpacked;
3151              
3152 1         5 my $class = 'FatPacked::'.(0+\%fatpacked);
3153 1     1   2798 no strict 'refs';
  1         2  
  1         339  
3154 1     0   6 *{"${class}::files"} = sub { keys %{$_[0]} };
  1         13  
  0         0  
  0         0  
3155              
3156 1 50       6 if ($] < 5.008) {
3157 0         0   *{"${class}::INC"} = sub {
3158 0 0       0      if (my $fat = $_[0]{$_[1]}) {
3159                    return sub {
3160 0 0       0          return 0 unless length $fat;
3161 0         0          $fat =~ s/^([^\n]*\n?)//;
3162 0         0          $_ = $1;
3163 0         0          return 1;
3164 0         0        };
3165                  }
3166 0         0      return;
3167 0         0   };
3168             }
3169              
3170             else {
3171 1         5   *{"${class}::INC"} = sub {
3172 16 100   16   2607     if (my $fat = $_[0]{$_[1]}) {
3173 6 50   1   78       open my $fh, '<', \$fat
  1         5  
  1         1  
  1         8  
3174                     or die "FatPacker error loading $_[1] (could be a perl installation issue?)";
3175 6         744       return $fh;
3176                 }
3177 10         10096     return;
3178 1         4   };
3179             }
3180              
3181 1         23 unshift @INC, bless \%fatpacked, $class;
3182               } # END OF FATPACK CODE
3183              
3184 1     1   29 use 5.006;
  1         4  
  1         36  
3185 1     1   6 use strict; use warnings;
  1     1   2  
  1         28  
  1         5  
  1         2  
  1         33  
3186              
3187 1     1   13 use Perl::Tags;
  1         4  
  1         29  
3188 1     1   12 use Perl::Tags::Hybrid;
  1         2  
  1         28  
3189 1     1   11 use Perl::Tags::Naive::Moose; # includes ::Naive
  1         3  
  1         39  
3190              
3191             ## fatpacked file doesn't contain PPI. Need to investigate
3192             ## this. In mean time, disabling, which will result in a lighter
3193             ## weight file for editor use in any case.
3194             # use Perl::Tags::PPI;
3195              
3196             # it is intended to be able to `require` this file, to be called
3197             # simply from an Editor, and to be fatpackable
3198              
3199             1;
3200