Commit | Line | Data |
f7ea4120 |
1 | package Object::Remote::Role::LogForwarder; |
2 | |
4e446335 |
3 | use Moo::Role; |
f7ea4120 |
4 | |
4e446335 |
5 | has enable_forward => ( is => 'rw', default => sub { 1 } ); |
a27266b7 |
6 | has _forward_destination => ( is => 'rw' ); |
052976d4 |
7 | #lookup table for package names that should not |
8 | #be forwarded across Object::Remote connections |
4e446335 |
9 | has _forward_stop => ( is => 'ro', required => 1, default => sub { {} } ); |
10 | |
f048e6df |
11 | after _deliver_message => sub { |
12 | my ($self, $level, $generator, $args, $metadata) = @_; |
13 | my $package = $metadata->{package}; |
14 | my $destination = $self->_forward_destination; |
4e446335 |
15 | our $reentrant; |
4a9fa1a5 |
16 | |
f048e6df |
17 | return unless $self->enable_forward; |
18 | return unless defined $destination; |
19 | return if $self->_forward_stop->{$package}; |
20 | |
21 | if (defined $reentrant) { |
22 | warn "log forwarding went reentrant. bottom: '$reentrant' top: '$package'"; |
23 | return; |
5d59cb98 |
24 | } |
4e446335 |
25 | |
f048e6df |
26 | local $reentrant = $package; |
4e446335 |
27 | |
5add5e29 |
28 | eval { $destination->_deliver_message($level, $generator, $args, $metadata) }; |
29 | |
30 | if ($@ && $@ !~ /^Attempt to use Object::Remote::Proxy backed by an invalid handle/) { |
31 | die $@; |
32 | } |
4e446335 |
33 | }; |
4a9fa1a5 |
34 | |
4e446335 |
35 | sub exclude_forwarding { |
c0b2df05 |
36 | my ($self, $package) = @_; |
37 | $package = caller unless defined $package; |
38 | $self->_forward_stop->{$package} = 1; |
f7ea4120 |
39 | } |
40 | |
f7ea4120 |
41 | 1; |