in reply to How called was &I?

Well, method $obj $arg; would be an error. Update: Actually, that's not an error at all. rir++ for the catch. I updated the next paragraph to reflect this.

You can't distinguish between

method( $obj, $arg); $obj->method( $arg); method $obj $arg;
because they are simply all instance methods. The last two listed there act just like the first one.

Similarly, you can't distinguish between

"Classname"->method( $arg); method "Classname" $arg; method( "Classname", $arg);
because they are all class methods. The first two act just like the last one. Update: Poor assumptions made there. See rir's reply and mine to him for more insight. Otherwise, replace those examples with:
Class->method($arg); method Class $arg; Class::method("Class", $arg);

You can determine if the method was called as a class method or an instance method by checking the refness of the first argument but you can't determine the exact syntax.

Update: Sorry for the mess. As I understand the question, you want to know if, for example, a method can know whether it was invoked via indirect object notation, a normal sub call, or with the arrow operator. My answer: a very long "no."
-sauoq
"My two cents aren't worth a dime.";

Replies are listed 'Best First'.
Re: Re: How called was &I?
by rir (Vicar) on Sep 16, 2002 at 00:58 UTC
    method $obj $arg; is not an error.
    "Classname"->method( $arg); method "Classname" $arg; method( "Classname", $arg);
    The first two act just like the last one.

    Not so. Consider:

    #!/usr/bin/perl -w use strict; package Base; sub base { print "Base::base called\n"; } package Derived; use vars qw( @ISA); @ISA = ( "Base"); package main; Derived::base Derived "hello"; Derived::base( Derived,"hello"); # undefined Derived::base "Derived" "hello"; # syntax error
      method $obj $arg;is not an error.

      You are right. It isn't. I don't know what I was thinking.

      Before going on, I should clarify my point. Once a method is called, there is no way to determine the syntax used to invoke it. Your addition of a Derived class does nothing to show otherwise.

      That said, I made a couple of poor assumptions. One was that "Classname" in the original wasn't really meant to be a quoted string but a bareword. I also assumed that method would be the appropriate name for the method regardless of context. There really was no good reason to assume either and I should have requested clarification.

      # Actual original post # What I assumed the OP meant "Classname"->method( $arg); # Class->method($arg); method "Classname" $arg; # method Class $arg; method( "Classname", $arg); # Class::method(Class, $arg);

      Mistakes, assumptions, and mistaken assumptions aside, if I understand the original post, the answer is still "No."

      -sauoq
      "My two cents aren't worth a dime.";