File Coverage

blib/lib/Perl6/Export.pm
Criterion Covered Total %
statement 14 14 100.0
branch 2 2 100.0
condition n/a
subroutine 4 4 100.0
pod 0 2 0.0
total 20 22 90.9


line stmt bran cond sub pod time code
1             package Perl6::Export;
2             our $VERSION = '0.009';
3              
4             my $ident = qr{ [^\W\d] \w* }x;
5             my $arg = qr{ : $ident \s* ,? \s* }x;
6             my $args = qr{ \s* \( $arg* \) | (?# NOTHING) }x;
7             my $defargs = qr{ \s* \( $arg* :DEFAULT $arg* \) }x;
8             my $proto = qr{ \s* (?: \( [^)]* \) | (?# NOTHING) ) }x;
9              
10             sub add_to {
11 3     3 0 19 my ($EXPORT, $symbol, $args, $decl) = @_;
12 3 100       23 $args = "()" unless $args =~ /\S/;
13 3         14 $args =~ tr/://d;
14 3         59 return q[BEGIN{no strict 'refs';]
15             . q[use vars qw(@EXPORT @EXPORT_OK %EXPORT %EXPORT_TAGS );]
16             . qq[push\@$EXPORT,'$symbol';\$EXPORT{'$symbol'}=1;]
17             . qq[push\@{\$EXPORT_TAGS\{\$_}},'$symbol' for ('ALL',qw$args)}$decl];
18             }
19              
20             sub false_import_sub {
21 1     1 0 4 my $import_sub = q{
22             use base 'Exporter';
23             use vars qw(@EXPORT @EXPORT_OK %EXPORT %EXPORT_TAGS );
24             sub import {
25             my @exports;
26             for (my $i=1; $i<@_; $i++) {
27             for ($_[$i]) {
28             if (!ref && /^[:\$&%\@]?(\w+)$/ &&
29             ( exists $EXPORT{$1} || exists $EXPORT_TAGS{$1}) ) {
30             push @exports, splice @_, $i, 1;
31             $i--;
32             }
33             }
34             }
35             @exports = ":DEFAULT" unless @exports;
36             __PACKAGE__->export_to_level(1, $_[0], ':MANDATORY', @exports);
37             goto &REAL_IMPORT;
38             }
39             };
40 1         16 $import_sub =~ s/\n/ /g;
41 1         11 $import_sub =~ s/REAL_IMPORT/$_[0]/g;
42 1         7 return $import_sub;
43             }
44              
45             my $MANDATORY = q[BEGIN{$EXPORT_TAGS{MANDATORY}||=[]}];
46              
47 1     1   36516 use Filter::Simple;
  1         79564  
  1         11  
48 1     1   87 use Digest::MD5 'md5_hex';
  1         4  
  1         680  
49              
50             FILTER {
51             return unless /\S/;
52             my $real_import_name = '_import_'.md5_hex($_);
53             my $false_import_sub = false_import_sub($real_import_name);
54             my $real_import_sub = "";
55             s/ \b sub \s+ import \s* ([({]) /sub $real_import_name$1/x
56             or s/ IMPORT \s* ([{]) /sub $real_import_name$1/x
57             or $real_import_sub = "sub $real_import_name {}";
58             s{( \b sub \s+ ($ident) $proto) \s+ is \s+ export ($defargs) }
59             { add_to('EXPORT',$2,$3,$1) }gex;
60             s{( \b our \s+ ([\$\@\%]$ident) $proto) \s+ is \s+ exported ($defargs) }
61             { add_to('EXPORT',$2,$3,$1) }gex;
62             s{( \b sub \s+ ($ident) $proto ) \s+ is \s+ export ($args) }
63             { add_to('EXPORT_OK',$2,$3,$1) }gex;
64             s{( \b our \s+ ([\$\@\%]$ident) ) \s+ is \s+ export ($args) }
65             { add_to('EXPORT_OK',$2,$3,$1) }gex;
66             $_ = $real_import_sub . $false_import_sub . $MANDATORY . $_;
67             }
68              
69             __END__