File Coverage

blib/lib/String/RewritePrefix.pm
Criterion Covered Total %
statement 35 35 100.0
branch 9 12 75.0
condition 2 5 40.0
subroutine 7 7 100.0
pod 1 1 100.0
total 54 60 90.0


line stmt bran cond sub pod time code
1 1     1   23351 use strict;
  1         4  
  1         44  
2 1     1   6 use warnings;
  1         3  
  1         54  
3             package String::RewritePrefix;
4             {
5             $String::RewritePrefix::VERSION = '0.007';
6             }
7 1     1   5 use Carp ();
  1         2  
  1         32  
8             # ABSTRACT: rewrite strings based on a set of known prefixes
9              
10             # 0.972 allows \'method_name' form -- rjbs, 2010-10-25
11 1         8 use Sub::Exporter 0.972 -setup => {
12             exports => [ rewrite => \'_new_rewriter' ],
13 1     1   1274 };
  1         14508  
14              
15              
16             sub rewrite {
17 1     1 1 949 my ($self, $arg, @rest) = @_;
18 1         5 return $self->_new_rewriter(rewrite => { prefixes => $arg })->(@rest);
19             }
20              
21             sub _new_rewriter {
22 3     3   838 my ($self, $name, $arg) = @_;
23 3   50     10 my $rewrites = $arg->{prefixes} || {};
24              
25 3         4 my @rewrites;
26 3         12 for my $prefix (sort { length $b <=> length $a } keys %$rewrites) {
  8         15  
27 9         18 push @rewrites, ($prefix, $rewrites->{$prefix});
28             }
29              
30             return sub {
31 3     3   107 my @result;
32              
33 3 50       8 Carp::cluck("string rewriter invoked in void context")
34             unless defined wantarray;
35              
36 3 50 33     18 Carp::croak("attempt to rewrite multiple strings outside of list context")
37             if @_ > 1 and ! wantarray;
38              
39 3         4 STRING: for my $str (@_) {
40 14         30 for (my $i = 0; $i < @rewrites; $i += 2) {
41 31 100       77 if (index($str, $rewrites[$i]) == 0) {
42 13 100       22 if (ref $rewrites[$i+1]) {
43 2         4 my $rest = substr $str, length($rewrites[$i]);
44 2         5 my $str = $rewrites[ $i+1 ]->($rest);
45 2 100       10 push @result, (defined $str ? $str : '') . $rest;
46             } else {
47 11         26 push @result, $rewrites[$i+1] . substr $str, length($rewrites[$i]);
48             }
49 13         22 next STRING;
50             }
51             }
52              
53 1         1 push @result, $str;
54             }
55            
56 3 50       19 return wantarray ? @result : $result[0];
57 3         26 };
58             }
59              
60             1;
61              
62             __END__