move handle_log_request logic into router
[p5sagit/Log-Contextual.git] / lib / Log / Contextual / Router.pm
CommitLineData
8112b699 1package Log::Contextual::Router;
2
3use Moo;
4use Scalar::Util 'blessed';
5
6with 'Log::Contextual::Role::Router';
7
8527bf52 8eval {
9 require Log::Log4perl;
10 die if $Log::Log4perl::VERSION < 1.29;
11 Log::Log4perl->wrapper_register(__PACKAGE__)
12};
13
8112b699 14sub before_import { }
15
16sub after_import {
17 my ($self, $controller, $importer, $spec) = @_;
18 my $config = $spec->config;
19
20 if (my $l = $controller->arg_logger($config->{logger})) {
21 $self->set_logger($l)
22 }
23
24 if (my $l = $controller->arg_package_logger($config->{package_logger})) {
25 $self->_set_package_logger_for($importer, $l)
26 }
27
28 if (my $l = $controller->arg_default_logger($config->{default_logger})) {
29 $self->_set_default_logger_for($importer, $l)
30 }
31}
32
33sub with_logger {
34 my $logger = $_[1];
35 if(ref $logger ne 'CODE') {
36 die 'logger was not a CodeRef or a logger object. Please try again.'
37 unless blessed($logger);
38 $logger = do { my $l = $logger; sub { $l } }
39 }
40 local $_[0]->{Get_Logger} = $logger;
41 $_[2]->();
42}
43
44sub set_logger {
45 my $logger = $_[1];
46 if(ref $logger ne 'CODE') {
47 die 'logger was not a CodeRef or a logger object. Please try again.'
48 unless blessed($logger);
49 $logger = do { my $l = $logger; sub { $l } }
50 }
51
52 warn 'set_logger (or -logger) called more than once! This is a bad idea!'
53 if $_[0]->{Get_Logger};
54 $_[0]->{Get_Logger} = $logger;
55
56}
57
58sub _set_default_logger_for {
59 my $logger = $_[2];
60 if(ref $logger ne 'CODE') {
61 die 'logger was not a CodeRef or a logger object. Please try again.'
62 unless blessed($logger);
63 $logger = do { my $l = $logger; sub { $l } }
64 }
65 $_[0]->{Default_Logger}->{$_[1]} = $logger
66}
67
68sub _set_package_logger_for {
69 my $logger = $_[2];
70 if(ref $logger ne 'CODE') {
71 die 'logger was not a CodeRef or a logger object. Please try again.'
72 unless blessed($logger);
73 $logger = do { my $l = $logger; sub { $l } }
74 }
75 $_[0]->{Package_Logger}->{$_[1]} = $logger
76}
77
78sub get_loggers {
8527bf52 79 my ($self, $info) = @_;
80
81 my $package = $info->{package};
82
8112b699 83 my $logger = (
84 $_[0]->{Package_Logger}->{$package} ||
85 $_[0]->{Get_Logger} ||
86 $_[0]->{Default_Logger}->{$package} ||
87 die q( no logger set! you can't try to log something without a logger! )
88 );
89
8527bf52 90 my %info = %$info;
8112b699 91
8527bf52 92 $info{caller_level}++;
93
94 $logger = $logger->($package, \%info);
95
96 return $logger if $logger->${\"is_${\$info->{level}}"};
97 return ();
98}
99
100sub handle_log_request {
101 my ($self, $info, $generator, @args) = @_;
102
103 my %info = %$info;
104
105 $info{caller_level}++;
106
107 foreach my $logger ($self->get_loggers(\%info)) {
108 $logger->${\$info->{level}}($generator->(@args));
109 }
8112b699 110}
111
8527bf52 1121;
8112b699 113