One of my favorite hacks in Perl Hacks shows how to declare the:Method attribute so you don't have to type my $self = shift; anymore. There are lots of ways to do that, but my approach was to avoid source filters (yay). The book goes into more detail, but effectively the trick allows you to declare any other parameter while avoiding most drawbacks of source filters.
Damian correctly pointed out that my technique does have the limitation of not always respecting the lexical compiling environment of the methods.
Today I figured out another approach that only handles invocants, but is strict safe. That is, now you can write:
package Foo;
use Attribute::Method;
sub new
{
my ($class, %args) = @_;
bless \%args, $class;
}
sub foo:Method
{
return self->{foo}
}
Of course, you can also use this or o or just about any other allowed identifier.
What's the trick? I originally thought @DB::args would work, but if you take something off of the stack, it's just gone and so the really clever trampoline trick wouldn't do it. Now it only works with versions of Scalar::Util released this millennium.
Still, I don't really mind that syntax at all.
Table of Contents? (Score:1)
Benchmarks using this method? (Score:1)
function calls are already pretty expensive, but depending on how you are implementing this I imagine it could result in a lot more of them. Would this be correct?
Re:Benchmarks using this method? (Score:1)
Bill
# I had a sig when sigs were cool
use Sig;
Re:Benchmarks using this method? (Score:1)
You are correct. It's as fast as it can be without a source filter and without using XS (though I can already think of a way to make it faster with XS).
:Method (Score:1)
I played the game even a bit more in the last weeks:
sub foo
self->baz();
print class, ': ', args->foo;
}
Called via:
$object->foo( foo => 23, bar => $bar_obj );
"args" returns just a container object, that uses autoload t
Ordinary morality is for ordinary people. -- Aleister Crowley
Re: (Score:1)
Hmmm, it may pair nicely with Moose [cpan.org]: although the latter claims not to be a Perl 6 implementation in Perl 5, it is admittedly heavily inspired by Perl 6 itself, and to some extent imports Perl 6 semantics, with special emphasis on OO features, in Perl 5. Also, it seems that unlike e.g. v6 [cpan.org], it is much less experimental a
-- # This prints: Just another Perl hacker, seek DATA,15,0 and print q... ; __END__
CPAN It? (Score:2)
—Theory
Re:CPAN It? (Score:1)
Good idea. Keep bugging me about it; I don't have time in the next couple of weeks, but I'll experiment with the XS version.
Re:CPAN It? (Score:2)
—Theory
Re: (Score:1)
*bug* *bug*