Method::Signatures - No $self = shift!! No filters!!

schwern on 2007-12-26T10:16:23

Gentlemen! I bring you peace in our time!

package Foo;

use Method::Signatures;

method new (%args) { return bless {%args}, $self; };

method get ($key) { return $self->{$key}; };

method set ($key, $val) { return $self->{$key} = $val; };


And with NO SOURCE FILTERS! Just a hairy pile of black magic that, fortunately, I didn't write!

Really the kudos goes to Matt Trout who wrote Devel::Declare and the test/demo code which I just packaged up and shipped. There are, as you can see, a few nits. That trailing semicolon for one. The other is it doesn't work on "sub" so all you get right now is methods. These are all Devel::Declare issues.

The prototype syntax is very simplistic and does no checks. Expanding on that is the easy part, or at least just a SMOP. I plan on stealing a bunch of features from Perl 6.


Horray!!

Stevan on 2007-12-26T15:29:32

Very nice! My wrists thank you :)

You should stop by #moose and chat, I know mst has been planning on writing a Perl 6-ish Moose wrapper using Devel::Declare (tentatively called Moose::Declare), but has been without the tuits to do it. We also already have some work towards method signature checking with MooseX::Method, which can easily be converted to use a Devel::Declare based syntactic sugar. There has also been some talk of pulling the type system out of Moose so it is easier to use it in non-Moose situations, which could be helpful for this kind of stuff.

- Stevan

innovative

markjugg on 2007-12-27T03:38:33

Innovative. Thanks for sharing this.

I wish for customizing the name of "$self", but this is a nice start, and a welcome competitor to "self.pm", which I also liked it was a little weird because it was "self", not "$self", and didn't actually allow you to "shift" off $self through the system, just reference it.

Wow, that was a run-on sentence.

      Mark

Re:innovative

audreyt on 2007-12-27T12:16:53

Mark: You just inspired me to write selfvars.pm, now on CPAN. :-)

Re: sefvars.pm

markjugg on 2007-12-27T15:56:42

Wow, Thanks Audrey. I like it.

I wonder if it used "Sub::Exporter", if the "self" scalar name could be easily customized, like it can for "self.pm". However, I don't see any examples in the Sub::Exporter docs of exporting scalars. (Perhaps only because it is recommended against in most cases).

Re: sefvars.pm

audreyt on 2007-12-28T12:21:58

No, it doesn't use Sub::Exporter; as of version 0.05, it manages the exporting by itself.

You can customize the "self" scalar name with an import line:

use selfvars -self => 'this', -args => 'opts';
Or only import self as $this but not args:

use selfvars -self => 'this';
Or only import self as $self:

use selfvars -self;
More suggestions are welcome as well!

Re:innovative

jplindstrom on 2007-12-27T21:19:17

Excellent! So long Spiffy.

Re:innovative

schwern on 2007-12-28T21:34:42

Clever, but performance is awful. Tied variables. :(

Then again, I've found some fascinating bugs in Method::Signatures.

Re:innovative

audreyt on 2007-12-28T22:48:18

True, but although there is technically a 10-fold difference between 1191563/s vs 114688/s per lookup, in practice I wonder how it's going to matter -- even if it's put in a loop that's going to look up $self more than 100000 times, the difference will still be less than one second. :-)

Re:innovative

schwern on 2007-12-29T01:04:03

$self gets used an awful lot. It's one of those things that adds a drag to every single aspect of your code. As much as we'd like to, you can't always ignore the constant part of big-O.

Re:innovative

hex on 2007-12-29T01:04:18

That's beautiful, Audrey, thank you. One thought - I always pass by reference, that is to say, $vars. If that could make it into a future selfvars.pm as an option, it would be awesome.

Re:innovative

audreyt on 2007-12-29T05:08:05

Do you mean that you always pass a single by-name hash reference argument, in a PBP-esque fashion?

$obj->meth({ a => 1, b => 2 });
If so, how about making available a %opts so you can say:

sub meth {
    $self->foo($opts{a});
}
If you wish you can even import selfvars like this, populating named options into %_:

use selfvars -opts => '_', -self;
sub meth {
    $self->foo($_{a});
}
Would that resemble what you want?

Re:innovative

hex on 2007-12-31T05:10:39

0.10 of selfvars very definitely resembles what I want. I dub thee Lady Leet of Awesomeland!

Unstable magic

jjore on 2007-12-27T06:51:48

Devel::Declare strikes me as likely to be unstable magic. It messes with the yy* parts of the parser during its operation. How likely is /that/ to keep working?

I've always looked at that part of perl and gone "OMG, this is nasty looking" so perhaps this is not as horrible as I'm imagining. I just don't think it's the kind of thing of which stable software is made. In a year from now if it continues to work on 5.6 -> 5.11 I guess I could believe it then. There'll be more than enough unanticipated delta to stress this thing out.

Re:Unstable magic

schwern on 2007-12-28T21:24:49

You'd have to ask Matt Trout for details, I know he has plans to move as much magic as possible out of the C hack and into Perl. At least it's stable with any given release of Perl. It's not like those exactly SNEAK up on us.