File Coverage

blib/lib/Podlite.pm
Criterion Covered Total %
statement 21 21 100.0
branch n/a
condition n/a
subroutine 7 7 100.0
pod n/a
total 28 28 100.0


line stmt bran cond sub pod time code
1             package Podlite;
2              
3             our $VERSION = '1.00';
4 7     7   644876 use warnings;
  7         12  
  7         11038  
5 7     7   40 use strict;
  7         21  
  7         257  
6 7     7   36 use re 'eval';
  7         15  
  7         435  
7              
8 7     7   4191 use Filter::Simple;
  7         143815  
  7         73  
9              
10             my $IDENT = qr{ (?> [^\W\d] \w* ) }xms;
11             my $QUAL_IDENT = qr{ $IDENT (?: :: $IDENT)* }xms;
12             my $TO_EOL = qr{ (?> [^\n]* ) (?:\Z|\n) }xms;
13             my $HWS = qr{ (?> [^\S\n]+ ) }xms;
14             my $OHWS = qr{ (?> [^\S\n]* ) }xms;
15             my $BLANK_LINE = qr{ ^ $OHWS $ | (?= ^ = | \s* \z) }xms;
16             my $DIRECTIVE = qr{ config }xms;
17             my $OPT_EXTRA_CONFIG = qr{ (?> (?: ^ = $HWS $TO_EOL)* ) }xms;
18              
19              
20             # Recursive matcher for =DATA sections...
21              
22             my $DATA_PAT = qr{
23             ^ =
24             (?:
25             begin $HWS data $TO_EOL
26             $OPT_EXTRA_CONFIG
27             (.*?)
28             ^ =end $HWS data
29             |
30             for $HWS data $TO_EOL
31             $OPT_EXTRA_CONFIG
32             (.*?)
33             $BLANK_LINE
34             |
35             data \s
36             (.*?)
37             $BLANK_LINE
38             )
39             }xms;
40              
41              
42             # Recursive matcher for all other Podlite sections...
43              
44 7     7   3541 use vars '$type';
  7         19  
  7         2804  
45             my $PODLITE_PAT; $PODLITE_PAT = qr{
46             ^ =
47             (?:
48             begin $HWS ($IDENT) (?{ local $type = $^N}) $TO_EOL
49             $OPT_EXTRA_CONFIG
50             (?: ^ (??{$PODLITE_PAT}) | . )*?
51             ^ =end $HWS (??{$type}) $TO_EOL
52             |
53             for $HWS $TO_EOL
54             $OPT_EXTRA_CONFIG
55             .*?
56             $BLANK_LINE
57             |
58             $DIRECTIVE $HWS $TO_EOL
59             $OPT_EXTRA_CONFIG
60             |
61             (?! end) $IDENT $TO_EOL
62             .*?
63             $BLANK_LINE
64             )
65             }xms;
66              
67             FILTER {
68             my @DATA;
69              
70             # Extract DATA sections, deleting them but preserving line numbering...
71             s{ ($DATA_PAT) }{
72             my ($data_block, $contents) = ($1,$+);
73              
74             # Special newline handling required under Windows...
75             if ($^O =~ /MSWin/) {
76             $contents =~ s{ \r\n }{\n}gxms;
77             }
78              
79             # Save the data...
80             push @DATA, $contents;
81              
82             # Delete it from the source code, but leave the newlines...
83             $data_block =~ tr[\n\0-\377][\n]d;
84              
85             $data_block;
86             }gxmse;
87              
88             # Collect all declared package names...
89             my %packages = (main=>1);
90             s{ (\s* package \s+ ($QUAL_IDENT)) }{
91             my ($package_decl, $package_name) = ($1,$2);
92             $packages{$package_name} = 1;
93             $package_decl;
94             }gxmse;
95              
96             # Delete all other Podlite sections, preserving newlines...
97 7     7   53 { no warnings;
  7         10  
  7         1643  
98             s{ ($PODLITE_PAT) }{ my $text = $1; $text =~ tr[\n\0-\377][\n]d; $text; }gxmse;
99             }
100              
101             # Consolidate data and open a filehandle to it...
102             local *DATA_glob;
103             my $DATA_as_str = join q{}, @DATA;
104             *DATA_glob = \$DATA_as_str;
105             *DATA_glob = \@DATA;
106             open *DATA_glob, '<', \$DATA_as_str
107             or require Carp
108             and croak( "Can't set up *DATA handle ($!)" );
109              
110             # Alias each package's *DATA, @DATA, and $DATA...
111             for my $package (keys %packages) {
112 7     7   50 no strict 'refs';
  7         15  
  7         856  
113             *{$package.'::DATA'} = *DATA_glob;
114             }
115             }
116              
117             __END__