[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]
possible ":method" bug/misfeature
Given this code:
    sub oct { 042 }
    $n = oct(9999);
    print "n is $n\n";
We can diagnose/generate these problems:
    % perl -wc /tmp/testmeth
    Ambiguous call resolved as CORE::oct(), qualify as such or use & at /tmp/testmeth line 2.
    Illegal octal digit '9' ignored at /tmp/testmeth line 2.
    /tmp/testmeth syntax OK
The documentation for `use attributes' specifies that include "method" in
the list of properties supresses that warning; and that, it does:
    % perl -wc /tmp/testmeth
    Illegal octal digit '9' ignored at /tmp/testmeth line 2.
    /tmp/testmeth syntax OK
Here's the issue: I fail to see *why* it suppresses that warning,
as it still applies.
    % ./perl -I lib -w /tmp/testmeth
    Illegal octal digit '9' ignored at /tmp/testmeth line 2.
    n is 0
After all, I'm still using the sub through a normal function call,
not as a method call.
I can't get away with using an method call on it either, passing 
the current package in the dative slot:
    sub oct : method { 042 }
    $n = oct __PACKAGE__ 9999;
    print "n is $n\n";
Since that produces this:
    % perl -wc /tmp/testmeth
    Number found where operator expected at /tmp/testmeth line 2, near "__PACKAGE__ 9999"
	    (Do you need to predeclare __PACKAGE__?)
    syntax error at /tmp/testmeth line 2, near "__PACKAGE__ 9999"
    /tmp/testmeth had compilation errors.
[Hey, what's this nonsense about "predeclaring __PACKAGE__"?)
If I use the arrowladen notation, of course, this is no problem:
    sub oct : method { 042 }
    $n = __PACKAGE__ -> oct(9999);
    print "n is $n\n";
    % perl -w /tmp/testmeth
    n is 34
But in that case, the :method attr is irrelevant:
    sub oct { 042 }
    $n = __PACKAGE__ -> oct(9999);
    print "n is $n\n";
    % perl -w /tmp/testmeth
    n is 34
So I don't see that the property of the :method attribute to suppress
the "ambiguous call resolved..." warning serves any useful purpose.
It seems to be at best misleading, since it doesn't help disambiguate
a function call in the same package--that function is still neglected.
If you really want this to be your own call, you have to employ the
use subs pragma:
    use subs qw/oct/;
    sub oct { 042 }
    $n = oct(9999);
    print "n is $n\n";
    % perl -w /tmp/testmeth
    n is 34
And without the declaration, a method call never triggers the
complaint anyway.  I had thought it might matter in the indirect
object situation, but this is apparently not the case.  So what
good, then, is :method really--beyond its interaction with :locked?
thanks,
--tom
- Follow-Ups from:
 - 
Spider Boardman <spider-perl@Orb.Nashua.NH.US>
 
[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index][Thread Index][Top&Search][Original]