Why shouldn't I use UNIVERSAL::isa?

perl

Solution

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.

Problem

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 that to find out if something is a reference in the first place and then is reference to this class I have to do ``` eval { $poss->isa("Class") } ``` and check $@ and all that gumph, or else ``` use Scalar::Util 'blessed'; blessed $ref && $ref->isa($class); ``` My question is why? What's wrong with UNIVERSAL::isa called like that? It's much cleaner for things like: ``` my $self = shift if UNIVERSAL::isa($_[0], __PACKAGE__) ``` To see whether this function is being called on the object or not. And is there a nice clean alternative that doesn't get cumbersome with ampersands and potentially long lines?

Original source

Related problems