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.