<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">package UNIVERSAL;

our $VERSION = '1.15';

# UNIVERSAL should not contain any extra subs/methods beyond those
# that it exists to define. The existence of import() below is a historical
# accident that can't be fixed without breaking code.

# Make sure that even though the import method is called, it doesn't do
# anything unless called on UNIVERSAL.
sub import {
    return unless $_[0] eq __PACKAGE__;
    return unless @_ &gt; 1;
    require Carp;
    Carp::croak("UNIVERSAL does not export anything");
}

1;
__END__

=head1 NAME

UNIVERSAL - base class for ALL classes (blessed references)

=head1 SYNOPSIS

    my $obj_is_io    = $fd-&gt;isa("IO::Handle");
    my $cls_is_io    = Class-&gt;isa("IO::Handle");

    my $obj_does_log = $obj-&gt;DOES("Logger");
    my $cls_does_log = Class-&gt;DOES("Logger");

    my $obj_sub      = $obj-&gt;can("print");
    my $cls_sub      = Class-&gt;can("print");

    my $eval_sub     = eval { $ref-&gt;can("fandango") };
    my $ver          = $obj-&gt;VERSION;

    # but never do this!
    my $is_io        = UNIVERSAL::isa($fd, "IO::Handle");
    my $sub          = UNIVERSAL::can($obj, "print");

=head1 DESCRIPTION

C&lt;UNIVERSAL&gt; is the base class from which all blessed references inherit.
See L&lt;perlobj&gt;.

C&lt;UNIVERSAL&gt; provides the following methods:

=over 4

=item C&lt;&lt; $obj-&gt;isa( TYPE ) &gt;&gt;

=item C&lt;&lt; CLASS-&gt;isa( TYPE ) &gt;&gt;

=item C&lt;&lt; eval { VAL-&gt;isa( TYPE ) } &gt;&gt;

Where

=over 4

=item C&lt;TYPE&gt;

is a package name

=item C&lt;$obj&gt;

is a blessed reference or a package name

=item C&lt;CLASS&gt;

is a package name

=item C&lt;VAL&gt;

is any of the above or an unblessed reference

=back

When used as an instance or class method (C&lt;&lt; $obj-&gt;isa( TYPE ) &gt;&gt;),
C&lt;isa&gt; returns I&lt;true&gt; if $obj is blessed into package C&lt;TYPE&gt; or
inherits from package C&lt;TYPE&gt;.

When used as a class method (C&lt;&lt; CLASS-&gt;isa( TYPE ) &gt;&gt;, sometimes
referred to as a static method), C&lt;isa&gt; returns I&lt;true&gt; if C&lt;CLASS&gt;
inherits from (or is itself) the name of the package C&lt;TYPE&gt; or
inherits from package C&lt;TYPE&gt;.

If you're not sure what you have (the C&lt;VAL&gt; case), wrap the method call in an
C&lt;eval&gt; block to catch the exception if C&lt;VAL&gt; is undefined or an unblessed
reference. The L&lt;C&lt;isa&gt; operator|perlop/"Class Instance Operator"&gt; is an
alternative that simply returns false in this case, so the C&lt;eval&gt; is not
needed.

If you want to be sure that you're calling C&lt;isa&gt; as a method, not a class,
check the invocand with C&lt;blessed&gt; from L&lt;Scalar::Util&gt; first:

  use Scalar::Util 'blessed';

  if ( blessed( $obj ) &amp;&amp; $obj-&gt;isa("Some::Class") ) {
      ...
  }

=item C&lt;&lt; $obj-&gt;DOES( ROLE ) &gt;&gt;

=item C&lt;&lt; CLASS-&gt;DOES( ROLE ) &gt;&gt;

C&lt;DOES&gt; checks if the object or class performs the role C&lt;ROLE&gt;.  A role is a
named group of specific behavior (often methods of particular names and
signatures), similar to a class, but not necessarily a complete class by
itself.  For example, logging or serialization may be roles.

C&lt;DOES&gt; and C&lt;isa&gt; are similar, in that if either is true, you know that the
object or class on which you call the method can perform specific behavior.
However, C&lt;DOES&gt; is different from C&lt;isa&gt; in that it does not care I&lt;how&gt; the
invocand performs the operations, merely that it does.  (C&lt;isa&gt; of course
mandates an inheritance relationship.  Other relationships include aggregation,
delegation, and mocking.)

By default, classes in Perl only perform the C&lt;UNIVERSAL&gt; role, as well as the
role of all classes in their inheritance.  In other words, by default C&lt;DOES&gt;
responds identically to C&lt;isa&gt;.

There is a relationship between roles and classes, as each class implies the
existence of a role of the same name.  There is also a relationship between
inheritance and roles, in that a subclass that inherits from an ancestor class
implicitly performs any roles its parent performs.  Thus you can use C&lt;DOES&gt; in
place of C&lt;isa&gt; safely, as it will return true in all places where C&lt;isa&gt; will
return true (provided that any overridden C&lt;DOES&gt; I&lt;and&gt; C&lt;isa&gt; methods behave
appropriately).

=item C&lt;&lt; $obj-&gt;can( METHOD ) &gt;&gt;

=item C&lt;&lt; CLASS-&gt;can( METHOD ) &gt;&gt;

=item C&lt;&lt; eval { VAL-&gt;can( METHOD ) } &gt;&gt;

C&lt;can&gt; checks if the object or class has a method called C&lt;METHOD&gt;. If it does,
then it returns a reference to the sub.  If it does not, then it returns
I&lt;undef&gt;.  This includes methods inherited or imported by C&lt;$obj&gt;, C&lt;CLASS&gt;, or
C&lt;VAL&gt;.

C&lt;can&gt; cannot know whether an object will be able to provide a method through
AUTOLOAD (unless the object's class has overridden C&lt;can&gt; appropriately), so a
return value of I&lt;undef&gt; does not necessarily mean the object will not be able
to handle the method call. To get around this some module authors use a forward
declaration (see L&lt;perlsub&gt;) for methods they will handle via AUTOLOAD. For
such 'dummy' subs, C&lt;can&gt; will still return a code reference, which, when
called, will fall through to the AUTOLOAD. If no suitable AUTOLOAD is provided,
calling the coderef will cause an error.

You may call C&lt;can&gt; as a class (static) method or an object method.

Again, the same rule about having a valid invocand applies -- use an C&lt;eval&gt;
block or C&lt;blessed&gt; if you need to be extra paranoid.

=item C&lt;VERSION ( [ REQUIRE ] )&gt;

C&lt;VERSION&gt; will return the value of the variable C&lt;$VERSION&gt; in the
package the object is blessed into. If C&lt;REQUIRE&gt; is given then
it will do a comparison and die if the package version is not
greater than or equal to C&lt;REQUIRE&gt;, or if either C&lt;$VERSION&gt; or C&lt;REQUIRE&gt;
is not a "lax" version number (as defined by the L&lt;version&gt; module).

The return from C&lt;VERSION&gt; will actually be the stringified version object
using the package C&lt;$VERSION&gt; scalar, which is guaranteed to be equivalent
but may not be precisely the contents of the C&lt;$VERSION&gt; scalar.  If you want
the actual contents of C&lt;$VERSION&gt;, use C&lt;$CLASS::VERSION&gt; instead.

C&lt;VERSION&gt; can be called as either a class (static) method or an object
method.

=back

=head1 WARNINGS

B&lt;NOTE:&gt; C&lt;can&gt; directly uses Perl's internal code for method lookup, and
C&lt;isa&gt; uses a very similar method and cache-ing strategy. This may cause
strange effects if the Perl code dynamically changes @ISA in any package.

You may add other methods to the UNIVERSAL class via Perl or XS code.
You do not need to C&lt;use UNIVERSAL&gt; to make these methods
available to your program (and you should not do so).

=head1 EXPORTS

None.

Previous versions of this documentation suggested using C&lt;isa&gt; as
a function to determine the type of a reference:

  $yes = UNIVERSAL::isa($h, "HASH");
  $yes = UNIVERSAL::isa("Foo", "Bar");

The problem is that this code would I&lt;never&gt; call an overridden C&lt;isa&gt; method in
any class.  Instead, use C&lt;reftype&gt; from L&lt;Scalar::Util&gt; for the first case:

  use Scalar::Util 'reftype';

  $yes = reftype( $h ) eq "HASH";

and the method form of C&lt;isa&gt; for the second:

  $yes = Foo-&gt;isa("Bar");

=cut
</pre></body></html>