According to this
http://perldoc.perl.org/UNIVERSAL.html
I shouldn\'t use UNIVERSAL::isa() and should instead use $obj->isa() or CLASS->isa().
This means
The primary problem is that if you call UNIVERSAL::isa
directly, you are bypassing any classes that have overloaded isa
. If those classes rely on the overloaded behavior (which they probably do or else they would not have overridden it), then this is a problem. If you invoke isa
directly on your blessed object, then the correct isa
method will be called in either case (overloaded if it exists, UNIVERSAL:: if not).
The second problem is that UNIVERSAL::isa
will only perform the test you want on a blessed reference just like every other use of isa
. It has different behavior for non-blessed references and simple scalars. So your example that doesn't check whether $ref
is blessed is not doing the right thing, you're ignoring an error condition and using UNIVERSAL
's alternate behavior. In certain circumstances this can cause subtle errors (for example, if your variable contains the name of a class).
Consider:
use CGI;
my $a = CGI->new();
my $b = "CGI";
print UNIVERSAL::isa($a,"CGI"); # prints 1, $a is a CGI object.
print UNIVERSAL::isa($b,"CGI"); # Also prints 1!! Uh-oh!!
So, in summary, don't use UNIVERSAL::isa
... Do the extra error check and invoke isa
on your object directly.