572979d5e19642fbe466e6c6bcbb2f60ea065365
[scpubgit/Object-Remote.git] / lib / Object / Remote / Logging / LogAnyInjector.pm
1 package Object::Remote::Logging::LogAnyInjector;
2
3 #Experimental object that can be used to receive Log::Any
4 #generated log messages and inject them into the log router
5
6 use Moo;
7 use Object::Remote::Logging qw( router );
8 use Carp qw(croak);
9
10 BEGIN {
11   our %LEVEL_NAME_MAP = (
12     #key is Log::Any log level name or alias and value is Object::Remote::Logging
13     #log level name
14     trace => 'trace', debug => 'debug', info => 'info', notice => 'verbose',
15     warning => 'warn', error => 'error', fatal => 'fatal',
16     critical => 'error', alert => 'error', 'emergency' => 'error',
17     inform => 'info', warn => 'warn', err => 'error', crit => 'error',
18   );
19 }
20
21 sub AUTOLOAD {
22   my ($self, @content) = @_;
23   (my $log_level) = (our $AUTOLOAD =~ /([^:]+)$/);
24   my $generator;
25   my $log_contextual_level;
26   our %LEVEL_NAME_MAP;
27   
28   #just a proof of concept - support for the is_ methods can
29   #be done but requires modifications to the router
30   return 1 if $log_level =~ m/^is_/;
31   #skip DESTROY and friends
32   return if $log_level =~ m/^[A-Z]+$/;
33   
34   if ($log_contextual_level = $LEVEL_NAME_MAP{$log_level}) {
35     $generator = sub { @content };
36   } elsif(($log_level =~ s/f$//) && ($log_contextual_level = $LEVEL_NAME_MAP{$log_level})) {
37     my $format = shift(@content);
38     $generator = sub { sprintf($format, @content) };
39   } else {
40    croak "invalid log level: $log_level";
41   }
42     
43   router->handle_log_request({
44     controller => 'Log::Any', 
45     package => scalar(caller),
46     caller_level => 1,
47     level => $log_contextual_level,
48   }, $generator);
49   
50   return;
51 }
52
53 1;