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; |
08435f11 |
15 | my %metadata = %$metadata; |
4e446335 |
16 | our $reentrant; |
08435f11 |
17 | |
18 | if (defined $metadata->{object_remote}) { |
19 | $metadata{object_remote} = { %{$metadata->{object_remote}} }; |
20 | } |
21 | |
22 | $metadata{object_remote}->{forwarded} = 1; |
4a9fa1a5 |
23 | |
f048e6df |
24 | return unless $self->enable_forward; |
25 | return unless defined $destination; |
26 | return if $self->_forward_stop->{$package}; |
27 | |
28 | if (defined $reentrant) { |
29 | warn "log forwarding went reentrant. bottom: '$reentrant' top: '$package'"; |
30 | return; |
5d59cb98 |
31 | } |
4e446335 |
32 | |
f048e6df |
33 | local $reentrant = $package; |
4e446335 |
34 | |
08435f11 |
35 | eval { $destination->_deliver_message($level, $generator, $args, \%metadata) }; |
5add5e29 |
36 | |
37 | if ($@ && $@ !~ /^Attempt to use Object::Remote::Proxy backed by an invalid handle/) { |
38 | die $@; |
39 | } |
4e446335 |
40 | }; |
4a9fa1a5 |
41 | |
4e446335 |
42 | sub exclude_forwarding { |
c0b2df05 |
43 | my ($self, $package) = @_; |
44 | $package = caller unless defined $package; |
45 | $self->_forward_stop->{$package} = 1; |
f7ea4120 |
46 | } |
47 | |
f7ea4120 |
48 | 1; |