X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=scpubgit%2FObject-Remote.git;a=blobdiff_plain;f=lib%2FObject%2FRemote%2FRole%2FLogForwarder.pm;h=d701b728f6ae0e6f28fb66a44801c7302e3791b8;hp=495a9c2cd2e3a88a6e9ceb2492af0b831ff8d0ea;hb=f048e6dfeaefce08546e91cc9d4bf79492d7ca0d;hpb=f7ea4120db80a6feb33053e6bcb0f983b71f7394 diff --git a/lib/Object/Remote/Role/LogForwarder.pm b/lib/Object/Remote/Role/LogForwarder.pm index 495a9c2..d701b72 100644 --- a/lib/Object/Remote/Role/LogForwarder.pm +++ b/lib/Object/Remote/Role/LogForwarder.pm @@ -1,36 +1,36 @@ package Object::Remote::Role::LogForwarder; -use Moo::Role; - -with 'Log::Contextual::Role::Router'; - -#TODO re-weaken router references when object::remote -#weak reference operation is figured out - -has child_routers => ( is => 'ro', required => 1, default => sub { {} } ); -has parent_router => ( is => 'rw', );#weak_ref => 1 ); - -#adds a child router to this router and gives it -#a friendly display name -sub add_child_router { - my ($self, $description, $router) = @_; - $self->child_routers->{$description} = $router; - #weaken($self->child_routers->{$class}); - $router->parent_router($self); - return; -} +use Moo::Role; +use Carp qw(cluck); + +has _forward_destination => ( is => 'rw' ); +has enable_forward => ( is => 'rw', default => sub { 1 } ); +has _forward_stop => ( is => 'ro', required => 1, default => sub { {} } ); + +after _deliver_message => sub { + my ($self, $level, $generator, $args, $metadata) = @_; + my $package = $metadata->{package}; + my $destination = $self->_forward_destination; + our $reentrant; + + 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; + + $destination->_deliver_message($level, $generator, $args, $metadata); +}; -sub remove_child_router { - my ($self, $description) = @_; - return delete $self->child_routers->{$description}; +sub exclude_forwarding { + my ($self, $package) = @_; + $package = caller unless defined $package; + $self->_forward_stop->{$package} = 1; } -after handle_log_message => sub { - my ($self, @args) = @_; - my $parent = $self->parent_router; - - return unless defined $parent; - $parent->handle_log_message(@args); -}; - 1;