I made a really silly typo. It went a little something like this:
#!/usr/bin/env perl
use Modern::Perl;
package Oops {
use Moose;
has 'typo ', is => 'ro', default => 'oops';
}
Yes, there's an extra space in 'typo '
. (If I were using the
fat comma's autoquoting behavior, I wouldn't have made this typo, but I have my
Moose attribute style for good or for ill, and this is one of the
drawbacks.)
Moose doesn't care. Should it? (No.) Perl does. Should it? (As far as it affects how the parser works, yes.)
The result is plain:
my $oops = Oops->new;
my $meth = 'typo ';
say $oops->$meth;
say $oops->typo;
The rules that you've drummed into your head about what Perl allows as an identifier or this or that are mostly rules about what you can get past Perl's parser. After that, you can do almost anything you want. Because Moose attribute declarations don't have to pass the normal parser rules about identifiers (if you specify them as strings, as I did), you have a great deal of freedom, if you're willing to use that indirection throughout the rest of the code.
The moral of the story for novices is this: the computer doesn't care what you name things, if you can somehow get the name past the parts which care.
The moral of the story for experienced developers is this: abstractions leak, and sometimes that goes to your advantage. (It's not that I've defined a private attribute, but it's a naming convention a little bit stricter than that with the leading underscore.)
The moral of the story for gurus is this: choose your coding style with caution, if you want to make bugs like this impossible.
I'm wondering what benefit you see to:
over some of the alternatives, such as
I don't have a lot of experience with Moose (unfortunately), but to me that small alteration looks like a win in both readability and automatic error detection (due to the parser, such as you mention).
It's personal preference. To me, the parentheses in latter example look like superfluous punctuation for its own sake. I understand that other people think it groups meta-attributes visually, but I don't see that when I look at it. I just see visual noise.