3afa0d7cd8d6887436cab0d5fa6a9dcadf16bfe3
[scpubgit/Object-Remote.git] / lib / Object / Remote / Logging / Logger.pm
1 package Object::Remote::Logging::Logger;
2
3 use Moo;
4 use Scalar::Util qw(weaken);
5
6 has level_names => ( is => 'ro', required => 1 );
7 has min_level => ( is => 'ro', required => 1 );
8 has max_level => ( is => 'ro' );
9 has _level_active => ( is => 'lazy' );
10
11 sub BUILD {
12     my ($self) = @_;
13     our $METHODS_INSTALLED; 
14     $self->_install_methods unless $METHODS_INSTALLED;
15 }
16
17 sub _build__level_active {
18     my ($self) = @_; 
19     my $should_log = 0;
20     my $min_level = $self->min_level;
21     my $max_level = $self->max_level;
22     my %active;
23     
24     foreach my $level (@{$self->level_names}) {
25         if($level eq $min_level) {
26             $should_log = 1; 
27         }
28         
29         $active{$level} = $should_log;
30         
31         if (defined $max_level && $level eq $max_level) {
32             $should_log = 0;
33         }
34     }
35     
36     return \%active;
37 }
38
39 sub _install_methods {
40     my ($self) = @_;
41     my $should_log = 0;
42     our $METHODS_INSTALLED = 1;
43     
44     no strict 'refs';
45     
46     foreach my $level (@{$self->level_names}) {
47         *{"is_$level"} = sub { shift(@_)->_level_active->{$level} };
48         *{$level} = sub { shift(@_)->_log($level, @_) };
49     }
50 }
51
52 sub _log {
53     my ($self, $level, $content, $metadata_in) = @_;
54     #TODO this stinks but is backwards compatible with the original logger api
55     my %metadata = %$metadata_in;
56     my $rendered = $self->_render($level, \%metadata, @$content);
57     $self->_output($rendered);
58 }
59
60 sub _render {
61     my ($self, $level, $metadata, @content) = @_;
62     my $rendered = "[$level] ";
63     my $remote_info = $metadata->{object_remote};
64     
65     if ($remote_info) {
66         $rendered .= "[connection #$remote_info->{connection_id}] ";
67     } else {
68         $rendered .= "[local] ";
69     }
70     
71     $rendered .= join('', @content);
72     $rendered .= "\n" unless substr($rendered, -1) eq "\n";
73     return $rendered;
74 }
75
76 sub _output {
77     my ($self, $content) = @_;
78     print STDERR $content;
79 }
80
81
82 1;
83