Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

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

by Gilimanjaro (Hermit)
on Jan 24, 2003 at 19:10 UTC ( #229669=note: print w/ replies, xml ) Need Help??


in reply to 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.

Right now I do this with the same lines of code again and again, and I'm assuming I'm not the only one doing this kind of check. All the modifiers would add is an implicit check for a valid first argument, possibly pre-assigning it to a 'magic' variable, and leaving the actual arguments in @_...

But as Aristotle pointed out, something quite similar can be done by using Attribute::Handlers. I would define an attribute handler for the 'Method', 'Class' and 'Instance' attributes...


Comment on Re: Re: OO-style modifiers for 'sub' ?
Re^3: OO-style modifiers for 'sub' ?
by Aristotle (Chancellor) on Jan 24, 2003 at 20:43 UTC

    I agree though that the idea runs against the essence of Perl's general lots-of-rope attitude. And indeed as dragonchild pointed out you can shorten the whole thing to UNIVERSAL::isa($self, __PACKAGE__). But even that is problematic, as some other class may well offer the same methods and signatures as yours and therefor be safe, even though it doesn't inherit from yours. See Class::Interface -- isa() Considered Harmful for a thorough discussion of the subject.

    Of course, depending on your goals, it may be ok, but the caveats should be noted.

    Something you may want to look into is UNIVERSAL::can() which checks if a method given by name can be called on an object reference.

    Makeshifts last the longest.

      Dang, that Class::Interface discussion is tasty... :)

      Once again, happy I am!

Re^3: OO-style modifiers for 'sub' ?
by adrianh (Chancellor) on Jan 25, 2003 at 14:43 UTC
    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?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://229669]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others meditating upon the Monastery: (14)
As of 2014-07-25 20:47 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (175 votes), past polls