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. |