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.
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(@_); }
|
---|
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 | |
by ysth (Canon) on Dec 14, 2008 at 20:46 UTC |