Found a bug in File::Finder

I uploaded File::Finder to the CPAN more than a decade ago. I was using it for a project today, and found a bug that has been in there in the beginning. I forgot to localize $_ in ->contains, which clobbered File::Find's $_, used by just about everything else.

I couldn't even remember where I had put the git repo for the distro source, and once I found that, I couldn't remember how to build and test modules.

I'm getting old.

git blame across the entire codebase

A few years ago, a script showed up on the git mailing list that would effectively run "git blame" across the entire tree, and aggregate the line counts by author. Here's the first 50 authors as of commit 86714aaae213175ea8c716ad22c1e10300d5bf61:

Total lines: 2200186
  516667  23.48%  Jarkko Hietaniemi
  205425   9.34%  Karl Williamson
  200933   9.13%  Chris 'BinGOs' Williams
  145825   6.63%  Nicholas Clark
   86205   3.92%  Rafael Garcia-Suarez
   82823   3.76%  Gurusamy Sarathy
   57861   2.63%  Larry Wall
   53781   2.44%  Steve Peters
   49052   2.23%  Paul Marquess
   46528   2.11%  Perl 5 Porters
   45927   2.09%  Father Chrysostomos
   40271   1.83%  Sullivan Beck
   34158   1.55%  Steve Hay
   28840   1.31%  David Mitchell
   28330   1.29%  David Golden
   27898   1.27%  Ricardo Signes
   27055   1.23%  Nick Ing-Simmons
   25204   1.15%  Ilya Zakharevich
   23394   1.06%  Marcus Holland-Moritz
   18139   0.82%  Yves Orton
   16877   0.77%  Andy Dougherty
   16330   0.74%  Steffen Mueller
   16202   0.74%  Michael G. Schwern
   15076   0.69%  Zefram
   14224   0.65%  Brian Fraser
   13507   0.61%  Dave Mitchell
   13494   0.61%  Dan Kogai
   13257   0.60%  H.Merijn Brand
   10307   0.47%  Jerry D. Hedden
    9667   0.44%  Tels
    9443   0.43%  Jesse Vincent
    8610   0.39%  Andreas Koenig
    8266   0.38%  Craig A. Berry
    7453   0.34%  Abhijit Menon-Sen
    7328   0.33%  Hugo van der Sanden
    7051   0.32%  Vadim Konovalov
    7016   0.32%  Jim Cromie
    6946   0.32%  Tom Christiansen
    6648   0.30%  John E. Malmberg
    6305   0.29%  Shlomi Fish
    6276   0.29%  Abigail
    5917   0.27%  Radu Greab
    5877   0.27%  Yitzchak Scott-Thoennes
    5860   0.27%  Jos I. Boumans
    5558   0.25%  Marc Green
    5472   0.25%  Paul Fenwick
    5323   0.24%  Dave Rolsky
    5240   0.24%  Jan Dubois
    5138   0.23%  Andy Lester
    5089   0.23%  Tony Cook

detecting "too heavy" views in Template Toolkit

$client is doing a lot of heavy lifting (perhaps accidentally) in some Catalyst-driven Template Toolkit code. Apparently, it's far too easy to pass a DBIx::Class object into the stash, and then trigger things that end up hitting the database... from the view. That wouldn't be horrible, except the same exact queries are being used in multiple places in the templates, causing many redundant identical queries to the database per page hit. (Note aside: if this was Rose::DB... I'd trivially jump to Rose::DB::Object::Cached. Problem solved.)

I wanted a way to see what method calls were being invoked on the objects in the stash. Simple... just subclass Template::Stash! Now I get a list of the component invoking the method, the path from the root stash to the object, and the method call being made.

package Test::Stash;
use base qw(Template::Stash);

use strict;
use warnings;
use Scalar::Util qw( blessed reftype );

use Template::Config;

our @PATH;
our $BYPASS = 0;

sub _dotop {
  my ($self, $root, $item, $args, $lvalue) = @_;

  unless ($BYPASS) {
    my $rootref = ref $root;
    my $atroot  = (blessed $root && $root->isa(ref $self));

    if ($atroot) {
      @PATH = $item;
    } else {
      push @PATH, $item;

    if (blessed $root && $root->can($item)) { # likely a method call
      if ($root =~ m{
                        # (redacted) $client top-level model class
                        Moose::Meta::Class:: .*?
                      )=}x) {
        ## ignore these
      } else {
        local $BYPASS = 1;
        my $component = $self->get(['component', 0, 'name', 0]);
        warn sprintf "%s: %s => %s\n",
          join('.', @PATH),
  return (shift @_)->SUPER::_dotop(@_);

# warn "Loaded Test::Stash... before is $Template::Config::STASH";

$Template::Config::STASH = __PACKAGE__;

# warn "Loaded Test::Stash... after is $Template::Config::STASH";


Mail::Audit and presuming a bit too much

I was tweaking my procmailrc today. My procmailrc recognizes a number of common pattern-based spam items and logs those into logs that I rotate on a regular basis. Anything else gets fed into a Mail::Audit-based "Sortmail" script. As I was testing a minor tweak, I noticed that the logfile for Sortmail (driven by the Mail::Audit object) wasn't getting any messages.

Long story short... I had opened the Mail::Audit logfile as "-", because I wanted it to use stdout, which in my procmailrc I had directed to the proper log.

But RJBS recently changed Mail::Audit from using the two-…

A compelling reason for Perl6

Had a great chat with the Thousand Oaks PerlMongers last night, as an ongoing series of conversations I've been having recently about finding a compelling reason for Perl6.

I was inspired by Larry's Onion talk to continue thinking about the relation of Perl5 and Perl6 (and frankly, me and Stonehenge as well).

First, Perl6 is not "the next Perl5". Perl5 will be alive and well for another decade at least, independently maintained and released. That's happening quite efficiently and effectively already. (Translated: "I will quite possibly be able to continue making money off Per…