in reply to Do not use UNIVERSAL::isa this way; but why?

Because a class can override isa to return what it wants, and you're bypassing that.

package MyIO; sub isa { my $self = shift; my $type = shift; return 1 if $type eq 'IO::Handle'; return $self->SUPER::isa($type); }
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 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); }
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.

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:

package UNIVERSAL; sub safe_isa { my $obj = shift; return unless defined $obj and ref $obj; $obj->isa(@_); }
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.

Replies are listed 'Best First'.
Re^2: Do not use UNIVERSAL::isa this way; but why?
by brian_d_foy (Abbot) on Dec 10, 2008 at 18:03 UTC
    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:

    The idiom is to wrap it in an eval:

    my $answer = eval { $fd->isa(...) };

    If it's not an object or isn't the right type, you get false. It doesn't matter to you why it is false because in both cases it's not the object type you are looking for.

    --
    brian d foy <brian@stonehenge.com>
    Subscribe to The Perl Review