fix indentation levels; remove dead comments and code
[scpubgit/Object-Remote.git] / lib / Object / Remote / LogRouter.pm
CommitLineData
f7ea4120 1package Object::Remote::LogRouter;
2
3use Moo;
4use Scalar::Util qw(blessed);
5
6with 'Object::Remote::Role::LogForwarder';
7
8has subscriptions => ( is => 'ro', required => 1, default => sub { [] } );
4a9fa1a5 9has description => ( is => 'rw', required => 1 );
f7ea4120 10
11sub before_import { }
37efeb68 12sub after_import { }
f7ea4120 13
14sub subscribe {
5d59cb98 15 my ($self, $logger, $selector, $is_temp) = @_;
16 my $subscription_list = $self->subscriptions;
f7ea4120 17
5d59cb98 18 if(ref $logger ne 'CODE') {
19 die 'logger was not a CodeRef or a logger object. Please try again.'
20 unless blessed($logger);
21 $logger = do { my $l = $logger; sub { $l } }
22 }
f7ea4120 23
24 my $subscription = [ $logger, $selector ];
25
26 $is_temp = 0 unless defined $is_temp;
27 push(@$subscription_list, $subscription);
28 if ($is_temp) {
5d59cb98 29 #weaken($subscription->[-1]);
f7ea4120 30 }
31 return $subscription;
32}
33
34#TODO turn this logic into a role
35sub handle_log_message {
5d59cb98 36 my ($self, $caller, $level, $log_meth, @values) = @_;
37 my $should_clean = 0;
f7ea4120 38
5d59cb98 39 foreach(@{ $self->subscriptions }) {
40 unless(defined($_)) {
41 $should_clean = 1;
42 next;
43 }
44 my ($logger, $selector) = @$_;
45 #TODO this is not a firm part of the api but providing
46 #this info to the selector is a good feature
47 local($_) = { level => $level, package => $caller };
48 if ($selector->(@values)) {
37efeb68 49 #TODO issues with caller_level have not been resolved yet
50 #when a logger crosses an object::remote::connection so
5d59cb98 51 $logger = $logger->($caller, { caller_level => -1 });
9031635d 52
53 #TODO there is a known issue with the interaction of this
54 #routed logging scheme and objects proxied with Object::Remote.
55 #Specifically the loggers must be invoked with a calling
56 #depth of 0 which isn't possible using a logger that has
57 #been proxied which is what happens with routed logging
58 #if the logger is created in one Perl interpreter and the
59 #logging happens in another
5d59cb98 60 $logger->$level($log_meth->(@values))
61 if $logger->${\"is_$level"};
62 }
f7ea4120 63 }
64
65 if ($should_clean) {
5d59cb98 66 $self->_remove_dead_subscriptions;
f7ea4120 67 }
68
69 return;
70}
71
72sub _remove_dead_subscriptions {
5d59cb98 73 my ($self) = @_;
74 my @ok = grep { defined $_ } @{$self->subscriptions};
75 @{$self->subscriptions} = @ok;
76 return;
f7ea4120 77}
78
79
801;
81