|Keep It Simple, Stupid|
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:
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:
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.