File Coverage

blib/lib/Log/Contextual/WarnLogger.pm
Criterion Covered Total %
statement 62 62 100.0
branch 23 26 88.4
condition 10 11 90.9
subroutine 13 13 100.0
pod 1 1 100.0
total 109 113 96.4


line stmt bran cond sub pod time code
1             package Log::Contextual::WarnLogger;
2             $Log::Contextual::WarnLogger::VERSION = '0.008001';
3             # ABSTRACT: logger for libraries using Log::Contextual
4              
5 3     3   775 use strict;
  3         14  
  3         69  
6 3     3   12 use warnings;
  3         4  
  3         62  
7              
8 3     3   11 use Carp 'croak';
  3         5  
  3         234  
9              
10             my @default_levels = qw( trace debug info warn error fatal );
11              
12             # generate subs to handle the default levels
13             # anything else will have to be handled by AUTOLOAD at runtime
14             {
15             for my $level (@default_levels) {
16              
17 3     3   17 no strict 'refs';
  3         5  
  3         719  
18              
19             my $is_name = "is_$level";
20             *{$level} = sub {
21 15     15   22 my $self = shift;
        8      
22              
23 15 50       41 $self->_log($level, @_)
24             if $self->$is_name;
25             };
26              
27             *{$is_name} = sub {
28 82     82   767 my $self = shift;
29 82 100       253 return 1 if $ENV{$self->{env_prefix} . '_' . uc $level};
30 66         109 my $upto = $ENV{$self->{env_prefix} . '_UPTO'};
31 66 100       137 return unless $upto;
32 32         48 $upto = lc $upto;
33              
34 32         111 return $self->{level_num}{$level} >= $self->{level_num}{$upto};
35             };
36             }
37             }
38              
39             our $AUTOLOAD;
40              
41             sub AUTOLOAD {
42 9     9   3810 my $self = $_[0];
43              
44 9         48 (my $name = our $AUTOLOAD) =~ s/.*:://;
45 9 100       274 return if $name eq 'DESTROY';
46              
47             # extract the log level from the sub name
48 4         19 my ($is, $level) = $name =~ m/^(is_)?(.+)$/;
49 4         8 my $is_name = "is_$level";
50              
51 3     3   18 no strict 'refs';
  3         4  
  3         1258  
52 4         19 *{$level} = sub {
53 3     3   1272 my $self = shift;
54              
55 3 50       7 $self->_log($level, @_)
56             if $self->$is_name;
57 4         11 };
58              
59 4         7 *{$is_name} = sub {
60 20     20   1352 my $self = shift;
61              
62 20         54 my $prefix_field = $self->{env_prefix} . '_' . uc $level;
63 20 100       60 return 1 if $ENV{$prefix_field};
64              
65             # don't log if the variable specifically says not to
66 18 100 66     46 return 0 if defined $ENV{$prefix_field} and not $ENV{$prefix_field};
67              
68 16         24 my $upto_field = $self->{env_prefix} . '_UPTO';
69 16         20 my $upto = $ENV{$upto_field};
70              
71 16 100       27 if ($upto) {
72 6         10 $upto = lc $upto;
73              
74             croak "Unrecognized log level '$upto' in \$ENV{$upto_field}"
75 6 100       169 if not defined $self->{level_num}{$upto};
76              
77 4         16 return $self->{level_num}{$level} >= $self->{level_num}{$upto};
78             }
79              
80             # if we don't recognize this level and nothing says otherwise, log!
81 10 100       32 return 1 if not $self->{custom_levels};
82 4         12 };
83 4         16 goto &$AUTOLOAD;
84             }
85              
86             sub new {
87 11     11 1 2404 my ($class, $args) = @_;
88              
89 11         22 my $levels = $args->{levels};
90 11 100 100     251 croak 'invalid levels specification: must be non-empty arrayref'
      100        
91             if defined $levels and (ref $levels ne 'ARRAY' or !@$levels);
92              
93 9         16 my $custom_levels = defined $levels;
94 9   100     45 $levels ||= [@default_levels];
95              
96 9         26 my %level_num;
97 9         28 @level_num{@$levels} = (0 .. $#{$levels});
  9         35  
98              
99 9         33 my $self = bless {
100             levels => $levels,
101             level_num => \%level_num,
102             custom_levels => $custom_levels,
103             }, $class;
104              
105             $self->{env_prefix} = $args->{env_prefix}
106 9 50       61 or die 'no env_prefix passed to Log::Contextual::WarnLogger->new';
107 9         40 return $self;
108             }
109              
110             sub _log {
111 15     15   20 my $self = shift;
112 15         18 my $level = shift;
113 15         27 my $message = join("\n", @_);
114 15 100       45 $message .= "\n" unless $message =~ /\n$/;
115 15         85 warn "[$level] $message";
116             }
117              
118             1;
119              
120             __END__