File Coverage

blib/lib/Log/Contextual/Router.pm
Criterion Covered Total %
statement 75 75 100.0
branch 24 30 80.0
condition 2 2 100.0
subroutine 17 17 100.0
pod 0 6 0.0
total 118 130 90.7


line stmt bran cond sub pod time code
1             package Log::Contextual::Router;
2 20     20   220907 use strict;
  20         39  
  20         888  
3 20     20   128 use warnings;
  20         81  
  20         1709  
4              
5             our $VERSION = '0.009001';
6              
7 20     20   145 use Scalar::Util 'blessed';
  20         48  
  20         2037  
8              
9 20     20   12191 use Moo;
  20         193340  
  20         136  
10              
11             with 'Log::Contextual::Role::Router',
12             'Log::Contextual::Role::Router::SetLogger',
13             'Log::Contextual::Role::Router::WithLogger',
14             'Log::Contextual::Role::Router::HasLogger';
15              
16             eval { ## no critic (ErrorHandling::RequireCheckingReturnValueOfEval)
17             require Log::Log4perl;
18             die if $Log::Log4perl::VERSION < 1.29;
19             Log::Log4perl->wrapper_register(__PACKAGE__)
20             };
21              
22             has _default_logger => (
23             is => 'ro',
24             default => sub { {} },
25             init_arg => undef,
26             );
27              
28             has _package_logger => (
29             is => 'ro',
30             default => sub { {} },
31             init_arg => undef,
32             );
33              
34             has _get_logger => (
35             is => 'ro',
36             default => sub { {} },
37             init_arg => undef,
38             );
39              
40       30 0   sub before_import { }
41              
42             sub after_import {
43 30     30 0 163 my ($self, %import_info) = @_;
44 30         118 my $exporter = $import_info{exporter};
45 30         76 my $target = $import_info{target};
46 30         127 my $config = $import_info{arguments};
47              
48 30 100       207 if (my $l = $exporter->arg_logger($config->{logger}, $target)) {
49 7         45 $self->set_logger($l);
50             }
51              
52 30 100       171 if (my $l = $exporter->arg_package_logger($config->{package_logger}, $target)) {
53 3         13 $self->_set_package_logger_for($target, $l);
54             }
55              
56 30 100       148 if (my $l = $exporter->arg_default_logger($config->{default_logger}, $target)) {
57 4         29 $self->_set_default_logger_for($target, $l);
58             }
59             }
60              
61             sub with_logger {
62 4     4 0 11 my $logger = $_[1];
63 4 100       20 if (ref $logger ne 'CODE') {
64 3 50       12 die 'logger was not a CodeRef or a logger object. Please try again.'
65             unless blessed($logger);
66 3         5 $logger = do {
67 3         7 my $l = $logger;
68 8     8   17 sub { $l }
69 3         34 };
70             }
71 4         67 local $_[0]->_get_logger->{l} = $logger;
72 4         15 $_[2]->();
73             }
74              
75             sub set_logger {
76 19     19 0 48 my $logger = $_[1];
77 19 100       118 if (ref $logger ne 'CODE') {
78 13 50       55 die 'logger was not a CodeRef or a logger object. Please try again.'
79             unless blessed($logger);
80 13         24 $logger = do {
81 13         125 my $l = $logger;
82 119     119   204 sub { $l }
83 13         67 };
84             }
85              
86             warn 'set_logger (or -logger) called more than once! This is a bad idea!'
87 19 100       180 if $_[0]->_get_logger->{l};
88 19         127 $_[0]->_get_logger->{l} = $logger;
89             }
90              
91 2     2 0 21 sub has_logger { !!$_[0]->_get_logger->{l} }
92              
93             sub _set_default_logger_for {
94 4     4   9 my $logger = $_[2];
95 4 50       15 if (ref $logger ne 'CODE') {
96 4 50       29 die 'logger was not a CodeRef or a logger object. Please try again.'
97             unless blessed($logger);
98 4         9 $logger = do {
99 4         8 my $l = $logger;
100 16     16   35 sub { $l }
101 4         16 };
102             }
103 4         11679 $_[0]->_default_logger->{$_[1]} = $logger
104             }
105              
106             sub _set_package_logger_for {
107 3     3   9 my $logger = $_[2];
108 3 50       10 if (ref $logger ne 'CODE') {
109 3 50       10 die 'logger was not a CodeRef or a logger object. Please try again.'
110             unless blessed($logger);
111 3         4 $logger = do {
112 3         6 my $l = $logger;
113 28     28   55 sub { $l }
114 3         37 };
115             }
116 3         39 $_[0]->_package_logger->{$_[1]} = $logger
117             }
118              
119             sub _get_loggers {
120 209     209   838 my ($self, %info) = @_;
121 209         417 my $package = $info{caller_package};
122 209         348 my $log_level = $info{message_level};
123             my $logger =
124             $_[0]->_package_logger->{$package}
125             || $_[0]->_get_logger->{l}
126 209   100     1656 || $_[0]->_default_logger->{$package}
127             || die
128             q( no logger set! you can't try to log something without a logger! );
129              
130 208         360 $info{caller_level}++;
131 208         547 $logger = $logger->($package, \%info);
132              
133 208 100       597 return $logger if $logger->${\"is_${log_level}"};
  208         1028  
134 45         261 return ();
135             }
136              
137             sub handle_log_request {
138 209     209 0 1335 my ($self, %message_info) = @_;
139 209         477 my $generator = $message_info{message_sub};
140 209         422 my $text = $message_info{message_text};
141 209         400 my $args = $message_info{message_args};
142 209         374 my $log_level = $message_info{message_level};
143              
144 209         333 $message_info{caller_level}++;
145              
146 209 100       748 my @loggers = $self->_get_loggers(%message_info)
147             or return;
148              
149 163 100       874 my @log = defined $text ? ($text) : ($generator->(@$args));
150 161         2290 $_->$log_level(@log) for @loggers;
151             }
152              
153             1;
154              
155             __END__