Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Re^3: OO-style modifiers for 'sub' ?

by adrianh (Chancellor)
on Jan 25, 2003 at 14:43 UTC ( #229846=note: print w/replies, xml ) Need Help??

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.

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://229846]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others contemplating the Monastery: (5)
As of 2018-06-19 05:52 GMT
Find Nodes?
    Voting Booth?
    Should cpanminus be part of the standard Perl release?

    Results (111 votes). Check out past polls.