3b1f655f6cc3b20b1dbf1493b5392f44b86101d1
[scpubgit/Object-Remote.git] / lib / Object / Remote / LogRouter.pm
1 package Object::Remote::LogRouter; 
2
3 use Moo;
4 use Scalar::Util qw(blessed);
5
6 with 'Object::Remote::Role::LogForwarder';
7
8 has subscriptions => ( is => 'ro', required => 1, default => sub { [] } );
9 has description => ( is => 'rw', required => 1 );
10
11 sub before_import { }
12 sub after_import { }
13
14 sub subscribe {
15   my ($self, $logger, $selector) = @_;
16   my $subscription_list = $self->subscriptions;
17      
18   my $subscription = [ $logger, $selector ];
19   
20   push(@$subscription_list, $subscription);
21    
22   return $self; 
23 }
24
25 #TODO turn this logic into a role
26 sub get_loggers {
27   my ($self, $caller, $level) = @_; 
28   my $should_clean = 0; 
29   my @logger_list; 
30       
31   foreach(@{ $self->subscriptions }) {
32     unless(defined) {
33       $should_clean = 1;
34         next; 
35      }
36      
37      my ($logger, $selector) = @$_;
38      
39      if ($selector->({ log_level => $level, package => $caller, caller_level => 2 })) {
40        push(@logger_list, $logger);     
41      }
42    }
43    
44    if ($should_clean) {
45      $self->_remove_dead_subscriptions; 
46    }
47    
48    return @logger_list; 
49 }
50
51 sub _remove_dead_subscriptions {
52   my ($self) = @_; 
53   my @ok = grep { defined $_ } @{$self->subscriptions}; 
54   @{$self->subscriptions} = @ok; 
55   return; 
56 }
57
58
59 1; 
60