~ubuntu-branches/ubuntu/intrepid/perl-doc-html/intrepid

« back to all changes in this revision

Viewing changes to UNIVERSAL.html

  • Committer: Bazaar Package Importer
  • Author(s): Roberto C. Sanchez
  • Date: 2008-05-17 20:14:19 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20080517201419-qgbuogq2ckkdisyi
Tags: 5.10.0-2
Supersede botched upload of 5.10.0-1.

Show diffs side-by-side

added added

removed removed

Lines of Context:
54
54
      <h2>Links:</h2>
55
55
      <ul>
56
56
        <li><a href="http://search.cpan.org">CPAN</a></li>
 
57
        <li><a href="http://www.perl.org">Perl.org</a></li>
57
58
        <li><a href="http://www.perl.com">Perl.com</a></li>
58
 
        <li><a href="http://www.perl.org">Perl.org</a></li>
 
59
        <li><a href="http://perlbuzz.com">Perl Buzz</a></li>
 
60
        <li><a href="http://www.perlfoundation.org/perl5/index.cgi">Perl 5 Wiki</a></li>
 
61
        <li><a href="http://jobs.perl.org">Perl Jobs</a></li>
59
62
        <li><a href="http://www.pm.org">Perl Mongers</a></li>
60
63
        <li><a href="http://www.perlmonks.org">Perl Monks</a></li>
61
64
        <li><a href="http://planet.perl.org">Planet Perl</a></li>
65
68
      <ul>
66
69
        <li>Site maintained by<br><a href="http://perl.jonallen.info">Jon Allen</a>
67
70
            (<a href="http://perl.jonallen.info">JJ</a>)</li>
68
 
        <li class="spaced">Last updated on<br>23 April 2006</li>
 
71
        <li class="spaced">Last updated on<br>23 December 2007</li>
69
72
        <li class="spaced">See the <a href="http://perl.jonallen.info/projects/perldoc">project page</a> for
70
73
        more details</li>
71
74
      </ul>
76
79
    <div id="centerContent">
77
80
      <div id="contentHeader">
78
81
        <div id="contentHeaderLeft"><a href="#" onClick="showLeft()">Show navigation</a></div>
79
 
        <div id="contentHeaderCentre">-- Perl 5.8.8 documentation --</div>
 
82
        <div id="contentHeaderCentre">-- Perl 5.10.0 documentation --</div>
80
83
        <div id="contentHeaderRight"><a href="#" onClick="showRight()">Show toolbar</a></div>
81
84
      </div>
82
85
      <div id="breadCrumbs"><a href="index.html">Home</a> &gt; <a href="index-modules-A.html">Core modules</a> &gt; <a href="index-modules-U.html">U</a> &gt; UNIVERSAL</div>
84
87
      <div id="contentBody"><div class="title_container"><div class="page_title">UNIVERSAL</div></div><ul><li><a href="#NAME">NAME</a><li><a href="#SYNOPSIS">SYNOPSIS</a><li><a href="#DESCRIPTION">DESCRIPTION</a><li><a href="#EXPORTS">EXPORTS</a></ul><a name="NAME"></a><h1>NAME</h1>
85
88
<p>UNIVERSAL - base class for ALL classes (blessed references)</p>
86
89
<a name="SYNOPSIS"></a><h1>SYNOPSIS</h1>
87
 
<pre class="verbatim">    <span class="i">$is_io</span> = <span class="i">$fd</span><span class="i">-&gt;isa</span><span class="s">(</span><span class="q">&quot;IO::Handle&quot;</span><span class="s">)</span><span class="sc">;</span>
88
 
    <span class="i">$is_io</span> = Class-&gt;isa<span class="s">(</span><span class="q">&quot;IO::Handle&quot;</span><span class="s">)</span><span class="sc">;</span></pre>
89
 
<pre class="verbatim">    <span class="i">$sub</span> = <span class="i">$obj</span><span class="i">-&gt;can</span><span class="s">(</span><span class="q">&quot;print&quot;</span><span class="s">)</span><span class="sc">;</span>
90
 
    <span class="i">$sub</span> = Class-&gt;can<span class="s">(</span><span class="q">&quot;print&quot;</span><span class="s">)</span><span class="sc">;</span></pre>
91
 
<pre class="verbatim">    <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="UNIVERSAL.html">UNIVERSAL</a> <span class="q">qw( isa can VERSION )</span><span class="sc">;</span>
92
 
    <span class="i">$yes</span> = isa <span class="i">$ref</span><span class="cm">,</span> <span class="q">&quot;HASH&quot;</span> <span class="sc">;</span>
93
 
    <span class="i">$sub</span> = can <span class="i">$ref</span><span class="cm">,</span> <span class="q">&quot;fandango&quot;</span> <span class="sc">;</span>
94
 
    <span class="i">$ver</span> = VERSION <span class="i">$obj</span> <span class="sc">;</span></pre>
 
90
<pre class="verbatim">    <span class="i">$is_io</span>    = <span class="i">$fd</span><span class="i">-&gt;isa</span><span class="s">(</span><span class="q">&quot;IO::Handle&quot;</span><span class="s">)</span><span class="sc">;</span>
 
91
    <span class="i">$is_io</span>    = <span class="w">Class</span><span class="w">-&gt;isa</span><span class="s">(</span><span class="q">&quot;IO::Handle&quot;</span><span class="s">)</span><span class="sc">;</span></pre>
 
92
<pre class="verbatim">    <span class="i">$does_log</span> = <span class="i">$obj</span><span class="i">-&gt;DOES</span><span class="s">(</span><span class="q">&quot;Logger&quot;</span><span class="s">)</span><span class="sc">;</span>
 
93
    <span class="i">$does_log</span> = <span class="w">Class</span><span class="w">-&gt;DOES</span><span class="s">(</span><span class="q">&quot;Logger&quot;</span><span class="s">)</span><span class="sc">;</span></pre>
 
94
<pre class="verbatim">    <span class="i">$sub</span>      = <span class="i">$obj</span><span class="i">-&gt;can</span><span class="s">(</span><span class="q">&quot;print&quot;</span><span class="s">)</span><span class="sc">;</span>
 
95
    <span class="i">$sub</span>      = <span class="w">Class</span><span class="w">-&gt;can</span><span class="s">(</span><span class="q">&quot;print&quot;</span><span class="s">)</span><span class="sc">;</span></pre>
 
96
<pre class="verbatim">    <span class="i">$sub</span>      = <a class="l_k" href="functions/eval.html">eval</a> <span class="s">{</span> <span class="i">$ref</span><span class="i">-&gt;can</span><span class="s">(</span><span class="q">&quot;fandango&quot;</span><span class="s">)</span> <span class="s">}</span><span class="sc">;</span>
 
97
    <span class="i">$ver</span>      = <span class="i">$obj</span><span class="i">-&gt;VERSION</span><span class="sc">;</span></pre>
 
98
<pre class="verbatim">    <span class="c"># but never do this!</span>
 
99
    <span class="i">$is_io</span>    = <span class="i">UNIVERSAL::isa</span><span class="s">(</span><span class="i">$fd</span><span class="cm">,</span> <span class="q">&quot;IO::Handle&quot;</span><span class="s">)</span><span class="sc">;</span>
 
100
    <span class="i">$sub</span>      = <span class="i">UNIVERSAL::can</span><span class="s">(</span><span class="i">$obj</span><span class="cm">,</span> <span class="q">&quot;print&quot;</span><span class="s">)</span><span class="sc">;</span></pre>
95
101
<a name="DESCRIPTION"></a><h1>DESCRIPTION</h1>
96
 
<p><code class="inline"><a class="l_w" href="UNIVERSAL.html">UNIVERSAL</a></code> is the base class which all bless references will inherit from,
97
 
see <a href="perlobj.html">perlobj</a>.</p>
98
 
<p><code class="inline"><a class="l_w" href="UNIVERSAL.html">UNIVERSAL</a></code> provides the following methods and functions:</p>
 
102
<p><code class="inline"><span class="w">UNIVERSAL</span></code>
 
103
 is the base class from which all blessed references inherit.
 
104
See <a href="perlobj.html">perlobj</a>.</p>
 
105
<p><code class="inline"><span class="w">UNIVERSAL</span></code>
 
106
 provides the following methods:</p>
99
107
<ul>
100
 
<li><a name="'%24obj-%3eisa(-TYPE-)'"></a><b><code class="inline"><span class="i">$obj</span><span class="i">-&gt;isa</span><span class="s">(</span> TYPE <span class="s">)</span></code>
101
 
</b>
102
 
</li>
103
 
<li><a name="'CLASS-%3eisa(-TYPE-)'"></a><b><code class="inline">CLASS-&gt;isa<span class="s">(</span> TYPE <span class="s">)</span></code>
104
 
 </b>
105
 
</li>
106
 
<li><a name="'isa(-VAL%2c-TYPE-)'"></a><b><code class="inline"><span class="i">isa</span><span class="s">(</span> VAL<span class="cm">,</span> TYPE <span class="s">)</span></code>
 
108
<li><a name="'%24obj-%3eisa(-TYPE-)'"></a><b><code class="inline"><span class="i">$obj</span><span class="i">-&gt;isa</span><span class="s">(</span> <span class="w">TYPE</span> <span class="s">)</span></code>
 
109
</b>
 
110
</li>
 
111
<li><a name="'CLASS-%3eisa(-TYPE-)'"></a><b><code class="inline"><span class="w">CLASS</span><span class="w">-&gt;isa</span><span class="s">(</span> <span class="w">TYPE</span> <span class="s">)</span></code>
 
112
</b>
 
113
</li>
 
114
<li><a name="'eval-%7b-VAL-%3eisa(-TYPE-)-%7d'"></a><b><code class="inline"><a class="l_k" href="functions/eval.html">eval</a> <span class="s">{</span> <span class="w">VAL</span><span class="w">-&gt;isa</span><span class="s">(</span> <span class="w">TYPE</span> <span class="s">)</span> <span class="s">}</span></code>
107
115
</b>
108
116
<p>Where</p>
109
117
<ul>
110
 
<li><a name="'TYPE'"></a><b><code class="inline">TYPE</code>
 
118
<li><a name="'TYPE'"></a><b><code class="inline"><span class="w">TYPE</span></code>
111
119
</b>
112
120
<p>is a package name</p>
113
121
</li>
115
123
</b>
116
124
<p>is a blessed reference or a string containing a package name</p>
117
125
</li>
118
 
<li><a name="'CLASS'"></a><b><code class="inline">CLASS</code>
 
126
<li><a name="'CLASS'"></a><b><code class="inline"><span class="w">CLASS</span></code>
119
127
</b>
120
128
<p>is a package name</p>
121
129
</li>
122
 
<li><a name="'VAL'"></a><b><code class="inline">VAL</code>
 
130
<li><a name="'VAL'"></a><b><code class="inline"><span class="w">VAL</span></code>
123
131
</b>
124
132
<p>is any of the above or an unblessed reference</p>
125
133
</li>
126
134
</ul>
127
 
<p>When used as an instance or class method (<code class="inline"><span class="i">$obj</span><span class="i">-&gt;isa</span><span class="s">(</span> TYPE <span class="s">)</span></code>
 
135
<p>When used as an instance or class method (<code class="inline"><span class="i">$obj</span><span class="i">-&gt;isa</span><span class="s">(</span> <span class="w">TYPE</span> <span class="s">)</span></code>
128
136
),
129
 
<code class="inline">isa</code>
130
 
 returns <i>true</i> if $obj is blessed into package <code class="inline">TYPE</code>
 
137
<code class="inline"><span class="w">isa</span></code>
 
138
 returns <i>true</i> if $obj is blessed into package <code class="inline"><span class="w">TYPE</span></code>
131
139
 or
132
 
inherits from package <code class="inline">TYPE</code>
 
140
inherits from package <code class="inline"><span class="w">TYPE</span></code>
133
141
.</p>
134
 
<p>When used as a class method (<code class="inline">CLASS-&gt;isa<span class="s">(</span> TYPE <span class="s">)</span></code>
135
 
: sometimes
136
 
referred to as a static method), <code class="inline">isa</code>
137
 
 returns <i>true</i> if <code class="inline">CLASS</code>
 
142
<p>When used as a class method (<code class="inline"><span class="w">CLASS</span><span class="w">-&gt;isa</span><span class="s">(</span> <span class="w">TYPE</span> <span class="s">)</span></code>
 
143
, sometimes
 
144
referred to as a static method), <code class="inline"><span class="w">isa</span></code>
 
145
 returns <i>true</i> if <code class="inline"><span class="w">CLASS</span></code>
138
146
 
139
 
inherits from (or is itself) the name of the package <code class="inline">TYPE</code>
 
147
inherits from (or is itself) the name of the package <code class="inline"><span class="w">TYPE</span></code>
140
148
 or
141
 
inherits from package <code class="inline">TYPE</code>
 
149
inherits from package <code class="inline"><span class="w">TYPE</span></code>
142
150
.</p>
143
 
<p>When used as a function, like</p>
144
 
<pre class="verbatim">   <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="UNIVERSAL.html">UNIVERSAL</a> <span class="q">qw( isa )</span> <span class="sc">;</span>
145
 
   <span class="i">$yes</span> = isa <span class="i">$h</span><span class="cm">,</span> <span class="q">&quot;HASH&quot;</span><span class="sc">;</span>
146
 
   <span class="i">$yes</span> = isa <span class="q">&quot;Foo&quot;</span><span class="cm">,</span> <span class="q">&quot;Bar&quot;</span><span class="sc">;</span></pre>
147
 
<p>or</p>
148
 
<pre class="verbatim">   <a class="l_k" href="functions/require.html">require</a> <a class="l_w" href="UNIVERSAL.html">UNIVERSAL</a> <span class="sc">;</span>
149
 
   <span class="i">$yes</span> = UNIVERSAL::isa <span class="i">$a</span><span class="cm">,</span> <span class="q">&quot;ARRAY&quot;</span><span class="sc">;</span></pre>
150
 
<p><code class="inline">isa</code>
151
 
 returns <i>true</i> in the same cases as above and also if <code class="inline">VAL</code>
152
 
 is an
153
 
unblessed reference to a perl variable of type <code class="inline">TYPE</code>
154
 
, such as "HASH",
155
 
"ARRAY", or "Regexp".</p>
156
 
</li>
157
 
<li><a name="'%24obj-%3ecan(-METHOD-)'"></a><b><code class="inline"><span class="i">$obj</span><span class="i">-&gt;can</span><span class="s">(</span> METHOD <span class="s">)</span></code>
158
 
</b>
159
 
</li>
160
 
<li><a name="'CLASS-%3ecan(-METHOD-)'"></a><b><code class="inline">CLASS-&gt;can<span class="s">(</span> METHOD <span class="s">)</span></code>
161
 
</b>
162
 
</li>
163
 
<li><a name="'can(-VAL%2c-METHOD-)'"></a><b><code class="inline"><span class="i">can</span><span class="s">(</span> VAL<span class="cm">,</span> METHOD <span class="s">)</span></code>
164
 
</b>
165
 
<p><code class="inline">can</code>
166
 
 checks if the object or class has a method called <code class="inline">METHOD</code>
167
 
. If it does
168
 
then a reference to the sub is returned. If it does not then <i>undef</i> is
169
 
returned.  This includes methods inherited or imported by <code class="inline"><span class="i">$obj</span></code>
170
 
, <code class="inline">CLASS</code>
 
151
<p>If you're not sure what you have (the <code class="inline"><span class="w">VAL</span></code>
 
152
 case), wrap the method call in an
 
153
<code class="inline"><a class="l_k" href="functions/eval.html">eval</a></code> block to catch the exception if <code class="inline"><span class="w">VAL</span></code>
 
154
 is undefined.</p>
 
155
<p>If you want to be sure that you're calling <code class="inline"><span class="w">isa</span></code>
 
156
 as a method, not a class,
 
157
check the invocant with <code class="inline"><span class="w">blessed</span></code>
 
158
 from <a href="Scalar/Util.html">Scalar::Util</a> first:</p>
 
159
<pre class="verbatim">  <a class="l_k" href="functions/use.html">use</a> <span class="w">Scalar::Util</span> <span class="q">'blessed'</span><span class="sc">;</span></pre>
 
160
<pre class="verbatim">  if ( blessed( $obj ) &amp;&amp; $obj-&gt;isa("Some::Class") {
 
161
      ...
 
162
  }</pre></li>
 
163
<li><a name="'%24obj-%3eDOES(-ROLE-)'"></a><b><code class="inline"><span class="i">$obj</span><span class="i">-&gt;DOES</span><span class="s">(</span> <span class="w">ROLE</span> <span class="s">)</span></code>
 
164
</b>
 
165
</li>
 
166
<li><a name="'CLASS-%3eDOES(-ROLE-)'"></a><b><code class="inline"><span class="w">CLASS</span><span class="w">-&gt;DOES</span><span class="s">(</span> <span class="w">ROLE</span> <span class="s">)</span></code>
 
167
</b>
 
168
<p><code class="inline"><span class="w">DOES</span></code>
 
169
 checks if the object or class performs the role <code class="inline"><span class="w">ROLE</span></code>
 
170
.  A role is a
 
171
named group of specific behavior (often methods of particular names and
 
172
signatures), similar to a class, but not necessarily a complete class by
 
173
itself.  For example, logging or serialization may be roles.</p>
 
174
<p><code class="inline"><span class="w">DOES</span></code>
 
175
 and <code class="inline"><span class="w">isa</span></code>
 
176
 are similar, in that if either is true, you know that the
 
177
object or class on which you call the method can perform specific behavior.
 
178
However, <code class="inline"><span class="w">DOES</span></code>
 
179
 is different from <code class="inline"><span class="w">isa</span></code>
 
180
 in that it does not care <i>how</i> the
 
181
invocant performs the operations, merely that it does.  (<code class="inline"><span class="w">isa</span></code>
 
182
 of course
 
183
mandates an inheritance relationship.  Other relationships include aggregation,
 
184
delegation, and mocking.)</p>
 
185
<p>By default, classes in Perl only perform the <code class="inline"><span class="w">UNIVERSAL</span></code>
 
186
 role.  To mark that
 
187
your own classes perform other roles, override <code class="inline"><span class="w">DOES</span></code>
 
188
 appropriately.</p>
 
189
<p>There is a relationship between roles and classes, as each class implies the
 
190
existence of a role of the same name.  There is also a relationship between
 
191
inheritance and roles, in that a subclass that inherits from an ancestor class
 
192
implicitly performs any roles its parent performs.  Thus you can use <code class="inline"><span class="w">DOES</span></code>
 
193
 in
 
194
place of <code class="inline"><span class="w">isa</span></code>
 
195
 safely, as it will return true in all places where <code class="inline"><span class="w">isa</span></code>
 
196
 will
 
197
return true (provided that any overridden <code class="inline"><span class="w">DOES</span></code>
 
198
 <i>and</i> <code class="inline"><span class="w">isa</span></code>
 
199
 methods behave
 
200
appropriately).</p>
 
201
</li>
 
202
<li><a name="'%24obj-%3ecan(-METHOD-)'"></a><b><code class="inline"><span class="i">$obj</span><span class="i">-&gt;can</span><span class="s">(</span> <span class="w">METHOD</span> <span class="s">)</span></code>
 
203
</b>
 
204
</li>
 
205
<li><a name="'CLASS-%3ecan(-METHOD-)'"></a><b><code class="inline"><span class="w">CLASS</span><span class="w">-&gt;can</span><span class="s">(</span> <span class="w">METHOD</span> <span class="s">)</span></code>
 
206
</b>
 
207
</li>
 
208
<li><a name="'eval-%7b-VAL-%3ecan(-METHOD-)-%7d'"></a><b><code class="inline"><a class="l_k" href="functions/eval.html">eval</a> <span class="s">{</span> <span class="w">VAL</span><span class="w">-&gt;can</span><span class="s">(</span> <span class="w">METHOD</span> <span class="s">)</span> <span class="s">}</span></code>
 
209
</b>
 
210
<p><code class="inline"><span class="w">can</span></code>
 
211
 checks if the object or class has a method called <code class="inline"><span class="w">METHOD</span></code>
 
212
. If it does,
 
213
then it returns a reference to the sub.  If it does not, then it returns
 
214
<i>undef</i>.  This includes methods inherited or imported by <code class="inline"><span class="i">$obj</span></code>
 
215
, <code class="inline"><span class="w">CLASS</span></code>
171
216
, or
172
 
<code class="inline">VAL</code>
 
217
<code class="inline"><span class="w">VAL</span></code>
173
218
.</p>
174
 
<p><code class="inline">can</code>
175
 
 cannot know whether an object will be able to provide a method
176
 
through AUTOLOAD, so a return value of <i>undef</i> does not necessarily mean
177
 
the object will not be able to handle the method call. To get around
178
 
this some module authors use a forward declaration (see <a href="perlsub.html">perlsub</a>)
179
 
for methods they will handle via AUTOLOAD. For such 'dummy' subs, <code class="inline">can</code>
180
 
 
181
 
will still return a code reference, which, when called, will fall through
182
 
to the AUTOLOAD. If no suitable AUTOLOAD is provided, calling the coderef
183
 
will cause an error.</p>
184
 
<p><code class="inline">can</code>
185
 
 can be called as a class (static) method, an object method, or a
186
 
function.</p>
187
 
<p>When used as a function, if <code class="inline">VAL</code>
188
 
 is a blessed reference or package name which
189
 
has a method called <code class="inline">METHOD</code>
190
 
, <code class="inline">can</code>
191
 
 returns a reference to the subroutine.
192
 
If <code class="inline">VAL</code>
193
 
 is not a blessed reference, or if it does not have a method
194
 
<code class="inline">METHOD</code>
195
 
, <i>undef</i> is returned.</p>
 
219
<p><code class="inline"><span class="w">can</span></code>
 
220
 cannot know whether an object will be able to provide a method through
 
221
AUTOLOAD (unless the object's class has overriden <code class="inline"><span class="w">can</span></code>
 
222
 appropriately), so a
 
223
return value of <i>undef</i> does not necessarily mean the object will not be able
 
224
to handle the method call. To get around this some module authors use a forward
 
225
declaration (see <a href="perlsub.html">perlsub</a>) for methods they will handle via AUTOLOAD. For
 
226
such 'dummy' subs, <code class="inline"><span class="w">can</span></code>
 
227
 will still return a code reference, which, when
 
228
called, will fall through to the AUTOLOAD. If no suitable AUTOLOAD is provided,
 
229
calling the coderef will cause an error.</p>
 
230
<p>You may call <code class="inline"><span class="w">can</span></code>
 
231
 as a class (static) method or an object method.</p>
 
232
<p>Again, the same rule about having a valid invocant applies -- use an <code class="inline"><a class="l_k" href="functions/eval.html">eval</a></code>
 
233
block or <code class="inline"><span class="w">blessed</span></code>
 
234
 if you need to be extra paranoid.</p>
196
235
</li>
197
 
<li><a name="'VERSION-(-%5b-REQUIRE-%5d-)'"></a><b><code class="inline">VERSION <span class="s">(</span> <span class="s">[</span> REQUIRE <span class="s">]</span> <span class="s">)</span></code>
 
236
<li><a name="'VERSION-(-%5b-REQUIRE-%5d-)'"></a><b><code class="inline"><span class="w">VERSION</span> <span class="s">(</span> <span class="s">[</span> <span class="w">REQUIRE</span> <span class="s">]</span> <span class="s">)</span></code>
198
237
</b>
199
 
<p><code class="inline">VERSION</code>
 
238
<p><code class="inline"><span class="w">VERSION</span></code>
200
239
 will return the value of the variable <code class="inline"><span class="i">$VERSION</span></code>
201
240
 in the
202
 
package the object is blessed into. If <code class="inline">REQUIRE</code>
 
241
package the object is blessed into. If <code class="inline"><span class="w">REQUIRE</span></code>
203
242
 is given then
204
243
it will do a comparison and die if the package version is not
205
 
greater than or equal to <code class="inline">REQUIRE</code>
 
244
greater than or equal to <code class="inline"><span class="w">REQUIRE</span></code>
206
245
.</p>
207
 
<p><code class="inline">VERSION</code>
208
 
 can be called as either a class (static) method, an object
209
 
method or a function.</p>
 
246
<p><code class="inline"><span class="w">VERSION</span></code>
 
247
 can be called as either a class (static) method or an object
 
248
method.</p>
210
249
</li>
211
250
</ul>
212
251
<a name="EXPORTS"></a><h1>EXPORTS</h1>
213
252
<p>None by default.</p>
214
 
<p>You may request the import of all three functions (<code class="inline">isa</code>
215
 
, <code class="inline">can</code>
216
 
, and
217
 
<code class="inline">VERSION</code>
218
 
), however it isn't usually necessary to do so.  Perl magically
219
 
makes these functions act as methods on all objects.  The one exception is
220
 
<code class="inline">isa</code>
221
 
, which is useful as a function when operating on non-blessed
222
 
references.</p>
 
253
<p>You may request the import of three functions (<code class="inline"><span class="w">isa</span></code>
 
254
, <code class="inline"><span class="w">can</span></code>
 
255
, and <code class="inline"><span class="w">VERSION</span></code>
 
256
),
 
257
however it is usually harmful to do so.  Please don't do this in new code.</p>
 
258
<p>For example, previous versions of this documentation suggested using <code class="inline"><span class="w">isa</span></code>
 
259
 as
 
260
a function to determine the type of a reference:</p>
 
261
<pre class="verbatim">  <a class="l_k" href="functions/use.html">use</a> <span class="w">UNIVERSAL</span> <span class="q">'isa'</span><span class="sc">;</span></pre>
 
262
<pre class="verbatim">  <span class="i">$yes</span> = <span class="w">isa</span> <span class="i">$h</span><span class="cm">,</span> <span class="q">&quot;HASH&quot;</span><span class="sc">;</span>
 
263
  <span class="i">$yes</span> = <span class="w">isa</span> <span class="q">&quot;Foo&quot;</span><span class="cm">,</span> <span class="q">&quot;Bar&quot;</span><span class="sc">;</span></pre>
 
264
<p>The problem is that this code will <i>never</i> call an overridden <code class="inline"><span class="w">isa</span></code>
 
265
 method in
 
266
any class.  Instead, use <code class="inline"><span class="w">reftype</span></code>
 
267
 from <a href="Scalar/Util.html">Scalar::Util</a> for the first case:</p>
 
268
<pre class="verbatim">  <a class="l_k" href="functions/use.html">use</a> <span class="w">Scalar::Util</span> <span class="q">'reftype'</span><span class="sc">;</span></pre>
 
269
<pre class="verbatim">  <span class="i">$yes</span> = <span class="i">reftype</span><span class="s">(</span> <span class="i">$h</span> <span class="s">)</span> eq <span class="q">&quot;HASH&quot;</span><span class="sc">;</span></pre>
 
270
<p>and the method form of <code class="inline"><span class="w">isa</span></code>
 
271
 for the second:</p>
 
272
<pre class="verbatim">  <span class="i">$yes</span> = <span class="w">Foo</span><span class="w">-&gt;isa</span><span class="s">(</span><span class="q">&quot;Bar&quot;</span><span class="s">)</span><span class="sc">;</span></pre>
223
273
</div>
224
274
      <div id="contentFooter"><a href="http://www.perl.org"><img src="perlpowered.png" border=0></a></div>
225
275
    </div>
237
287
          <!--<select name="r"><option value="1" selected>Go to top result<option value="0">Show results list</select>-->
238
288
        </form>
239
289
      </p>
 
290
      <script language="JavaScript" type="text/javascript" src="/perl-version.js"></script>
240
291
      <h2>Labels:</h2>
241
292
      <p>
242
293
        <a href="#" onClick="addLabel('UNIVERSAL','UNIVERSAL.html')">Add this page</a>