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, ...Become an O’Reilly member and get unlimited access to this title plus top books and audiobooks from O’Reilly and nearly 200 top publishers, thousands of courses curated by job role, 150+ live events each month,
and much more.
Read now
Unlock full access