logging changes in Dist::Zilla were not complete

In short, there was just too much copy and paste. It wasn’t really trivial, either. Here’s an example of code that appeared in both Pod::Weaver::Role::Plugin and Dist::Zilla::Role::Plugin:

for my $method (qw(log log_debug log_fatal)) {
  Sub::Install::install_sub({
    code => sub {
      my ($self, @rest) = @_;
      my $arg = _HASHLIKE($rest[0]) ? (shift @rest) : {};
      local $arg->{prefix} = '[' . $self->plugin_name . '] '
                           . (defined $arg->{prefix} ? $arg->{prefix} : '');

      $self->weaver->logger->$method($arg, @rest);
    },
    as   => $method,
  });
}

This is gross for a few reasons, but I think that its basic grossness should be obvious. I didn’t want anyone to have to copy this around. The replacement is really nice:

has logger => (
  is   => 'ro',
  lazy => 1,
  handles => [ qw(log log_debug log_fatal) ],
  default => sub {
    $_[0]->weaver->logger->proxy({
      proxy_prefix => '[' . $_[0]->plugin_name . '] ',
    });
  },
);

We say, “I’m a plugin of something with a logger. If I need to log anything, I’ll ask for a proxy to that logger, and my proxy will have a custom prefix.”

This proxy is a Log::Dispatchouli::Proxy, which closely emulates much of Log::Dispatchouli, but with some bits localized and some bits off limits. For example, that proxy_prefix can’t be changed after the fact, but we could turn debugging on or off without affecting the parent logger.

Because I’m using proper delegation again, I can make things lazy again, and I can make it easy to tweak the behavior of one plugin for testing purposes.

This logging work has taken more time than I expected, but I think it will really pay dividends. I hope to get the new logging code documented and all the relevant updates deployed to the CPAN tomorrow. For now, I’m beat and I’m going to bed.