File Coverage

blib/lib/Papery/Util.pm
Criterion Covered Total %
statement 38 38 100.0
branch 10 10 100.0
condition n/a
subroutine 4 4 100.0
pod 1 1 100.0
total 53 53 100.0


line stmt bran cond sub pod time code
1             package Papery::Util;
2              
3 3     3   39371 use strict;
  3         7  
  3         129  
4 3     3   15 use warnings;
  3         7  
  3         334  
5              
6 3     3   25 use Exporter;
  3         5  
  3         1595  
7             our @ISA = qw( Exporter );
8             our @EXPORT_OK = qw( merge_meta );
9              
10             sub merge_meta {
11 18     18 1 9817 my ( $meta, $extra ) = @_;
12              
13             # __ keys are ignored
14 18         42 my @__keys = grep {/^__/} keys %$extra;
  17         52  
15 18         30 my @__values = delete @{$extra}{@__keys};
  18         33  
16              
17             # keys postfixed with + or - are updates
18 18         36 my @keys = grep {/[-+]$/} keys %$extra;
  16         63  
19 18         26 my @values = delete @{$extra}{@keys};
  18         37  
20              
21             # others are replacement
22             # FIXME: deep keys with postfix
23 18         33 @{$meta}{ keys %$extra } = values %$extra;
  18         27  
24              
25             # restore $extra
26 18         28 @{$extra}{@__keys} = @__values;
  18         23  
27 18         26 @{$extra}{@keys} = @values;
  18         30  
28              
29             # process the updates
30 18         57 while ( my $key = shift @keys ) {
31 13         27 my $where = chop $key;
32 13         16 my $value = shift @values;
33              
34 13 100       37 if ( ref $value eq 'ARRAY' ) {
    100          
35 4 100       10 if ( $where eq '+' ) { push @{ $meta->{$key} }, @$value; }
  2         3  
  2         10  
36 2         4 else { unshift @{ $meta->{$key} }, @$value; }
  2         11  
37             }
38             elsif ( ref $value eq 'HASH' ) {
39 4         17 merge_meta( $meta->{$key}, $value ); # recursive update!
40             }
41             else { # assume string
42 5 100       11 if ( $where eq '+' ) { $meta->{$key} .= $value; }
  3         14  
43             else {
44 2 100       16 $meta->{$key}
45             = $value . ( defined $meta->{$key} ? $meta->{$key} : '' );
46             }
47             }
48             }
49              
50 18         84 return $meta;
51             }
52              
53             1;
54              
55             __END__