Hack #47. Autodeclare Method Arguments

You know who you are. Stop repeating your $self.

Perl's object orientation is very flexible, in part because of its simplicity and minimalism. At times that's valuable: it allows hackers to build complex object systems from a few small features. The rest of the time it can be painful to do simple things.

Though not everyone always calls the invocant in methods $self, everyone has to declare and manage the invocant and other arguments. That's a bit of a drag—but it's fixable. Sure, you could use a full-blown source filter [Hack #94] to remove the need to shift off $self and process the rest of your argument list, but that's an unnecessarily large hammer to swing at such a small annoyance. There's another way.

The Hack

Solving this problem without source filters requires three ideas. First, there must be some way to mark a subroutine as a method, because not all subroutines are methods. Second, this should be compatible with strict, for good programming practices. Third, there should be some way to add the proper operations to populate $self and the other arguments.

The first is easy: how about a subroutine attribute [Hack #45] called Method? The third is also possible with a little bit of B::Deparse [Hack #56] and eval magic. The second is trickier....

A surprisingly short module can do all of this:

package Attribute::Method; use strict; use warnings; use B::Deparse; use Attribute::Handlers; my $deparse = B::Deparse->new( ); sub import { my ( $class, ...

Get Perl Hacks now with the O’Reilly learning platform.

O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.