http://www.perlmonks.org?node_id=465644


in reply to Re: isa() on any scalar
in thread isa() on any scalar

No, don't do that.

Assume that UNIVERSAL::new existed. Would you suggest always creating objects with UNIVERSAL::new( $class_name, %data ); too?

Try instead:

my $is_node = eval { $value->isa( 'Node' ) }; # handle not node case if $@ is true or if $is_node is false

This has the advantage of allowing subclasses of Node to override isa() as they see fit, of allowing objects that perform the Node role (see Class::Roles, for example) to work appropriately, and of catching an error if $value is an invalid invocant. It also avoids calling a parent class method specifically on a potential instance of a derived class, which is a bad idea.

Update: Expanded code slightly.

Replies are listed 'Best First'.
Re^3: isa() on any scalar
by gam3 (Curate) on Jun 11, 2005 at 02:15 UTC
    No don't do this either. An exception should only be used to catch exceptional events. Since it seems that $value is just as likely not to be a 'Node' as it is to be one you should not use an exception to test it.
    -- gam3
    A picture is worth a thousand words, but takes 200K.

      As I mentioned, if $value is not a valid invocant, it is an exceptional case.

      I'm not aware of any other idiom that respects potentially-overridden isa() methods and handles potentially invalid invocants in one statement. If you know one, please share.

      Scalar::Util's blessed() is pretty good, but that technique disallows calling isa() as a class method. Sometimes that's good. Sometimes it's not.