in reply to Re: Re: OO Perl: calling a constructor within a class
in thread OO Perl: calling a constructor within a class

In general using this code can cause an error, unless you can be sure that if $me is a reference that it is a blessed reference.

It is this that led to people doing

if(ref($me) && UNIVERSAL::isa($me,'my_class_name')) {

which is ugly, IMO.

The Scalar::Util package, that as of 5.7.2 is part of the perl distribution, contains a sub blessed() to get around this

if(blessed($me) && $me->isa('my_class_name')) {

Replies are listed 'Best First'.
Re: Re: Re: Re: OO Perl: calling a constructor within a class
by runrig (Abbot) on Sep 26, 2001 at 22:35 UTC
    if(ref($me) && UNIVERSAL::isa($me,'my_class_name')) {

    If you're doing a functional call, then there's no reason for the 'ref($me) &&' in that expression, though I think you get a warning on earlier versions of perl (not sure how early) if '$me' is undefined, so you might say:

    if(defined($me) && UNIVERSAL::isa($me,'my_class_name')) {
    Then again, you could just leave out the first part and turn off warnings locally :-)

    Update: Correction by tye duly noted.
    If I could transfer all the votes/XP from this node to yours I would...(maybe it could be a feature that our overworked fearless leader could implement someday :)

      No, you need the ref($me) to ensure that $me isn't just some string because UNIVERSAL::isa would then try to use that string as a package name to see if the named package inherits from your class. So to check whether $me is an object, you have to do both.

              - tye (but my friends call me "Tye")