File Coverage

lib/Data/Dumper/Simple.pm
Criterion Covered Total %
statement 35 39 89.7
branch 8 10 80.0
condition 2 3 66.6
subroutine 7 8 87.5
pod n/a
total 52 60 86.6


line stmt bran cond sub pod time code
1             package Data::Dumper::Simple;
2              
3             $REVISION = '$Id: Simple.pm,v 1.10 2005/05/20 01:37:08 ovid Exp $';
4             $VERSION = '0.11';
5 4     4   240409 use Filter::Simple;
  4         398828  
  4         34  
6 4     4   13951 use Data::Dumper ();
  4         123704  
  4         183  
7 4     4   45 use strict;
  4         14  
  4         6144  
8              
9             my $DUMPER_FUNCTION = 'Dumper';
10             my $AUTOWARN;
11              
12             my $COMMA = qr/(?:,|=>)/;
13             my $ATOM = qr/(?!\d)[[:word:]]+/;
14             my $SEP = qr/::/;
15             my $NAME = qr/$SEP?$ATOM(?:$SEP$ATOM)*/;
16              
17             my $SCALAR = qr/\$$NAME/;
18             my $ARRAY_ELEM = qr/\$$NAME\[[^]]+\]/;
19             my $ARRAY = qr/\@$NAME/;
20             my $HASH_ELEM = qr/\$$NAME\{[^}]+\}/;
21             my $HASH = qr/\%$NAME/;
22              
23             my $VAR = qr/(?:$ARRAY|$HASH|$ARRAY_ELEM|$HASH_ELEM|$SCALAR)/;
24             my $END_STMT = qr/(?=\s*[;}])/;
25              
26             my $ARG_LIST = qr/$VAR(?:\s*$COMMA\s*$VAR)*$END_STMT/;
27             my $PAREN_LIST = qr/\([^)]+\)/;
28              
29             sub import {
30             my ( $class, @args ) = @_;
31             @args = $class->_validate_args(@args);
32             my %args = @args;
33             $DUMPER_FUNCTION = $args{as} if $args{as};
34             $AUTOWARN = $args{autowarn} if $args{autowarn};
35             }
36              
37             FILTER_ONLY executable =>
38             sub { # not using code due to a possible bug in Filter::Simple
39             s{
40             $DUMPER_FUNCTION\s*($PAREN_LIST|$ARG_LIST)
41             }{
42             my $args = $1;
43             $args =~ s/^\((.*)\)$/$1/s; # strip parens, if any
44             my ($references, $names) = _munge_argument_list($args);
45             # keep it on a single line so users can comment it out
46             my $output = "Data::Dumper->Dump( [$references], [qw/$names/] )";
47             if ($AUTOWARN) {
48             $output = "$AUTOWARN($output)";
49             }
50             "($output)"; # parens prevent accidental indirect method syntax
51             }gex
52             };
53              
54             sub _validate_args {
55 5     5   14 my ( $class, @args ) = @_;
56 5 50       34 if ( @args % 2 ) {
57 0         0 _croak("$class->import requires an even sized list");
58             }
59 5         19 my %args = @args;
60 5 50 66     195 if ( $args{as} && !_valid_sub_name( $args{as} ) ) {
61 0         0 _croak("$args{as} is not a valid name for a subroutine");
62             }
63 5 100       20 if ( $args{autowarn} ) {
64 2 100       161 $args{autowarn} = 'warn' unless _valid_sub_name( $args{autowarn} );
65             }
66 5         31 return %args;
67             }
68              
69 3     3   37 sub _valid_sub_name { shift =~ /^[[:alpha:]][[:word:]]*$/ }
70              
71             sub _croak {
72 0     0   0 require Carp;
73 0         0 Carp::croak(shift);
74             }
75              
76             sub _munge_argument_list {
77 31     31   48 my $arguments = shift;
78 31         43 my $sigils = '@%&';
79 60         105 my @raw_var_names =
80 31         172 map { _strip_whitespace($_) }
81             split /(?:,|=>)/ => $arguments;
82 31         67 my @raw_escaped = @raw_var_names;
83 60         340 my $varnames = join ' ' => map {
84 31 100       46 s/(\\)?[$sigils]/$1 ? '$' : '*'/ge;
  30         129  
85 60         98 s/\\//g;
86 60         149 $_
87             } # turn @array into => [$*]array
88             @raw_var_names;
89              
90 60         251 my $escaped_vars =
91 60         107 join ', ' => map { s/\\\$/\$/g; $_ } # do not take a reference to a scalar
  60         371  
92 31         2600 map { s/(?
  60         271  
93             @raw_escaped;
94 31         113 return ( $escaped_vars, $varnames );
95             }
96              
97             sub _strip_whitespace {
98 60     60   195 $_[0] =~ s/\s//g;
99 60         311 return $_[0];
100             }
101              
102             1;
103              
104             __END__