in reply to Re: Re: OO-style modifiers for 'sub' ?
in thread OO-style modifiers for 'sub' ?

My issue with the way it works now, is that I can explicitly call a method by using it's full name (Class::Method), thereby bypassing the implicit passing of the first argument. I'd feel safe if there was an easy way to tell my method to do a solid type-check on the first argument, to ensure it's an object or class-name it can work with.

It should be emphasised that:

Class::method($self); # called as a subroutine $self->method; # called as a method

are not equivalent. As soon as you start calling methods as subroutines you can't use SUPER:: or override in subclasses.

Perhaps you want something like:

use Devel::Caller qw(called_as_method); sub foo { my $self = shift; croak "I am an instance method" unless called_as_method(0); # actual body of code }

Now foo croaks unless it is called as a method, which means $self->isa(__PACKAGE__) must be true.

Personally, I wouldn't bother with checks like this. For me somebody calling an OO module in an non-OO style has deliberatly broken encapsulation - so deserves whatever chaos ensues :-)

Update: the called_as_method should also be a fair bit faster since you don't have to do the potentially expensive walk of the inheritance tree.