Because a class can override isa to return what it wants, and you're bypassing that.
In this scenario, MyIO wants to claim to be an IO::Handle. That's perfectly allowed - presumably, then, it fulfills all the obligation of IO::Handle without actually deriving from it. Another example:package MyIO; sub isa { my $self = shift; my $type = shift; return 1 if $type eq 'IO::Handle'; return $self->SUPER::isa($type); }
In this case, I don't want to look like an IO::Handle, even though I'm derived from it. Maybe I just want all the convenience of the IO::Handle type, while breaking its interface. Again, your UNIVERSAL::isa($obj, 'IO::Handle') would return incorrectly because it wouldn't be using this isa.package MyNotIO; use base 'IO::Handle'; sub isa { my $self = shift; my $type = shift; return 0 if $type eq 'IO::Handle'; return $self->SUPER::isa($type); }
The problem with $fd->isa(...) is that it crashes if $fd is undef, whereas a simple "no" would be better. If they made that work at the same time as inheritance, that'd be awesome :-) Most likely, that would just be:
Now you could call UNIVERSAL::safe_isa($fd, 'IO::Handle'), and it'd work properly, and safely, even if $fd wasn't actually an object.package UNIVERSAL; sub safe_isa { my $obj = shift; return unless defined $obj and ref $obj; $obj->isa(@_); }
In reply to Re: Do not use UNIVERSAL::isa this way; but why?
by Tanktalus
in thread Do not use UNIVERSAL::isa this way; but why?
by klekker
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |