09235ace3276cbeca9a17b4bdde81b2ea8a02958
[p5sagit/Log-Contextual.git] / lib / Log / Contextual / Router.pm
1 package Log::Contextual::Router;
2
3 use Moo;
4 use Scalar::Util 'blessed';
5
6 with 'Log::Contextual::Role::Router';
7
8 eval {
9    require Log::Log4perl;
10    die if $Log::Log4perl::VERSION < 1.29;
11    Log::Log4perl->wrapper_register(__PACKAGE__)
12 };
13
14 sub before_import { }
15
16 sub 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
33 sub 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
44 sub 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
58 sub _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
68 sub _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
78 sub get_loggers {
79    my ($self, $info) = @_;
80
81    my $package = $info->{package};
82
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
90    my %info = %$info;
91
92    $info{caller_level}++;
93
94    $logger = $logger->($package, \%info);
95
96    return $logger if $logger->${\"is_${\$info->{level}}"};
97    return ();
98 }
99
100 sub 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    }
110 }
111
112 1;
113