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