use accessors instead of silly direct attributes
[p5sagit/Log-Contextual.git] / lib / Log / Contextual / Router.pm
CommitLineData
8112b699 1package Log::Contextual::Router;
2
3use Moo;
4use Scalar::Util 'blessed';
5
1df0e2c4 6with 'Log::Contextual::Role::Router',
7 'Log::Contextual::Role::Router::SetLogger',
8 'Log::Contextual::Role::Router::WithLogger';
8112b699 9
8527bf52 10eval {
11 require Log::Log4perl;
12 die if $Log::Log4perl::VERSION < 1.29;
13 Log::Log4perl->wrapper_register(__PACKAGE__)
14};
15
1ed6e521 16has _default_logger => (
17 is => 'ro',
18 default => sub { {} },
19 init_arg => undef,
20);
21
22has _package_logger => (
23 is => 'ro',
24 default => sub { {} },
25 init_arg => undef,
26);
27
28has _get_logger => (
29 is => 'ro',
30 default => sub { {} },
31 init_arg => undef,
32);
33
8112b699 34sub before_import { }
35
36sub after_import {
a5454e75 37 my ($self, %import_info) = @_;
38 my $exporter = $import_info{exporter};
39 my $target = $import_info{target};
40 my $config = $import_info{arguments};
1ed6e521 41
a5454e75 42 if (my $l = $exporter->arg_logger($config->{logger})) {
43 $self->set_logger($l);
8112b699 44 }
45
a5454e75 46 if (my $l = $exporter->arg_package_logger($config->{package_logger})) {
47 $self->_set_package_logger_for($target, $l);
8112b699 48 }
49
a5454e75 50 if (my $l = $exporter->arg_default_logger($config->{default_logger})) {
51 $self->_set_default_logger_for($target, $l);
8112b699 52 }
53}
54
55sub with_logger {
56 my $logger = $_[1];
57 if(ref $logger ne 'CODE') {
58 die 'logger was not a CodeRef or a logger object. Please try again.'
59 unless blessed($logger);
60 $logger = do { my $l = $logger; sub { $l } }
61 }
1ed6e521 62 local $_[0]->_get_logger->{l} = $logger;
8112b699 63 $_[2]->();
64}
65
66sub set_logger {
67 my $logger = $_[1];
68 if(ref $logger ne 'CODE') {
69 die 'logger was not a CodeRef or a logger object. Please try again.'
70 unless blessed($logger);
71 $logger = do { my $l = $logger; sub { $l } }
72 }
73
74 warn 'set_logger (or -logger) called more than once! This is a bad idea!'
1ed6e521 75 if $_[0]->_get_logger->{l};
76 $_[0]->_get_logger->{l} = $logger;
8112b699 77}
78
79sub _set_default_logger_for {
80 my $logger = $_[2];
81 if(ref $logger ne 'CODE') {
82 die 'logger was not a CodeRef or a logger object. Please try again.'
83 unless blessed($logger);
84 $logger = do { my $l = $logger; sub { $l } }
85 }
1ed6e521 86 $_[0]->_default_logger->{$_[1]} = $logger
8112b699 87}
88
89sub _set_package_logger_for {
90 my $logger = $_[2];
91 if(ref $logger ne 'CODE') {
92 die 'logger was not a CodeRef or a logger object. Please try again.'
93 unless blessed($logger);
94 $logger = do { my $l = $logger; sub { $l } }
95 }
1ed6e521 96 $_[0]->_package_logger->{$_[1]} = $logger
8112b699 97}
98
99sub get_loggers {
a5454e75 100 my ($self, %info) = @_;
101 my $package = $info{caller_package};
102 my $log_level = $info{message_level};
8112b699 103 my $logger = (
1ed6e521 104 $_[0]->_package_logger->{$package} ||
105 $_[0]->_get_logger->{l} ||
106 $_[0]->_default_logger->{$package} ||
8112b699 107 die q( no logger set! you can't try to log something without a logger! )
108 );
109
8527bf52 110 $info{caller_level}++;
8527bf52 111 $logger = $logger->($package, \%info);
112
a5454e75 113 return $logger if $logger->${\"is_${log_level}"};
8527bf52 114 return ();
115}
116
117sub handle_log_request {
a5454e75 118 my ($self, %message_info) = @_;
119 my $generator = $message_info{message_sub};
120 my $args = $message_info{message_args};
121 my $log_level = $message_info{message_level};
8527bf52 122
a5454e75 123 $message_info{caller_level}++;
8527bf52 124
a5454e75 125 foreach my $logger ($self->get_loggers(%message_info)) {
126 $logger->$log_level($generator->(@$args));
8527bf52 127 }
8112b699 128}
129
8527bf52 1301;
8112b699 131