File Coverage

blib/lib/Mail/Reporter.pm
Criterion Covered Total %
statement 92 103 89.3
branch 34 42 80.9
condition 7 16 43.7
subroutine 20 22 90.9
pod 12 13 92.3
total 165 196 84.1


line stmt bran cond sub pod time code
1             # Copyrights 2001-2023 by [Mark Overmeer ].
2             # For other contributors see ChangeLog.
3             # See the manual pages for details on the licensing terms.
4             # Pod stripped from pm file by OODoc 2.03.
5             # This code is part of distribution Mail-Message. Meta-POD processed with
6             # OODoc into POD and HTML manual-pages. See README.md
7             # Copyright Mark Overmeer. Licensed under the same terms as Perl itself.
8              
9             package Mail::Reporter;
10 56     56   2089 use vars '$VERSION';
  56         125  
  56         2888  
11             $VERSION = '3.013';
12              
13              
14 56     56   458 use strict;
  56         143  
  56         1446  
15 56     56   339 use warnings;
  56         171  
  56         1988  
16              
17 56     56   478 use Carp;
  56         125  
  56         4311  
18 56     56   429 use Scalar::Util 'dualvar';
  56         189  
  56         39183  
19              
20              
21             my @levelname = (undef, qw(DEBUG NOTICE PROGRESS WARNING ERROR NONE INTERNAL));
22              
23             my %levelprio = (ERRORS => 5, WARNINGS => 4, NOTICES => 2);
24             for(my $l = 1; $l < @levelname; $l++)
25             { $levelprio{$levelname[$l]} = $l;
26             $levelprio{$l} = $l;
27             }
28              
29             sub new(@)
30 838     838 1 8294 { my $class = shift;
31             #confess "Parameter list has odd length: @_" if @_ % 2;
32 838         5190 (bless {MR_log => 1, MR_trace => 1}, $class)->init({@_});
33             }
34              
35             my($default_log, $default_trace, $trace_callback);
36             sub init($)
37 820     820 0 1419 { my ($self, $args) = @_;
38 820   66     6612 $self->{MR_log} = $levelprio{$args->{log} || $default_log};
39 820   66     2746 $self->{MR_trace} = $levelprio{$args->{trace} || $default_trace};
40 820         1732 $self;
41             }
42              
43             #------------------------------------------
44              
45              
46             sub _trace_warn($$$)
47 2     2   6 { my ($who, $level, $text) = @_;
48 2         21 warn "$level: $text\n";
49             }
50              
51             sub defaultTrace(;$$)
52 61     61 1 7312 { my $thing = shift;
53              
54 61 100       325 return ($default_log, $default_trace)
55             unless @_;
56              
57 60         131 my $level = shift;
58 60 50       167 my $prio = $thing->logPriority($level)
59             or croak "Unknown trace-level $level.";
60              
61 60 100       231 if( ! @_)
    100          
62 57         112 { $default_log = $default_trace = $prio;
63 57         107 $trace_callback = \&_trace_warn;
64             }
65             elsif(ref $_[0])
66 1         5 { $default_log = $thing->logPriority('NONE');
67 1         3 $default_trace = $prio;
68 1         2 $trace_callback = shift;
69             }
70             else
71 2         5 { $default_log = $prio;
72 2         8 $default_trace = $thing->logPriority(shift);
73 2         5 $trace_callback = \&_trace_warn;
74             }
75              
76 60         171 ($default_log, $default_trace);
77             }
78              
79             __PACKAGE__->defaultTrace('WARNINGS');
80              
81             #------------------------------------------
82              
83              
84             sub trace(;$$)
85 4     4 1 1909 { my $self = shift;
86              
87             return $self->logPriority($self->{MR_trace})
88 4 100       18 unless @_;
89              
90 1         3 my $level = shift;
91 1 50       5 my $prio = $levelprio{$level}
92             or croak "Unknown trace-level $level.";
93              
94 1         6 $self->{MR_trace} = $prio;
95             }
96              
97             #------------------------------------------
98              
99              
100             # Implementation detail: the Mail::Box::Parser::C code avoids calls back
101             # to Perl by checking the trace-level itself. In the perl code of this
102             # module however, just always call the log() method, and let it check
103             # whether or not to display it.
104              
105             sub log(;$@)
106 57     57 1 6352 { my $thing = shift;
107              
108 57 100       179 if(ref $thing) # instance call
109             { return $thing->logPriority($thing->{MR_log})
110 55 100       156 unless @_;
111              
112 52         86 my $level = shift;
113 52 50       148 my $prio = $levelprio{$level}
114             or croak "Unknown log-level $level";
115              
116 52 50       127 return $thing->{MR_log} = $prio
117             unless @_;
118              
119 52         125 my $text = join '', @_;
120             $trace_callback->($thing, $level, $text)
121 52 100       149 if $prio >= $thing->{MR_trace};
122 56     56   964 use Carp;
  56         135  
  56         47817  
123 52 50       131 $thing->{MR_trace} or confess;
124              
125 6         19 push @{$thing->{MR_report}[$prio]}, $text
126 52 100       138 if $prio >= $thing->{MR_log};
127             }
128             else # class method
129 2         6 { my $level = shift;
130 2 50       7 my $prio = $levelprio{$level}
131             or croak "Unknown log-level $level";
132              
133 2 100       11 $trace_callback->($thing, $level, join('',@_))
134             if $prio >= $default_trace;
135             }
136              
137 54         117 $thing;
138             }
139              
140              
141             #------------------------------------------
142              
143              
144             sub report(;$)
145 11     11 1 940 { my $self = shift;
146 11   50     31 my $reports = $self->{MR_report} || return ();
147              
148 11 100       29 if(@_)
149 7         10 { my $level = shift;
150 7 50       18 my $prio = $levelprio{$level}
151             or croak "Unknown report level $level.";
152              
153 7 50       18 return $reports->[$prio] ? @{$reports->[$prio]} : ();
  7         46  
154             }
155              
156 4         6 my @reports;
157 4         13 for(my $prio = 1; $prio < @$reports; $prio++)
158 20 100       44 { next unless $reports->[$prio];
159 9         15 my $level = $levelname[$prio];
160 9         12 push @reports, map { [ $level, $_ ] } @{$reports->[$prio]};
  12         38  
  9         19  
161             }
162              
163 4         13 @reports;
164             }
165              
166             #-------------------------------------------
167              
168              
169             sub addReport($)
170 13     13 1 35 { my ($self, $other) = @_;
171 13   100     53 my $reports = $other->{MR_report} || return ();
172              
173 1         6 for(my $prio = 1; $prio < @$reports; $prio++)
174 5 100       24 { push @{$self->{MR_report}[$prio]}, @{$reports->[$prio]}
  3         6  
  3         9  
175             if exists $reports->[$prio];
176             }
177 1         2 $self;
178             }
179            
180             #-------------------------------------------
181              
182              
183             sub reportAll(;$)
184 2     2 1 2071 { my $self = shift;
185 2         7 map { [ $self, @$_ ] } $self->report(@_);
  8         21  
186             }
187              
188             #-------------------------------------------
189              
190              
191 1     1 1 3060 sub errors(@) {shift->report('ERRORS')}
192              
193             #-------------------------------------------
194              
195              
196 1     1 1 6 sub warnings(@) {shift->report('WARNINGS')}
197              
198             #-------------------------------------------
199              
200              
201             sub notImplemented(@)
202 0     0 1 0 { my $self = shift;
203 0   0     0 my $package = ref $self || $self;
204 0         0 my $sub = (caller 1)[3];
205              
206 0         0 $self->log(ERROR => "Package $package does not implement $sub.");
207 0         0 confess "Please warn the author, this shouldn't happen.";
208             }
209              
210             #------------------------------------------
211              
212              
213             sub logPriority($)
214 74 100   74 1 4148 { my $level = $levelprio{$_[1]} or return undef;
215 72         523 dualvar $level, $levelname[$level];
216             }
217              
218             #-------------------------------------------
219              
220              
221             sub logSettings()
222 172     172 1 296 { my $self = shift;
223 172         928 (log => $self->{MR_log}, trace => $self->{MR_trace});
224             }
225              
226             #-------------------------------------------
227              
228              
229             sub AUTOLOAD(@)
230 0     0   0 { my $thing = shift;
231 0         0 our $AUTOLOAD;
232 0   0     0 my $class = ref $thing || $thing;
233 0         0 (my $method = $AUTOLOAD) =~ s/^.*\:\://;
234              
235 0         0 $Carp::MaxArgLen=20;
236 0         0 confess "Method $method() is not defined for a $class.\n";
237             }
238              
239             #-------------------------------------------
240              
241              
242             #-------------------------------------------
243              
244              
245 3617     3617   79472 sub DESTROY {shift}
246              
247             1;