File Coverage

blib/lib/Log/Contextual/Router.pm
Criterion Covered Total %
statement 69 69 100.0
branch 24 30 80.0
condition 2 2 100.0
subroutine 15 15 100.0
pod 0 7 0.0
total 110 123 89.4


line stmt bran cond sub pod time code
1             package Log::Contextual::Router;
2             $Log::Contextual::Router::VERSION = '0.008000';
3             # ABSTRACT: Route messages to loggers
4              
5 20     20   9618 use Moo;
  20         265738  
  20         194  
6 20     20   34164 use Scalar::Util 'blessed';
  20         72  
  20         26005  
7              
8             with 'Log::Contextual::Role::Router',
9             'Log::Contextual::Role::Router::SetLogger',
10             'Log::Contextual::Role::Router::WithLogger',
11             'Log::Contextual::Role::Router::HasLogger';
12              
13             eval {
14             require Log::Log4perl;
15             die if $Log::Log4perl::VERSION < 1.29;
16             Log::Log4perl->wrapper_register(__PACKAGE__)
17             };
18              
19             has _default_logger => (
20             is => 'ro',
21             default => sub { {} },
22             init_arg => undef,
23             );
24              
25             has _package_logger => (
26             is => 'ro',
27             default => sub { {} },
28             init_arg => undef,
29             );
30              
31             has _get_logger => (
32             is => 'ro',
33             default => sub { {} },
34             init_arg => undef,
35             );
36              
37       31 0   sub before_import { }
38              
39             sub after_import {
40 31     31 0 211 my ($self, %import_info) = @_;
41 31         112 my $exporter = $import_info{exporter};
42 31         104 my $target = $import_info{target};
43 31         95 my $config = $import_info{arguments};
44              
45 31 100       243 if (my $l = $exporter->arg_logger($config->{logger})) {
46 7         65 $self->set_logger($l);
47             }
48              
49 31 100       253 if (my $l = $exporter->arg_package_logger($config->{package_logger})) {
50 3         18 $self->_set_package_logger_for($target, $l);
51             }
52              
53 31 100       212 if (my $l = $exporter->arg_default_logger($config->{default_logger})) {
54 4         22 $self->_set_default_logger_for($target, $l);
55             }
56             }
57              
58             sub with_logger {
59 4     4 0 11 my $logger = $_[1];
60 4 100       22 if (ref $logger ne 'CODE') {
61 3 50       21 die 'logger was not a CodeRef or a logger object. Please try again.'
62             unless blessed($logger);
63 3         9 $logger = do {
64 3         6 my $l = $logger;
65 8     8   17 sub { $l }
66 3         19 }
67             }
68 4         23 local $_[0]->_get_logger->{l} = $logger;
69 4         16 $_[2]->();
70             }
71              
72             sub set_logger {
73 19     19 0 68 my $logger = $_[1];
74 19 100       150 if (ref $logger ne 'CODE') {
75 13 50       137 die 'logger was not a CodeRef or a logger object. Please try again.'
76             unless blessed($logger);
77 13         58 $logger = do {
78 13         44 my $l = $logger;
79 119     119   276 sub { $l }
80 13         93 }
81             }
82              
83             warn 'set_logger (or -logger) called more than once! This is a bad idea!'
84 19 100       282 if $_[0]->_get_logger->{l};
85 19         244 $_[0]->_get_logger->{l} = $logger;
86             }
87              
88 2     2 0 52 sub has_logger { !!$_[0]->_get_logger->{l} }
89              
90             sub _set_default_logger_for {
91 4     4   13 my $logger = $_[2];
92 4 50       20 if (ref $logger ne 'CODE') {
93 4 50       31 die 'logger was not a CodeRef or a logger object. Please try again.'
94             unless blessed($logger);
95 4         12 $logger = do {
96 4         11 my $l = $logger;
97 16     16   41 sub { $l }
98 4         25 }
99             }
100 4         2807 $_[0]->_default_logger->{$_[1]} = $logger
101             }
102              
103             sub _set_package_logger_for {
104 3     3   9 my $logger = $_[2];
105 3 50       18 if (ref $logger ne 'CODE') {
106 3 50       29 die 'logger was not a CodeRef or a logger object. Please try again.'
107             unless blessed($logger);
108 3         15 $logger = do {
109 3         10 my $l = $logger;
110 28     28   66 sub { $l }
111 3         21 }
112             }
113 3         26 $_[0]->_package_logger->{$_[1]} = $logger
114             }
115              
116             sub get_loggers {
117 209     209 0 839 my ($self, %info) = @_;
118 209         486 my $package = $info{caller_package};
119 209         449 my $log_level = $info{message_level};
120             my $logger =
121             ( $_[0]->_package_logger->{$package}
122             || $_[0]->_get_logger->{l}
123 209   100     1794 || $_[0]->_default_logger->{$package}
124             || die
125             q( no logger set! you can't try to log something without a logger! ));
126              
127 208         606 $info{caller_level}++;
128 208         616 $logger = $logger->($package, \%info);
129              
130 208 100       690 return $logger if $logger ->${\"is_${log_level}"};
  208         1239  
131 45         322 return ();
132             }
133              
134             sub handle_log_request {
135 209     209 0 1124 my ($self, %message_info) = @_;
136 209         561 my $generator = $message_info{message_sub};
137 209         517 my $text = $message_info{message_text};
138 209         434 my $args = $message_info{message_args};
139 209         476 my $log_level = $message_info{message_level};
140              
141 209         431 $message_info{caller_level}++;
142              
143 209 100       1311 my @loggers = $self->get_loggers(%message_info)
144             or return;
145              
146 163 100       1038 my @log = defined $text ? ($text) : ($generator->(@$args));
147 161         3254 $_->$log_level(@log) for @loggers;
148             }
149              
150             1;
151              
152             __END__