File Coverage

lib/Redis/CappedCollection/Util.pm
Criterion Covered Total %
statement 20 39 51.2
branch 0 14 0.0
condition 0 8 0.0
subroutine 7 9 77.7
pod 2 2 100.0
total 29 72 40.2


line stmt bran cond sub pod time code
1             package Redis::CappedCollection::Util;
2              
3             =head1 NAME
4              
5             Redis::CappedCollection::Util - String manipulation utilities.
6              
7             =head1 VERSION
8              
9             This documentation refers to C version 1.08
10              
11             =cut
12              
13             #-- Pragmas --------------------------------------------------------------------
14              
15 98     98   1539 use 5.010;
  98         229  
16 98     98   328 use strict;
  98         90  
  98         1598  
17 98     98   291 use warnings;
  98         102  
  98         3517  
18              
19             # ENVIRONMENT ------------------------------------------------------------------
20              
21             our $VERSION = '1.08';
22              
23 98         3296 use Exporter qw(
24             import
25 98     98   298 );
  98         113  
26              
27             our @EXPORT_OK = qw(
28             &format_message
29             &format_reference
30             );
31              
32             #-- load the modules -----------------------------------------------------------
33              
34 98     98   307 use overload;
  98         163  
  98         563  
35 98     98   4764 use Carp;
  98         123  
  98         4066  
36 98     98   352 use Data::Dumper ();
  98         98  
  98         25999  
37              
38             #-- declarations ---------------------------------------------------------------
39              
40             =head1 SYNOPSIS
41              
42             use 5.010;
43             use strict;
44             use warnings;
45              
46             use Redis::CappedCollection::Util qw( format_message );
47             $string = format_message( 'Object %d loaded. Status: %s', $id, $message );
48              
49             =head1 DESCRIPTION
50              
51             String manipulation utilities.
52              
53             =cut
54              
55             #-- public functions -----------------------------------------------------------
56              
57             =head1 EXPORTED FUNCTIONS
58              
59             Use these functions by importing them into your package or by calling a fully-qualified method name.
60              
61             =cut
62              
63             =head2 format_reference
64              
65             say format_reference( $object );
66              
67             Dumps reference using preconfigured L. Produces less verbose
68             output than default L settings.
69              
70             =cut
71              
72             my $dumper;
73             my $empty_array = [];
74              
75             sub format_reference {
76 0     0 1   my ( $value ) = @_;
77              
78 0 0         unless( $dumper ) {
79 0           $dumper = Data::Dumper->new( $empty_array )
80             ->Indent( 0 )
81             ->Terse( 1 )
82             ->Quotekeys( 0 )
83             ->Sortkeys( 1 )
84             ->Useperl( 1 ) # XS version seems to have a bug which sometimes results in modification of original object
85             ->Sparseseen( 1 ) # speed up since we don't use "Seen" hash
86             ;
87             }
88              
89 0           my $r;
90 0 0 0       if (
91             overload::Overloaded( $value ) &&
92             overload::Method( $value, '""' )
93             ) {
94 0           $r = "$value"; # force stringification
95             } else {
96 0           $r = $dumper->Values( [ $value ] )->Dump;
97 0           $dumper->Reset->Values( $empty_array );
98             }
99              
100 0           return $r;
101             }
102              
103             =head2 format_message
104              
105             $string = format_message( 'Object %d loaded. Status: %s', $id, $message );
106              
107             Returns string formatted using printf-style syntax.
108              
109             If there are more than one argument and the first argument contains C<%...>
110             conversions, arguments are converted to a string message using C. In this case, undefined
111             values are printed as C<< >> and references are converted to strings using L.
112              
113             =cut
114             sub format_message {
115 0   0 0 1   my $format = shift // return;
116              
117 0           my $got = scalar @_;
118              
119 0 0 0       return $format unless $got && $format =~ /\%/;
120              
121 0           my $expected = 0;
122 0           while ( $format =~ /(%%|%[^%])/g ) {
123 0 0         next if $1 eq '%%'; # don't count escape sequence
124 0           ++$expected;
125             }
126              
127 0 0         Carp::cluck "Wrong number of arguments: $expected vs $got" unless $got == $expected;
128              
129             return sprintf $format, map {
130 0 0         !defined $_
  0 0          
131             ? ''
132             : ref $_
133             ? format_reference( $_ )
134             : $_
135             } @_;
136             }
137              
138             #-- private functions ----------------------------------------------------------
139              
140             1;
141              
142             __END__