O'Reilly logo

Perl Cookbook by Nathan Torkington, Tom Christiansen

Stay ahead with the world's most comprehensive technology and business learning platform.

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, tutorials, and more.

Start Free Trial

No credit card required

Determining Subclass Membership

Problem

You want to know whether an object is an instance of a particular class or that class’s subclasses. Perhaps you want to decide whether a particular method can be called on an arbitrary object.

Solution

Use methods from the special UNIVERSAL class:

$obj->isa("HTTP::Message");                  # as object method
HTTP::Response->isa("HTTP::Message");       # as class method

if ($obj->can("method_name")) { .... }       # check method validity

Discussion

Wouldn’t it be convenient if all objects were rooted at some ultimate base class? That way you could give every object common methods without having to add to each @ISA. Well, you can. You don’t see it, but Perl pretends there’s an extra element at the end of @ISA—the package named UNIVERSAL.

In version 5.003, no methods were predefined in UNIVERSAL, but you could put whatever you felt like into it. However, as of version 5.004, UNIVERSAL has a few methods in it already. These are built right into your Perl binary, so they don’t take extra time to load. Predefined methods include isa , can, and VERSION. The isa method tells you whether an object or class “is” another one, without having to traverse the hierarchy yourself:

$has_io = $fd->isa("IO::Handle");
$itza_handle = IO::Socket->isa("IO::Handle");

Arguably, it’s usually best to try the method call. Explicit type checks like this are sometimes frowned upon as being too constraining.

The can method, called on behalf of that object or class, reports back whether its string argument ...

With Safari, you learn the way you learn best. Get unlimited access to videos, live online training, learning paths, books, interactive tutorials, and more.

Start Free Trial

No credit card required