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">->isa</span><span class="s">(</span><span class="q">"IO::Handle"</span><span class="s">)</span><span class="sc">;</span>
88
<span class="i">$is_io</span> = Class->isa<span class="s">(</span><span class="q">"IO::Handle"</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">->can</span><span class="s">(</span><span class="q">"print"</span><span class="s">)</span><span class="sc">;</span>
90
<span class="i">$sub</span> = Class->can<span class="s">(</span><span class="q">"print"</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">"HASH"</span> <span class="sc">;</span>
93
<span class="i">$sub</span> = can <span class="i">$ref</span><span class="cm">,</span> <span class="q">"fandango"</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">->isa</span><span class="s">(</span><span class="q">"IO::Handle"</span><span class="s">)</span><span class="sc">;</span>
91
<span class="i">$is_io</span> = <span class="w">Class</span><span class="w">->isa</span><span class="s">(</span><span class="q">"IO::Handle"</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">->DOES</span><span class="s">(</span><span class="q">"Logger"</span><span class="s">)</span><span class="sc">;</span>
93
<span class="i">$does_log</span> = <span class="w">Class</span><span class="w">->DOES</span><span class="s">(</span><span class="q">"Logger"</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">->can</span><span class="s">(</span><span class="q">"print"</span><span class="s">)</span><span class="sc">;</span>
95
<span class="i">$sub</span> = <span class="w">Class</span><span class="w">->can</span><span class="s">(</span><span class="q">"print"</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">->can</span><span class="s">(</span><span class="q">"fandango"</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">->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">"IO::Handle"</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">"print"</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>
100
<li><a name="'%24obj-%3eisa(-TYPE-)'"></a><b><code class="inline"><span class="i">$obj</span><span class="i">->isa</span><span class="s">(</span> TYPE <span class="s">)</span></code>
103
<li><a name="'CLASS-%3eisa(-TYPE-)'"></a><b><code class="inline">CLASS->isa<span class="s">(</span> TYPE <span class="s">)</span></code>
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">->isa</span><span class="s">(</span> <span class="w">TYPE</span> <span class="s">)</span></code>
111
<li><a name="'CLASS-%3eisa(-TYPE-)'"></a><b><code class="inline"><span class="w">CLASS</span><span class="w">->isa</span><span class="s">(</span> <span class="w">TYPE</span> <span class="s">)</span></code>
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">->isa</span><span class="s">(</span> <span class="w">TYPE</span> <span class="s">)</span> <span class="s">}</span></code>
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>
112
120
<p>is a package name</p>
116
124
<p>is a blessed reference or a string containing a package name</p>
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>
120
128
<p>is a package name</p>
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>
124
132
<p>is any of the above or an unblessed reference</p>
127
<p>When used as an instance or class method (<code class="inline"><span class="i">$obj</span><span class="i">->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">->isa</span><span class="s">(</span> <span class="w">TYPE</span> <span class="s">)</span></code>
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>
132
inherits from package <code class="inline">TYPE</code>
140
inherits from package <code class="inline"><span class="w">TYPE</span></code>
134
<p>When used as a class method (<code class="inline">CLASS->isa<span class="s">(</span> TYPE <span class="s">)</span></code>
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">->isa</span><span class="s">(</span> <span class="w">TYPE</span> <span class="s">)</span></code>
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>
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>
141
inherits from package <code class="inline">TYPE</code>
149
inherits from package <code class="inline"><span class="w">TYPE</span></code>
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">"HASH"</span><span class="sc">;</span>
146
<span class="i">$yes</span> = isa <span class="q">"Foo"</span><span class="cm">,</span> <span class="q">"Bar"</span><span class="sc">;</span></pre>
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">"ARRAY"</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>
153
unblessed reference to a perl variable of type <code class="inline">TYPE</code>
155
"ARRAY", or "Regexp".</p>
157
<li><a name="'%24obj-%3ecan(-METHOD-)'"></a><b><code class="inline"><span class="i">$obj</span><span class="i">->can</span><span class="s">(</span> METHOD <span class="s">)</span></code>
160
<li><a name="'CLASS-%3ecan(-METHOD-)'"></a><b><code class="inline">CLASS->can<span class="s">(</span> METHOD <span class="s">)</span></code>
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>
165
<p><code class="inline">can</code>
166
checks if the object or class has a method called <code class="inline">METHOD</code>
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>
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 ) && $obj->isa("Some::Class") {
163
<li><a name="'%24obj-%3eDOES(-ROLE-)'"></a><b><code class="inline"><span class="i">$obj</span><span class="i">->DOES</span><span class="s">(</span> <span class="w">ROLE</span> <span class="s">)</span></code>
166
<li><a name="'CLASS-%3eDOES(-ROLE-)'"></a><b><code class="inline"><span class="w">CLASS</span><span class="w">->DOES</span><span class="s">(</span> <span class="w">ROLE</span> <span class="s">)</span></code>
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>
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>
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>
187
your own classes perform other roles, override <code class="inline"><span class="w">DOES</span></code>
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>
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>
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>
202
<li><a name="'%24obj-%3ecan(-METHOD-)'"></a><b><code class="inline"><span class="i">$obj</span><span class="i">->can</span><span class="s">(</span> <span class="w">METHOD</span> <span class="s">)</span></code>
205
<li><a name="'CLASS-%3ecan(-METHOD-)'"></a><b><code class="inline"><span class="w">CLASS</span><span class="w">->can</span><span class="s">(</span> <span class="w">METHOD</span> <span class="s">)</span></code>
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">->can</span><span class="s">(</span> <span class="w">METHOD</span> <span class="s">)</span> <span class="s">}</span></code>
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>
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>
172
<code class="inline">VAL</code>
217
<code class="inline"><span class="w">VAL</span></code>
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>
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
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>
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>
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>
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>
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>
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>
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
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>
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
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>
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>
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">"HASH"</span><span class="sc">;</span>
263
<span class="i">$yes</span> = <span class="w">isa</span> <span class="q">"Foo"</span><span class="cm">,</span> <span class="q">"Bar"</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>
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">"HASH"</span><span class="sc">;</span></pre>
270
<p>and the method form of <code class="inline"><span class="w">isa</span></code>
272
<pre class="verbatim"> <span class="i">$yes</span> = <span class="w">Foo</span><span class="w">->isa</span><span class="s">(</span><span class="q">"Bar"</span><span class="s">)</span><span class="sc">;</span></pre>
224
274
<div id="contentFooter"><a href="http://www.perl.org"><img src="perlpowered.png" border=0></a></div>