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

« back to all changes in this revision

Viewing changes to perlboot.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-tutorials.html">Tutorials</a> &gt; perlboot</div>
102
105
      <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a Horse goes neigh!\n&quot;</span><span class="sc">;</span>
103
106
    <span class="s">}</span>
104
107
<a name="Sheep::speak"></a>    sub <span class="m">Sheep::speak</span> <span class="s">{</span>
105
 
      <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a Sheep goes baaaah!\n&quot;</span>
 
108
      <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a Sheep goes baaaah!\n&quot;</span><span class="sc">;</span>
106
109
    <span class="s">}</span></pre>
107
 
<pre class="verbatim">    Cow::speak<span class="sc">;</span>
108
 
    Horse::speak<span class="sc">;</span>
109
 
    Sheep::speak<span class="sc">;</span></pre>
 
110
<pre class="verbatim">    <span class="w">Cow::speak</span><span class="sc">;</span>
 
111
    <span class="w">Horse::speak</span><span class="sc">;</span>
 
112
    <span class="w">Sheep::speak</span><span class="sc">;</span></pre>
110
113
<p>This results in:</p>
111
 
<pre class="verbatim">    a Cow goes moooo!
112
 
    a Horse goes neigh!
113
 
    a Sheep goes baaaah!</pre>
 
114
<pre class="verbatim">    <span class="w">a</span> <span class="w">Cow</span> <span class="w">goes</span> <span class="w">moooo</span>!
 
115
    <span class="w">a</span> <span class="w">Horse</span> <span class="w">goes</span> <span class="w">neigh</span>!
 
116
    <span class="w">a</span> <span class="w">Sheep</span> <span class="w">goes</span> <span class="w">baaaah</span>!</pre>
114
117
<p>Nothing spectacular here.  Simple subroutines, albeit from separate
115
118
packages, and called using the full package name.  So let's create
116
119
an entire pasture:</p>
120
123
      <span class="i">&amp;</span>{<span class="i">$animal</span>.<span class="q">&quot;::speak&quot;</span>}<span class="sc">;</span>
121
124
    <span class="s">}</span></pre>
122
125
<p>This results in:</p>
123
 
<pre class="verbatim">    a Cow goes moooo!
124
 
    a Cow goes moooo!
125
 
    a Horse goes neigh!
126
 
    a Sheep goes baaaah!
127
 
    a Sheep goes baaaah!</pre>
 
126
<pre class="verbatim">    <span class="w">a</span> <span class="w">Cow</span> <span class="w">goes</span> <span class="w">moooo</span>!
 
127
    <span class="w">a</span> <span class="w">Cow</span> <span class="w">goes</span> <span class="w">moooo</span>!
 
128
    <span class="w">a</span> <span class="w">Horse</span> <span class="w">goes</span> <span class="w">neigh</span>!
 
129
    <span class="w">a</span> <span class="w">Sheep</span> <span class="w">goes</span> <span class="w">baaaah</span>!
 
130
    <span class="w">a</span> <span class="w">Sheep</span> <span class="w">goes</span> <span class="w">baaaah</span>!</pre>
128
131
<p>Wow.  That symbolic coderef de-referencing there is pretty nasty.
129
 
We're counting on <code class="inline"><a class="l_k" href="functions/no.html">no</a> <a class="l_w" href="strict.html">strict</a> <a class="l_w" href="subs.html">subs</a></code>
 
132
We're counting on <code class="inline"><a class="l_k" href="functions/no.html">no</a> <span class="w">strict</span> <span class="w">subs</span></code>
130
133
 mode, certainly not recommended
131
134
for larger programs.  And why was that necessary?  Because the name of
132
135
the package seems to be inseparable from the name of the subroutine we
133
136
want to invoke within that package.</p>
134
137
<p>Or is it?</p>
135
138
<a name="Introducing-the-method-invocation-arrow"></a><h2>Introducing the method invocation arrow</h2>
136
 
<p>For now, let's say that <code class="inline">Class-&gt;method</code>
 
139
<p>For now, let's say that <code class="inline"><span class="w">Class</span><span class="w">-&gt;method</span></code>
137
140
 invokes subroutine
138
 
<code class="inline">method</code>
139
 
 in package <code class="inline">Class</code>
 
141
<code class="inline"><span class="w">method</span></code>
 
142
 in package <code class="inline"><span class="w">Class</span></code>
140
143
.  (Here, "Class" is used in its
141
144
"category" meaning, not its "scholastic" meaning.) That's not
142
145
completely accurate, but we'll do this one step at a time.  Now let's
143
146
use it like so:</p>
144
147
<pre class="verbatim">    <span class="c"># Cow::speak, Horse::speak, Sheep::speak as before</span>
145
 
    Cow-&gt;speak<span class="sc">;</span>
146
 
    Horse-&gt;speak<span class="sc">;</span>
147
 
    Sheep-&gt;speak<span class="sc">;</span></pre>
 
148
    <span class="w">Cow</span><span class="w">-&gt;speak</span><span class="sc">;</span>
 
149
    <span class="w">Horse</span><span class="w">-&gt;speak</span><span class="sc">;</span>
 
150
    <span class="w">Sheep</span><span class="w">-&gt;speak</span><span class="sc">;</span></pre>
148
151
<p>And once again, this results in:</p>
149
 
<pre class="verbatim">    a Cow goes moooo!
150
 
    a Horse goes neigh!
151
 
    a Sheep goes baaaah!</pre>
 
152
<pre class="verbatim">    <span class="w">a</span> <span class="w">Cow</span> <span class="w">goes</span> <span class="w">moooo</span>!
 
153
    <span class="w">a</span> <span class="w">Horse</span> <span class="w">goes</span> <span class="w">neigh</span>!
 
154
    <span class="w">a</span> <span class="w">Sheep</span> <span class="w">goes</span> <span class="w">baaaah</span>!</pre>
152
155
<p>That's not fun yet.  Same number of characters, all constant, no
153
156
variables.  But yet, the parts are separable now.  Watch:</p>
154
157
<pre class="verbatim">    <span class="i">$a</span> = <span class="q">&quot;Cow&quot;</span><span class="sc">;</span>
155
158
    <span class="i">$a</span><span class="i">-&gt;speak</span><span class="sc">;</span> <span class="c"># invokes Cow-&gt;speak</span></pre>
156
159
<p>Ahh!  Now that the package name has been parted from the subroutine
157
160
name, we can use a variable package name.  And this time, we've got
158
 
something that works even when <code class="inline"><a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a> refs</code>
 
161
something that works even when <code class="inline"><a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span> <span class="w">refs</span></code>
159
162
 is enabled.</p>
160
163
<a name="Invoking-a-barnyard"></a><h2>Invoking a barnyard</h2>
161
164
<p>Let's take that new arrow invocation and put it back in the barnyard
167
170
      <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a Horse goes neigh!\n&quot;</span><span class="sc">;</span>
168
171
    <span class="s">}</span>
169
172
<a name="Sheep::speak"></a>    sub <span class="m">Sheep::speak</span> <span class="s">{</span>
170
 
      <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a Sheep goes baaaah!\n&quot;</span>
 
173
      <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a Sheep goes baaaah!\n&quot;</span><span class="sc">;</span>
171
174
    <span class="s">}</span></pre>
172
175
<pre class="verbatim">    <span class="i">@pasture</span> = <span class="q">qw(Cow Cow Horse Sheep Sheep)</span><span class="sc">;</span>
173
176
    foreach <span class="i">$animal</span> <span class="s">(</span><span class="i">@pasture</span><span class="s">)</span> <span class="s">{</span>
175
178
    <span class="s">}</span></pre>
176
179
<p>There!  Now we have the animals all talking, and safely at that,
177
180
without the use of symbolic coderefs.</p>
178
 
<p>But look at all that common code.  Each of the <code class="inline">speak</code>
 
181
<p>But look at all that common code.  Each of the <code class="inline"><span class="w">speak</span></code>
179
182
 routines has a
180
183
similar structure: a <code class="inline"><a class="l_k" href="functions/print.html">print</a></code> operator and a string that contains
181
184
common text, except for two of the words.  It'd be nice if we could
182
185
factor out the commonality, in case we decide later to change it all
183
 
to <code class="inline">says</code>
184
 
 instead of <code class="inline">goes</code>
 
186
to <code class="inline"><span class="w">says</span></code>
 
187
 instead of <code class="inline"><span class="w">goes</span></code>
185
188
.</p>
186
189
<p>And we actually have a way of doing that without much fuss, but we
187
190
have to hear a bit more about what the method invocation arrow is
188
191
actually doing for us.</p>
189
192
<a name="The-extra-parameter-of-method-invocation"></a><h2>The extra parameter of method invocation</h2>
190
193
<p>The invocation of:</p>
191
 
<pre class="verbatim">    Class-&gt;method<span class="s">(</span><span class="i">@args</span><span class="s">)</span></pre>
192
 
<p>attempts to invoke subroutine <code class="inline">Class::method</code>
 
194
<pre class="verbatim">    <span class="w">Class</span><span class="w">-&gt;method</span><span class="s">(</span><span class="i">@args</span><span class="s">)</span></pre>
 
195
<p>attempts to invoke subroutine <code class="inline"><span class="w">Class::method</span></code>
193
196
 as:</p>
194
197
<pre class="verbatim">    <span class="i">Class::method</span><span class="s">(</span><span class="q">&quot;Class&quot;</span><span class="cm">,</span> <span class="i">@args</span><span class="s">)</span><span class="sc">;</span></pre>
195
198
<p>(If the subroutine can't be found, "inheritance" kicks in, but we'll
196
199
get to that later.)  This means that we get the class name as the
197
200
first parameter (the only parameter, if no arguments are given).  So
198
 
we can rewrite the <code class="inline">Sheep</code>
 
201
we can rewrite the <code class="inline"><span class="w">Sheep</span></code>
199
202
 speaking subroutine as:</p>
200
203
<pre class="verbatim"><a name="Sheep::speak"></a>    sub <span class="m">Sheep::speak</span> <span class="s">{</span>
201
204
      <a class="l_k" href="functions/my.html">my</a> <span class="i">$class</span> = <a class="l_k" href="functions/shift.html">shift</a><span class="sc">;</span>
216
219
we factor that out even further?  Yes, by calling another method in
217
220
the same class.</p>
218
221
<a name="Calling-a-second-method-to-simplify-things"></a><h2>Calling a second method to simplify things</h2>
219
 
<p>Let's call out from <code class="inline">speak</code>
220
 
 to a helper method called <code class="inline">sound</code>
 
222
<p>Let's call out from <code class="inline"><span class="w">speak</span></code>
 
223
 to a helper method called <code class="inline"><span class="w">sound</span></code>
221
224
.
222
225
This method provides the constant text for the sound itself.</p>
223
226
<pre class="verbatim"><a name="package-Cow"></a>    <span class="s">{</span> package <span class="i">Cow</span><span class="sc">;</span>
224
227
<a name="sound"></a>      sub <span class="m">sound</span> <span class="s">{</span> <span class="q">&quot;moooo&quot;</span> <span class="s">}</span>
225
228
<a name="speak"></a>      sub <span class="m">speak</span> <span class="s">{</span>
226
229
        <a class="l_k" href="functions/my.html">my</a> <span class="i">$class</span> = <a class="l_k" href="functions/shift.html">shift</a><span class="sc">;</span>
227
 
        <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a $class goes &quot;</span><span class="cm">,</span> <span class="i">$class</span><span class="i">-&gt;sound</span><span class="cm">,</span> <span class="q">&quot;!\n&quot;</span>
 
230
        <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a $class goes &quot;</span><span class="cm">,</span> <span class="i">$class</span><span class="i">-&gt;sound</span><span class="cm">,</span> <span class="q">&quot;!\n&quot;</span><span class="sc">;</span>
228
231
      <span class="s">}</span>
229
232
<a name="package-main"></a>    <span class="s">}</span></pre>
230
 
<p>Now, when we call <code class="inline">Cow-&gt;speak</code>
 
233
<p>Now, when we call <code class="inline"><span class="w">Cow</span><span class="w">-&gt;speak</span></code>
231
234
, we get a <code class="inline"><span class="i">$class</span></code>
232
 
 of <code class="inline">Cow</code>
 
235
 of <code class="inline"><span class="w">Cow</span></code>
233
236
 in
234
 
<code class="inline">speak</code>
235
 
.  This in turn selects the <code class="inline">Cow-&gt;sound</code>
 
237
<code class="inline"><span class="w">speak</span></code>
 
238
.  This in turn selects the <code class="inline"><span class="w">Cow</span><span class="w">-&gt;sound</span></code>
236
239
 method, which
237
 
returns <code class="inline">moooo</code>
238
 
.  But how different would this be for the <code class="inline">Horse</code>
 
240
returns <code class="inline"><span class="w">moooo</span></code>
 
241
.  But how different would this be for the <code class="inline"><span class="w">Horse</span></code>
239
242
?</p>
240
243
<pre class="verbatim"><a name="package-Horse"></a>    <span class="s">{</span> package <span class="i">Horse</span><span class="sc">;</span>
241
244
<a name="sound"></a>      sub <span class="m">sound</span> <span class="s">{</span> <span class="q">&quot;neigh&quot;</span> <span class="s">}</span>
242
245
<a name="speak"></a>      sub <span class="m">speak</span> <span class="s">{</span>
243
246
        <a class="l_k" href="functions/my.html">my</a> <span class="i">$class</span> = <a class="l_k" href="functions/shift.html">shift</a><span class="sc">;</span>
244
 
        <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a $class goes &quot;</span><span class="cm">,</span> <span class="i">$class</span><span class="i">-&gt;sound</span><span class="cm">,</span> <span class="q">&quot;!\n&quot;</span>
 
247
        <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a $class goes &quot;</span><span class="cm">,</span> <span class="i">$class</span><span class="i">-&gt;sound</span><span class="cm">,</span> <span class="q">&quot;!\n&quot;</span><span class="sc">;</span>
245
248
      <span class="s">}</span>
246
249
<a name="package-main"></a>    <span class="s">}</span></pre>
247
250
<p>Only the name of the package and the specific sound change.  So can we
248
 
somehow share the definition for <code class="inline">speak</code>
 
251
somehow share the definition for <code class="inline"><span class="w">speak</span></code>
249
252
 between the Cow and the
250
253
Horse?  Yes, with inheritance!</p>
251
254
<a name="Inheriting-the-windpipes"></a><h2>Inheriting the windpipes</h2>
252
 
<p>We'll define a common subroutine package called <code class="inline">Animal</code>
 
255
<p>We'll define a common subroutine package called <code class="inline"><span class="w">Animal</span></code>
253
256
, with the
254
 
definition for <code class="inline">speak</code>
 
257
definition for <code class="inline"><span class="w">speak</span></code>
255
258
:</p>
256
259
<pre class="verbatim"><a name="package-Animal"></a>    <span class="s">{</span> package <span class="i">Animal</span><span class="sc">;</span>
257
260
<a name="speak"></a>      sub <span class="m">speak</span> <span class="s">{</span>
258
261
        <a class="l_k" href="functions/my.html">my</a> <span class="i">$class</span> = <a class="l_k" href="functions/shift.html">shift</a><span class="sc">;</span>
259
 
        <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a $class goes &quot;</span><span class="cm">,</span> <span class="i">$class</span><span class="i">-&gt;sound</span><span class="cm">,</span> <span class="q">&quot;!\n&quot;</span>
 
262
        <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a $class goes &quot;</span><span class="cm">,</span> <span class="i">$class</span><span class="i">-&gt;sound</span><span class="cm">,</span> <span class="q">&quot;!\n&quot;</span><span class="sc">;</span>
260
263
      <span class="s">}</span>
261
264
<a name="package-main"></a>    <span class="s">}</span></pre>
262
 
<p>Then, for each animal, we say it "inherits" from <code class="inline">Animal</code>
 
265
<p>Then, for each animal, we say it "inherits" from <code class="inline"><span class="w">Animal</span></code>
263
266
, along
264
267
with the animal-specific sound:</p>
265
268
<pre class="verbatim"><a name="package-Cow"></a>    <span class="s">{</span> package <span class="i">Cow</span><span class="sc">;</span>
268
271
<a name="package-main"></a>    <span class="s">}</span></pre>
269
272
<p>Note the added <code class="inline"><span class="i">@ISA</span></code>
270
273
 array.  We'll get to that in a minute.</p>
271
 
<p>But what happens when we invoke <code class="inline">Cow-&gt;speak</code>
 
274
<p>But what happens when we invoke <code class="inline"><span class="w">Cow</span><span class="w">-&gt;speak</span></code>
272
275
 now?</p>
273
276
<p>First, Perl constructs the argument list.  In this case, it's just
274
 
<code class="inline">Cow</code>
275
 
.  Then Perl looks for <code class="inline">Cow::speak</code>
 
277
<code class="inline"><span class="w">Cow</span></code>
 
278
.  Then Perl looks for <code class="inline"><span class="w">Cow::speak</span></code>
276
279
.  But that's not there, so
277
280
Perl checks for the inheritance array <code class="inline"><span class="i">@Cow::ISA</span></code>
278
281
.  It's there,
279
 
and contains the single name <code class="inline">Animal</code>
 
282
and contains the single name <code class="inline"><span class="w">Animal</span></code>
280
283
.</p>
281
 
<p>Perl next checks for <code class="inline">speak</code>
282
 
 inside <code class="inline">Animal</code>
 
284
<p>Perl next checks for <code class="inline"><span class="w">speak</span></code>
 
285
 inside <code class="inline"><span class="w">Animal</span></code>
283
286
 instead, as in
284
 
<code class="inline">Animal::speak</code>
 
287
<code class="inline"><span class="w">Animal::speak</span></code>
285
288
.  And that's found, so Perl invokes that subroutine
286
289
with the already frozen argument list.</p>
287
 
<p>Inside the <code class="inline">Animal::speak</code>
 
290
<p>Inside the <code class="inline"><span class="w">Animal::speak</span></code>
288
291
 subroutine, <code class="inline"><span class="i">$class</span></code>
289
 
 becomes <code class="inline">Cow</code>
 
292
 becomes <code class="inline"><span class="w">Cow</span></code>
290
293
 (the
291
294
first argument).  So when we get to the step of invoking
292
295
<code class="inline"><span class="i">$class</span><span class="i">-&gt;sound</span></code>
293
 
, it'll be looking for <code class="inline">Cow-&gt;sound</code>
 
296
, it'll be looking for <code class="inline"><span class="w">Cow</span><span class="w">-&gt;sound</span></code>
294
297
, which
295
298
gets it on the first try without looking at <code class="inline"><span class="i">@ISA</span></code>
296
299
.  Success!</p>
297
300
<a name="A-few-notes-about-%40ISA"></a><h2>A few notes about @ISA</h2>
298
301
<p>This magical <code class="inline"><span class="i">@ISA</span></code>
299
302
 variable (pronounced "is a" not "ice-uh"), has
300
 
declared that <code class="inline">Cow</code>
301
 
 "is a" <code class="inline">Animal</code>
 
303
declared that <code class="inline"><span class="w">Cow</span></code>
 
304
 "is a" <code class="inline"><span class="w">Animal</span></code>
302
305
.  Note that it's an array,
303
306
not a simple single value, because on rare occasions, it makes sense
304
307
to have more than one parent class searched for the missing methods.</p>
305
 
<p>If <code class="inline">Animal</code>
 
308
<p>If <code class="inline"><span class="w">Animal</span></code>
306
309
 also had an <code class="inline"><span class="i">@ISA</span></code>
307
310
, then we'd check there too.  The
308
311
search is recursive, depth-first, left-to-right in each <code class="inline"><span class="i">@ISA</span></code>
309
 
.
310
 
Typically, each <code class="inline"><span class="i">@ISA</span></code>
311
 
 has only one element (multiple elements means
312
 
multiple inheritance and multiple headaches), so we get a nice tree of
313
 
inheritance.</p>
314
 
<p>When we turn on <code class="inline"><a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="strict.html">strict</a></code>
 
312
 by
 
313
default (see <a href="mro.html">mro</a> for alternatives).  Typically, each <code class="inline"><span class="i">@ISA</span></code>
 
314
 has
 
315
only one element (multiple elements means multiple inheritance and
 
316
multiple headaches), so we get a nice tree of inheritance.</p>
 
317
<p>When we turn on <code class="inline"><a class="l_k" href="functions/use.html">use</a> <span class="w">strict</span></code>
315
318
, we'll get complaints on <code class="inline"><span class="i">@ISA</span></code>
316
319
, since
317
320
it's not a variable containing an explicit package name, nor is it a
322
325
<pre class="verbatim">    <span class="i">@Cow::ISA</span> = <span class="q">qw(Animal)</span><span class="sc">;</span></pre>
323
326
<p>Or allow it as an implicitly named package variable:</p>
324
327
<pre class="verbatim"><a name="package-Cow"></a>    package <span class="i">Cow</span><span class="sc">;</span>
325
 
    <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="vars.html">vars</a> <span class="q">qw(@ISA)</span><span class="sc">;</span>
 
328
    <a class="l_k" href="functions/use.html">use</a> <span class="w">vars</span> <span class="q">qw(@ISA)</span><span class="sc">;</span>
326
329
    <span class="i">@ISA</span> = <span class="q">qw(Animal)</span><span class="sc">;</span></pre>
327
330
<p>If you're bringing in the class from outside, via an object-oriented
328
331
module, you change:</p>
329
332
<pre class="verbatim"><a name="package-Cow"></a>    package <span class="i">Cow</span><span class="sc">;</span>
330
 
    <a class="l_k" href="functions/use.html">use</a> Animal<span class="sc">;</span>
331
 
    <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="vars.html">vars</a> <span class="q">qw(@ISA)</span><span class="sc">;</span>
 
333
    <a class="l_k" href="functions/use.html">use</a> <span class="w">Animal</span><span class="sc">;</span>
 
334
    <a class="l_k" href="functions/use.html">use</a> <span class="w">vars</span> <span class="q">qw(@ISA)</span><span class="sc">;</span>
332
335
    <span class="i">@ISA</span> = <span class="q">qw(Animal)</span><span class="sc">;</span></pre>
333
336
<p>into just:</p>
334
337
<pre class="verbatim"><a name="package-Cow"></a>    package <span class="i">Cow</span><span class="sc">;</span>
335
 
    <a class="l_k" href="functions/use.html">use</a> <a class="l_w" href="base.html">base</a> <span class="q">qw(Animal)</span><span class="sc">;</span></pre>
 
338
    <a class="l_k" href="functions/use.html">use</a> <span class="w">base</span> <span class="q">qw(Animal)</span><span class="sc">;</span></pre>
336
339
<p>And that's pretty darn compact.</p>
337
340
<a name="Overriding-the-methods"></a><h2>Overriding the methods</h2>
338
341
<p>Let's add a mouse, which can barely be heard:</p>
346
349
        <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;[but you can barely hear it!]\n&quot;</span><span class="sc">;</span>
347
350
      <span class="s">}</span>
348
351
<a name="package-main"></a>    <span class="s">}</span></pre>
349
 
<pre class="verbatim">    Mouse-&gt;speak<span class="sc">;</span></pre>
 
352
<pre class="verbatim">    <span class="w">Mouse</span><span class="w">-&gt;speak</span><span class="sc">;</span></pre>
350
353
<p>which results in:</p>
351
 
<pre class="verbatim">    a Mouse goes squeak!
352
 
    <span class="s">[</span>but you can barely hear it!<span class="s">]</span></pre>
353
 
<p>Here, <code class="inline">Mouse</code>
354
 
 has its own speaking routine, so <code class="inline">Mouse-&gt;speak</code>
 
354
<pre class="verbatim">    <span class="w">a</span> <span class="w">Mouse</span> <span class="w">goes</span> <span class="w">squeak</span>!
 
355
    <span class="s">[</span><span class="w">but</span> <span class="w">you</span> <span class="w">can</span> <span class="w">barely</span> <span class="w">hear</span> <span class="w">it</span>!<span class="s">]</span></pre>
 
356
<p>Here, <code class="inline"><span class="w">Mouse</span></code>
 
357
 has its own speaking routine, so <code class="inline"><span class="w">Mouse</span><span class="w">-&gt;speak</span></code>
355
358
 
356
 
doesn't immediately invoke <code class="inline">Animal-&gt;speak</code>
 
359
doesn't immediately invoke <code class="inline"><span class="w">Animal</span><span class="w">-&gt;speak</span></code>
357
360
.  This is known as
358
 
"overriding".  In fact, we didn't even need to say that a <code class="inline">Mouse</code>
 
361
"overriding".  In fact, we didn't even need to say that a <code class="inline"><span class="w">Mouse</span></code>
359
362
 was
360
 
an <code class="inline">Animal</code>
361
 
 at all, since all of the methods needed for <code class="inline">speak</code>
 
363
an <code class="inline"><span class="w">Animal</span></code>
 
364
 at all, since all of the methods needed for <code class="inline"><span class="w">speak</span></code>
362
365
 are
363
 
completely defined with <code class="inline">Mouse</code>
 
366
completely defined with <code class="inline"><span class="w">Mouse</span></code>
364
367
.</p>
365
 
<p>But we've now duplicated some of the code from <code class="inline">Animal-&gt;speak</code>
 
368
<p>But we've now duplicated some of the code from <code class="inline"><span class="w">Animal</span><span class="w">-&gt;speak</span></code>
366
369
,
367
370
and this can once again be a maintenance headache.  So, can we avoid
368
 
that?  Can we say somehow that a <code class="inline">Mouse</code>
 
371
that?  Can we say somehow that a <code class="inline"><span class="w">Mouse</span></code>
369
372
 does everything any other
370
 
<code class="inline">Animal</code>
 
373
<code class="inline"><span class="w">Animal</span></code>
371
374
 does, but add in the extra comment?  Sure!</p>
372
 
<p>First, we can invoke the <code class="inline">Animal::speak</code>
 
375
<p>First, we can invoke the <code class="inline"><span class="w">Animal::speak</span></code>
373
376
 method directly:</p>
374
377
<pre class="verbatim">    <span class="c"># Animal package from before</span>
375
378
<a name="package-Mouse"></a>    <span class="s">{</span> package <span class="i">Mouse</span><span class="sc">;</span>
384
387
<p>Note that we have to include the <code class="inline"><span class="i">$class</span></code>
385
388
 parameter (almost surely
386
389
the value of <code class="inline"><span class="q">&quot;Mouse&quot;</span></code>
387
 
) as the first parameter to <code class="inline">Animal::speak</code>
 
390
) as the first parameter to <code class="inline"><span class="w">Animal::speak</span></code>
388
391
,
389
392
since we've stopped using the method arrow.  Why did we stop?  Well,
390
 
if we invoke <code class="inline">Animal-&gt;speak</code>
 
393
if we invoke <code class="inline"><span class="w">Animal</span><span class="w">-&gt;speak</span></code>
391
394
 there, the first parameter to the
392
395
method will be <code class="inline"><span class="q">&quot;Animal&quot;</span></code>
393
396
 not <code class="inline"><span class="q">&quot;Mouse&quot;</span></code>
394
397
, and when time comes for it
395
 
to call for the <code class="inline">sound</code>
 
398
to call for the <code class="inline"><span class="w">sound</span></code>
396
399
, it won't have the right class to come back
397
400
to this package.</p>
398
 
<p>Invoking <code class="inline">Animal::speak</code>
 
401
<p>Invoking <code class="inline"><span class="w">Animal::speak</span></code>
399
402
 directly is a mess, however.  What if
400
 
<code class="inline">Animal::speak</code>
 
403
<code class="inline"><span class="w">Animal::speak</span></code>
401
404
 didn't exist before, and was being inherited from a
402
405
class mentioned in <code class="inline"><span class="i">@Animal::ISA</span></code>
403
406
?  Because we are no longer using
404
407
the method arrow, we get one and only one chance to hit the right
405
408
subroutine.</p>
406
 
<p>Also note that the <code class="inline">Animal</code>
 
409
<p>Also note that the <code class="inline"><span class="w">Animal</span></code>
407
410
 classname is now hardwired into the
408
411
subroutine selection.  This is a mess if someone maintains the code,
409
412
changing <code class="inline"><span class="i">@ISA</span></code>
410
 
 for &lt;Mouse&gt; and didn't notice <code class="inline">Animal</code>
 
413
 for <code class="inline"><span class="w">Mouse</span></code>
 
414
 and didn't notice <code class="inline"><span class="w">Animal</span></code>
411
415
 there in
412
 
<code class="inline">speak</code>
 
416
<code class="inline"><span class="w">speak</span></code>
413
417
.  So, this is probably not the right way to go.</p>
414
418
<a name="Starting-the-search-from-a-different-place"></a><h2>Starting the search from a different place</h2>
415
419
<p>A better solution is to tell Perl to search from a higher place
423
427
        <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;[but you can barely hear it!]\n&quot;</span><span class="sc">;</span>
424
428
      <span class="s">}</span>
425
429
<a name="package-main"></a>    <span class="s">}</span></pre>
426
 
<p>Ahh.  This works.  Using this syntax, we start with <code class="inline">Animal</code>
 
430
<p>Ahh.  This works.  Using this syntax, we start with <code class="inline"><span class="w">Animal</span></code>
427
431
 to find
428
 
<code class="inline">speak</code>
429
 
, and use all of <code class="inline">Animal</code>
 
432
<code class="inline"><span class="w">speak</span></code>
 
433
, and use all of <code class="inline"><span class="w">Animal</span></code>
430
434
's inheritance chain if not found
431
435
immediately.  And yet the first parameter will be <code class="inline"><span class="i">$class</span></code>
432
436
, so the
433
 
found <code class="inline">speak</code>
434
 
 method will get <code class="inline">Mouse</code>
 
437
found <code class="inline"><span class="w">speak</span></code>
 
438
 method will get <code class="inline"><span class="w">Mouse</span></code>
435
439
 as its first entry, and
436
 
eventually work its way back to <code class="inline">Mouse::sound</code>
 
440
eventually work its way back to <code class="inline"><span class="w">Mouse::sound</span></code>
437
441
 for the details.</p>
438
442
<p>But this isn't the best solution.  We still have to keep the <code class="inline"><span class="i">@ISA</span></code>
439
443
 
440
 
and the initial search package coordinated.  Worse, if <code class="inline">Mouse</code>
 
444
and the initial search package coordinated.  Worse, if <code class="inline"><span class="w">Mouse</span></code>
441
445
 had
442
446
multiple entries in <code class="inline"><span class="i">@ISA</span></code>
443
447
, we wouldn't necessarily know which one
444
 
had actually defined <code class="inline">speak</code>
 
448
had actually defined <code class="inline"><span class="w">speak</span></code>
445
449
.  So, is there an even better way?</p>
446
450
<a name="The-SUPER-way-of-doing-things"></a><h2>The SUPER way of doing things</h2>
447
 
<p>By changing the <code class="inline">Animal</code>
448
 
 class to the <code class="inline">SUPER</code>
 
451
<p>By changing the <code class="inline"><span class="w">Animal</span></code>
 
452
 class to the <code class="inline"><span class="w">SUPER</span></code>
449
453
 class in that
450
454
invocation, we get a search of all of our super classes (classes
451
455
listed in <code class="inline"><span class="i">@ISA</span></code>
459
463
        <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;[but you can barely hear it!]\n&quot;</span><span class="sc">;</span>
460
464
      <span class="s">}</span>
461
465
<a name="package-main"></a>    <span class="s">}</span></pre>
462
 
<p>So, <code class="inline">SUPER::speak</code>
 
466
<p>So, <code class="inline"><span class="w">SUPER::speak</span></code>
463
467
 means look in the current package's <code class="inline"><span class="i">@ISA</span></code>
464
468
 for
465
 
<code class="inline">speak</code>
 
469
<code class="inline"><span class="w">speak</span></code>
466
470
, invoking the first one found. Note that it does <i>not</i> look in
467
471
the <code class="inline"><span class="i">@ISA</span></code>
468
472
 of <code class="inline"><span class="i">$class</span></code>
469
473
.</p>
470
474
<a name="Where-we're-at-so-far..."></a><h2>Where we're at so far...</h2>
471
475
<p>So far, we've seen the method arrow syntax:</p>
472
 
<pre class="verbatim">  Class-&gt;method<span class="s">(</span><span class="i">@args</span><span class="s">)</span><span class="sc">;</span></pre>
 
476
<pre class="verbatim">  <span class="w">Class</span><span class="w">-&gt;method</span><span class="s">(</span><span class="i">@args</span><span class="s">)</span><span class="sc">;</span></pre>
473
477
<p>or the equivalent:</p>
474
478
<pre class="verbatim">  <span class="i">$a</span> = <span class="q">&quot;Class&quot;</span><span class="sc">;</span>
475
479
  <span class="i">$a</span><span class="i">-&gt;method</span><span class="s">(</span><span class="i">@args</span><span class="s">)</span><span class="sc">;</span></pre>
477
481
<pre class="verbatim">  <span class="s">(</span><span class="q">&quot;Class&quot;</span><span class="cm">,</span> <span class="i">@args</span><span class="s">)</span></pre>
478
482
<p>and attempts to invoke</p>
479
483
<pre class="verbatim">  <span class="i">Class::method</span><span class="s">(</span><span class="q">&quot;Class&quot;</span><span class="cm">,</span> <span class="i">@Args</span><span class="s">)</span><span class="sc">;</span></pre>
480
 
<p>However, if <code class="inline">Class::method</code>
 
484
<p>However, if <code class="inline"><span class="w">Class::method</span></code>
481
485
 is not found, then <code class="inline"><span class="i">@Class::ISA</span></code>
482
486
 is examined
483
 
(recursively) to locate a package that does indeed contain <code class="inline">method</code>
 
487
(recursively) to locate a package that does indeed contain <code class="inline"><span class="w">method</span></code>
484
488
,
485
489
and that subroutine is invoked instead.</p>
486
490
<p>Using this simple syntax, we have class methods, (multiple)
490
494
objects provide, but objects also provide instance data, which we
491
495
haven't even begun to cover.</p>
492
496
<a name="A-horse-is-a-horse%2c-of-course-of-course----or-is-it%3f"></a><h2>A horse is a horse, of course of course -- or is it?</h2>
493
 
<p>Let's start with the code for the <code class="inline">Animal</code>
 
497
<p>Let's start with the code for the <code class="inline"><span class="w">Animal</span></code>
494
498
 class
495
 
and the <code class="inline">Horse</code>
 
499
and the <code class="inline"><span class="w">Horse</span></code>
496
500
 class:</p>
497
501
<pre class="verbatim"><a name="package-Animal"></a>  <span class="s">{</span> package <span class="i">Animal</span><span class="sc">;</span>
498
502
<a name="speak"></a>    sub <span class="m">speak</span> <span class="s">{</span>
499
503
      <a class="l_k" href="functions/my.html">my</a> <span class="i">$class</span> = <a class="l_k" href="functions/shift.html">shift</a><span class="sc">;</span>
500
 
      <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a $class goes &quot;</span><span class="cm">,</span> <span class="i">$class</span><span class="i">-&gt;sound</span><span class="cm">,</span> <span class="q">&quot;!\n&quot;</span>
 
504
      <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a $class goes &quot;</span><span class="cm">,</span> <span class="i">$class</span><span class="i">-&gt;sound</span><span class="cm">,</span> <span class="q">&quot;!\n&quot;</span><span class="sc">;</span>
501
505
    <span class="s">}</span>
502
506
<a name="package-main"></a>  <span class="s">}</span>
503
507
<a name="package-Horse"></a>  <span class="s">{</span> package <span class="i">Horse</span><span class="sc">;</span>
504
508
    <span class="i">@ISA</span> = <span class="q">qw(Animal)</span><span class="sc">;</span>
505
509
<a name="sound"></a>    sub <span class="m">sound</span> <span class="s">{</span> <span class="q">&quot;neigh&quot;</span> <span class="s">}</span>
506
510
<a name="package-main-1"></a>  <span class="s">}</span></pre>
507
 
<p>This lets us invoke <code class="inline">Horse-&gt;speak</code>
 
511
<p>This lets us invoke <code class="inline"><span class="w">Horse</span><span class="w">-&gt;speak</span></code>
508
512
 to ripple upward to
509
 
<code class="inline">Animal::speak</code>
510
 
, calling back to <code class="inline">Horse::sound</code>
 
513
<code class="inline"><span class="w">Animal::speak</span></code>
 
514
, calling back to <code class="inline"><span class="w">Horse::sound</span></code>
511
515
 to get the specific
512
516
sound, and the output of:</p>
513
 
<pre class="verbatim">  a Horse goes neigh!</pre>
 
517
<pre class="verbatim">  <span class="w">a</span> <span class="w">Horse</span> <span class="w">goes</span> <span class="w">neigh</span>!</pre>
514
518
<p>But all of our Horse objects would have to be absolutely identical.
515
519
If I add a subroutine, all horses automatically share it.  That's
516
520
great for making horses the same, but how do we capture the
527
531
 is a reference to what will be the instance-specific
528
532
data (the name).  The final step in turning this into a real instance
529
533
is with a special operator called <code class="inline"><a class="l_k" href="functions/bless.html">bless</a></code>:</p>
530
 
<pre class="verbatim">  <a class="l_k" href="functions/bless.html">bless</a> <span class="i">$talking</span><span class="cm">,</span> Horse<span class="sc">;</span></pre>
531
 
<p>This operator stores information about the package named <code class="inline">Horse</code>
 
534
<pre class="verbatim">  <a class="l_k" href="functions/bless.html">bless</a> <span class="i">$talking</span><span class="cm">,</span> <span class="w">Horse</span><span class="sc">;</span></pre>
 
535
<p>This operator stores information about the package named <code class="inline"><span class="w">Horse</span></code>
532
536
 into
533
537
the thing pointed at by the reference.  At this point, we say
534
538
<code class="inline"><span class="i">$talking</span></code>
535
 
 is an instance of <code class="inline">Horse</code>
 
539
 is an instance of <code class="inline"><span class="w">Horse</span></code>
536
540
.  That is, it's a specific
537
541
horse.  The reference is otherwise unchanged, and can still be used
538
542
with traditional dereferencing operators.</p>
541
545
packages (classes).  So, let's get the sound that <code class="inline"><span class="i">$talking</span></code>
542
546
 makes:</p>
543
547
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$noise</span> = <span class="i">$talking</span><span class="i">-&gt;sound</span><span class="sc">;</span></pre>
544
 
<p>To invoke <code class="inline">sound</code>
 
548
<p>To invoke <code class="inline"><span class="w">sound</span></code>
545
549
, Perl first notes that <code class="inline"><span class="i">$talking</span></code>
546
550
 is a blessed
547
551
reference (and thus an instance).  It then constructs an argument
550
554
arguments will take their place following the instance variable,
551
555
just like with classes.)</p>
552
556
<p>Now for the fun part: Perl takes the class in which the instance was
553
 
blessed, in this case <code class="inline">Horse</code>
 
557
blessed, in this case <code class="inline"><span class="w">Horse</span></code>
554
558
, and uses that to locate the subroutine
555
 
to invoke the method.  In this case, <code class="inline">Horse::sound</code>
 
559
to invoke the method.  In this case, <code class="inline"><span class="w">Horse::sound</span></code>
556
560
 is found directly
557
561
(without using inheritance), yielding the final subroutine invocation:</p>
558
562
<pre class="verbatim">  <span class="i">Horse::sound</span><span class="s">(</span><span class="i">$talking</span><span class="s">)</span></pre>
559
563
<p>Note that the first parameter here is still the instance, not the name
560
 
of the class as before.  We'll get <code class="inline">neigh</code>
 
564
of the class as before.  We'll get <code class="inline"><span class="w">neigh</span></code>
561
565
 as the return value, and
562
566
that'll end up as the <code class="inline"><span class="i">$noise</span></code>
563
567
 variable above.</p>
581
585
<a name="package-main"></a>  <span class="s">}</span></pre>
582
586
<p>Now we call for the name:</p>
583
587
<pre class="verbatim">  <a class="l_k" href="functions/print.html">print</a> <span class="i">$talking</span><span class="i">-&gt;name</span><span class="cm">,</span> <span class="q">&quot; says &quot;</span><span class="cm">,</span> <span class="i">$talking</span><span class="i">-&gt;sound</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span></pre>
584
 
<p>Inside <code class="inline">Horse::name</code>
 
588
<p>Inside <code class="inline"><span class="w">Horse::name</span></code>
585
589
, the <code class="inline"><span class="i">@_</span></code>
586
590
 array contains just <code class="inline"><span class="i">$talking</span></code>
587
591
,
591
595
 for instance
592
596
methods, so stay with that unless you have strong reasons otherwise.)
593
597
Then, <code class="inline"><span class="i">$self</span></code>
594
 
 gets de-referenced as a scalar ref, yielding <code class="inline">Mr. Ed</code>
 
598
 gets de-referenced as a scalar ref, yielding <code class="inline"><span class="w">Mr</span>. <span class="w">Ed</span></code>
595
599
,
596
600
and we're done with that.  The result is:</p>
597
 
<pre class="verbatim">  Mr. Ed says neigh.</pre>
 
601
<pre class="verbatim">  <span class="w">Mr</span>. <span class="w">Ed</span> <span class="w">says</span> <span class="w">neigh</span>.</pre>
598
602
<a name="How-to-build-a-horse"></a><h2>How to build a horse</h2>
599
603
<p>Of course, if we constructed all of our horses by hand, we'd most
600
604
likely make mistakes from time to time.  We're also violating one of
615
619
      <a class="l_k" href="functions/bless.html">bless</a> \<span class="i">$name</span><span class="cm">,</span> <span class="i">$class</span><span class="sc">;</span>
616
620
    <span class="s">}</span>
617
621
<a name="package-main"></a>  <span class="s">}</span></pre>
618
 
<p>Now with the new <code class="inline">named</code>
 
622
<p>Now with the new <code class="inline"><span class="w">named</span></code>
619
623
 method, we can build a horse:</p>
620
 
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$talking</span> = Horse-&gt;named<span class="s">(</span><span class="q">&quot;Mr. Ed&quot;</span><span class="s">)</span><span class="sc">;</span></pre>
 
624
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$talking</span> = <span class="w">Horse</span><span class="w">-&gt;named</span><span class="s">(</span><span class="q">&quot;Mr. Ed&quot;</span><span class="s">)</span><span class="sc">;</span></pre>
621
625
<p>Notice we're back to a class method, so the two arguments to
622
 
<code class="inline">Horse::named</code>
623
 
 are <code class="inline">Horse</code>
624
 
 and <code class="inline">Mr. Ed</code>
 
626
<code class="inline"><span class="w">Horse::named</span></code>
 
627
 are <code class="inline"><span class="w">Horse</span></code>
 
628
 and <code class="inline"><span class="w">Mr</span>. <span class="w">Ed</span></code>
625
629
.  The <code class="inline"><a class="l_k" href="functions/bless.html">bless</a></code> operator
626
630
not only blesses <code class="inline"><span class="i">$name</span></code>
627
631
, it also returns the reference to <code class="inline"><span class="i">$name</span></code>
628
632
,
629
633
so that's fine as a return value.  And that's how to build a horse.</p>
630
 
<p>We've called the constructor <code class="inline">named</code>
 
634
<p>We've called the constructor <code class="inline"><span class="w">named</span></code>
631
635
 here, so that it quickly denotes
632
 
the constructor's argument as the name for this particular <code class="inline">Horse</code>
 
636
the constructor's argument as the name for this particular <code class="inline"><span class="w">Horse</span></code>
633
637
.
634
638
You can use different constructors with different names for different
635
639
ways of "giving birth" to the object (like maybe recording its
636
640
pedigree or date of birth).  However, you'll find that most people
637
641
coming to Perl from more limited languages use a single constructor
638
 
named <code class="inline">new</code>
 
642
named <code class="inline"><span class="w">new</span></code>
639
643
, with various ways of interpreting the arguments to
640
 
<code class="inline">new</code>
 
644
<code class="inline"><span class="w">new</span></code>
641
645
.  Either style is fine, as long as you document your particular
642
646
way of giving birth to an object.  (And you <i>were</i> going to do that,
643
647
right?)</p>
644
648
<a name="Inheriting-the-constructor"></a><h2>Inheriting the constructor</h2>
645
 
<p>But was there anything specific to <code class="inline">Horse</code>
 
649
<p>But was there anything specific to <code class="inline"><span class="w">Horse</span></code>
646
650
 in that method?  No.  Therefore,
647
651
it's also the same recipe for building anything else that inherited from
648
 
<code class="inline">Animal</code>
 
652
<code class="inline"><span class="w">Animal</span></code>
649
653
, so let's put it there:</p>
650
654
<pre class="verbatim"><a name="package-Animal"></a>  <span class="s">{</span> package <span class="i">Animal</span><span class="sc">;</span>
651
655
<a name="speak"></a>    sub <span class="m">speak</span> <span class="s">{</span>
652
656
      <a class="l_k" href="functions/my.html">my</a> <span class="i">$class</span> = <a class="l_k" href="functions/shift.html">shift</a><span class="sc">;</span>
653
 
      <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a $class goes &quot;</span><span class="cm">,</span> <span class="i">$class</span><span class="i">-&gt;sound</span><span class="cm">,</span> <span class="q">&quot;!\n&quot;</span>
 
657
      <a class="l_k" href="functions/print.html">print</a> <span class="q">&quot;a $class goes &quot;</span><span class="cm">,</span> <span class="i">$class</span><span class="i">-&gt;sound</span><span class="cm">,</span> <span class="q">&quot;!\n&quot;</span><span class="sc">;</span>
654
658
    <span class="s">}</span>
655
659
<a name="name"></a>    sub <span class="m">name</span> <span class="s">{</span>
656
660
      <a class="l_k" href="functions/my.html">my</a> <span class="i">$self</span> = <a class="l_k" href="functions/shift.html">shift</a><span class="sc">;</span>
666
670
    <span class="i">@ISA</span> = <span class="q">qw(Animal)</span><span class="sc">;</span>
667
671
<a name="sound"></a>    sub <span class="m">sound</span> <span class="s">{</span> <span class="q">&quot;neigh&quot;</span> <span class="s">}</span>
668
672
<a name="package-main-1"></a>  <span class="s">}</span></pre>
669
 
<p>Ahh, but what happens if we invoke <code class="inline">speak</code>
 
673
<p>Ahh, but what happens if we invoke <code class="inline"><span class="w">speak</span></code>
670
674
 on an instance?</p>
671
 
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$talking</span> = Horse-&gt;named<span class="s">(</span><span class="q">&quot;Mr. Ed&quot;</span><span class="s">)</span><span class="sc">;</span>
 
675
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$talking</span> = <span class="w">Horse</span><span class="w">-&gt;named</span><span class="s">(</span><span class="q">&quot;Mr. Ed&quot;</span><span class="s">)</span><span class="sc">;</span>
672
676
  <span class="i">$talking</span><span class="i">-&gt;speak</span><span class="sc">;</span></pre>
673
677
<p>We get a debugging value:</p>
674
 
<pre class="verbatim">  a Horse=SCALAR(0xaca42ac) goes neigh!</pre><p>Why?  Because the <code class="inline">Animal::speak</code>
 
678
<pre class="verbatim">  a Horse=SCALAR(0xaca42ac) goes neigh!</pre><p>Why?  Because the <code class="inline"><span class="w">Animal::speak</span></code>
675
679
 routine is expecting a classname as
676
680
its first parameter, not an instance.  When the instance is passed in,
677
681
we'll end up using a blessed scalar reference as a string, and that
680
684
<p>All we need is for a method to detect if it is being called on a class
681
685
or called on an instance.  The most straightforward way is with the
682
686
<code class="inline"><a class="l_k" href="functions/ref.html">ref</a></code> operator.  This returns a string (the classname) when used on a
683
 
blessed reference, and <code class="inline"><a class="l_k" href="functions/undef.html">undef</a></code> when used on a string (like a
684
 
classname).  Let's modify the <code class="inline">name</code>
 
687
blessed reference, and an empty string when used on a string (like a
 
688
classname).  Let's modify the <code class="inline"><span class="w">name</span></code>
685
689
 method first to notice the change:</p>
686
690
<pre class="verbatim"><a name="name"></a>  sub <span class="m">name</span> <span class="s">{</span>
687
691
    <a class="l_k" href="functions/my.html">my</a> <span class="i">$either</span> = <a class="l_k" href="functions/shift.html">shift</a><span class="sc">;</span>
694
698
instance or a class.  Note that I've changed the first parameter
695
699
holder to <code class="inline"><span class="i">$either</span></code>
696
700
 to show that this is intended:</p>
697
 
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$talking</span> = Horse-&gt;named<span class="s">(</span><span class="q">&quot;Mr. Ed&quot;</span><span class="s">)</span><span class="sc">;</span>
 
701
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$talking</span> = <span class="w">Horse</span><span class="w">-&gt;named</span><span class="s">(</span><span class="q">&quot;Mr. Ed&quot;</span><span class="s">)</span><span class="sc">;</span>
698
702
  <a class="l_k" href="functions/print.html">print</a> <span class="i">Horse</span><span class="i">-&gt;name</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span> <span class="c"># prints &quot;an unnamed Horse\n&quot;</span>
699
703
  <a class="l_k" href="functions/print.html">print</a> <span class="i">$talking</span><span class="i">-&gt;name</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span> <span class="c"># prints &quot;Mr Ed.\n&quot;</span></pre>
700
 
<p>and now we'll fix <code class="inline">speak</code>
 
704
<p>and now we'll fix <code class="inline"><span class="w">speak</span></code>
701
705
 to use this:</p>
702
706
<pre class="verbatim"><a name="speak"></a>  sub <span class="m">speak</span> <span class="s">{</span>
703
707
    <a class="l_k" href="functions/my.html">my</a> <span class="i">$either</span> = <a class="l_k" href="functions/shift.html">shift</a><span class="sc">;</span>
704
708
    <a class="l_k" href="functions/print.html">print</a> <span class="i">$either</span><span class="i">-&gt;name</span><span class="cm">,</span> <span class="q">&quot; goes &quot;</span><span class="cm">,</span> <span class="i">$either</span><span class="i">-&gt;sound</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span>
705
709
  <span class="s">}</span></pre>
706
 
<p>And since <code class="inline">sound</code>
 
710
<p>And since <code class="inline"><span class="w">sound</span></code>
707
711
 already worked with either a class or an instance,
708
712
we're done!</p>
709
713
<a name="Adding-parameters-to-a-method"></a><h2>Adding parameters to a method</h2>
739
743
<a name="sound-1"></a>    sub <span class="m">sound</span> <span class="s">{</span> <span class="q">&quot;baaaah&quot;</span> <span class="s">}</span>
740
744
<a name="package-main-2"></a>  <span class="s">}</span></pre>
741
745
<p>And now try it out:</p>
742
 
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$talking</span> = Horse-&gt;named<span class="s">(</span><span class="q">&quot;Mr. Ed&quot;</span><span class="s">)</span><span class="sc">;</span>
 
746
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$talking</span> = <span class="w">Horse</span><span class="w">-&gt;named</span><span class="s">(</span><span class="q">&quot;Mr. Ed&quot;</span><span class="s">)</span><span class="sc">;</span>
743
747
  <span class="i">$talking</span><span class="i">-&gt;eat</span><span class="s">(</span><span class="q">&quot;hay&quot;</span><span class="s">)</span><span class="sc">;</span>
744
 
  Sheep-&gt;eat<span class="s">(</span><span class="q">&quot;grass&quot;</span><span class="s">)</span><span class="sc">;</span></pre>
 
748
  <span class="w">Sheep</span><span class="w">-&gt;eat</span><span class="s">(</span><span class="q">&quot;grass&quot;</span><span class="s">)</span><span class="sc">;</span></pre>
745
749
<p>which prints:</p>
746
 
<pre class="verbatim">  Mr. Ed eats hay.
747
 
  an unnamed Sheep eats grass.</pre>
 
750
<pre class="verbatim">  <span class="w">Mr</span>. <span class="w">Ed</span> <span class="w">eats</span> <span class="w">hay</span>.
 
751
  <span class="w">an</span> <span class="w">unnamed</span> <span class="w">Sheep</span> <span class="w">eats</span> <span class="w">grass</span>.</pre>
748
752
<p>An instance method with parameters gets invoked with the instance,
749
753
and then the list of parameters.  So that first invocation is like:</p>
750
754
<pre class="verbatim">  <span class="i">Animal::eat</span><span class="s">(</span><span class="i">$talking</span><span class="cm">,</span> <span class="q">&quot;hay&quot;</span><span class="s">)</span><span class="sc">;</span></pre>
760
764
reference as a blessed scalar reference, as long as everything that
761
765
looks at the reference is changed accordingly.</p>
762
766
<p>Let's make a sheep that has a name and a color:</p>
763
 
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$bad</span> = <a class="l_k" href="functions/bless.html">bless</a> <span class="s">{</span> Name <span class="cm">=&gt;</span> <span class="q">&quot;Evil&quot;</span><span class="cm">,</span> Color <span class="cm">=&gt;</span> <span class="q">&quot;black&quot;</span> <span class="s">}</span><span class="cm">,</span> Sheep<span class="sc">;</span></pre>
764
 
<p>so <code class="inline"><span class="i">$bad</span>-&gt;{Name}</code>
765
 
 has <code class="inline">Evil</code>
766
 
, and <code class="inline"><span class="i">$bad</span>-&gt;{Color}</code>
 
767
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$bad</span> = <a class="l_k" href="functions/bless.html">bless</a> <span class="s">{</span> <span class="w">Name</span> <span class="cm">=&gt;</span> <span class="q">&quot;Evil&quot;</span><span class="cm">,</span> <span class="w">Color</span> <span class="cm">=&gt;</span> <span class="q">&quot;black&quot;</span> <span class="s">}</span><span class="cm">,</span> <span class="w">Sheep</span><span class="sc">;</span></pre>
 
768
<p>so <code class="inline"><span class="i">$bad</span>-&gt;{<span class="w">Name</span>}</code>
 
769
 has <code class="inline"><span class="w">Evil</span></code>
 
770
, and <code class="inline"><span class="i">$bad</span>-&gt;{<span class="w">Color</span>}</code>
767
771
 has
768
 
<code class="inline">black</code>
 
772
<code class="inline"><span class="w">black</span></code>
769
773
.  But we want to make <code class="inline"><span class="i">$bad</span><span class="i">-&gt;name</span></code>
770
774
 access the name, and
771
775
that's now messed up because it's expecting a scalar reference.  Not
774
778
<a name="name"></a>  sub <span class="m">name</span> <span class="s">{</span>
775
779
    <a class="l_k" href="functions/my.html">my</a> <span class="i">$either</span> = <a class="l_k" href="functions/shift.html">shift</a><span class="sc">;</span>
776
780
    <a class="l_k" href="functions/ref.html">ref</a> <span class="i">$either</span> ?
777
 
      <span class="i">$either</span>-&gt;{Name} <span class="co">:</span>
 
781
      <span class="i">$either</span>-&gt;{<span class="w">Name</span>} <span class="co">:</span>
778
782
      <span class="q">&quot;an unnamed $either&quot;</span><span class="sc">;</span>
779
783
  <span class="s">}</span></pre>
780
 
<p>And of course <code class="inline">named</code>
 
784
<p>And of course <code class="inline"><span class="w">named</span></code>
781
785
 still builds a scalar sheep, so let's fix that
782
786
as well:</p>
783
787
<pre class="verbatim">  <span class="c">## in Animal</span>
784
788
<a name="named"></a>  sub <span class="m">named</span> <span class="s">{</span>
785
789
    <a class="l_k" href="functions/my.html">my</a> <span class="i">$class</span> = <a class="l_k" href="functions/shift.html">shift</a><span class="sc">;</span>
786
790
    <a class="l_k" href="functions/my.html">my</a> <span class="i">$name</span> = <a class="l_k" href="functions/shift.html">shift</a><span class="sc">;</span>
787
 
    <a class="l_k" href="functions/my.html">my</a> <span class="i">$self</span> = <span class="s">{</span> Name <span class="cm">=&gt;</span> <span class="i">$name</span><span class="cm">,</span> Color <span class="cm">=&gt;</span> <span class="i">$class</span><span class="i">-&gt;default_color</span> <span class="s">}</span><span class="sc">;</span>
 
791
    <a class="l_k" href="functions/my.html">my</a> <span class="i">$self</span> = <span class="s">{</span> <span class="w">Name</span> <span class="cm">=&gt;</span> <span class="i">$name</span><span class="cm">,</span> <span class="w">Color</span> <span class="cm">=&gt;</span> <span class="i">$class</span><span class="i">-&gt;default_color</span> <span class="s">}</span><span class="sc">;</span>
788
792
    <a class="l_k" href="functions/bless.html">bless</a> <span class="i">$self</span><span class="cm">,</span> <span class="i">$class</span><span class="sc">;</span>
789
793
  <span class="s">}</span></pre>
790
 
<p>What's this <code class="inline">default_color</code>
791
 
?  Well, if <code class="inline">named</code>
 
794
<p>What's this <code class="inline"><span class="w">default_color</span></code>
 
795
?  Well, if <code class="inline"><span class="w">named</span></code>
792
796
 has only the name,
793
797
we still need to set a color, so we'll have a class-specific initial color.
794
798
For a sheep, we might define it as white:</p>
796
800
<a name="default_color"></a>  sub <span class="m">default_color</span> <span class="s">{</span> <span class="q">&quot;white&quot;</span> <span class="s">}</span></pre>
797
801
<p>And then to keep from having to define one for each additional class,
798
802
we'll define a "backstop" method that serves as the "default default",
799
 
directly in <code class="inline">Animal</code>
 
803
directly in <code class="inline"><span class="w">Animal</span></code>
800
804
:</p>
801
805
<pre class="verbatim">  <span class="c">## in Animal</span>
802
806
<a name="default_color"></a>  sub <span class="m">default_color</span> <span class="s">{</span> <span class="q">&quot;brown&quot;</span> <span class="s">}</span></pre>
803
 
<p>Now, because <code class="inline">name</code>
804
 
 and <code class="inline">named</code>
 
807
<p>Now, because <code class="inline"><span class="w">name</span></code>
 
808
 and <code class="inline"><span class="w">named</span></code>
805
809
 were the only methods that
806
810
referenced the "structure" of the object, the rest of the methods can
807
 
remain the same, so <code class="inline">speak</code>
 
811
remain the same, so <code class="inline"><span class="w">speak</span></code>
808
812
 still works as before.</p>
809
813
<a name="A-horse-of-a-different-color"></a><h2>A horse of a different color</h2>
810
814
<p>But having all our horses be brown would be boring.  So let's add a
811
815
method or two to get and set the color.</p>
812
816
<pre class="verbatim">  <span class="c">## in Animal</span>
813
817
<a name="color"></a>  sub <span class="m">color</span> <span class="s">{</span>
814
 
    <span class="i">$_</span>[<span class="n">0</span>]-&gt;{Color}
 
818
    <span class="i">$_</span>[<span class="n">0</span>]-&gt;{<span class="w">Color</span>}
815
819
  <span class="s">}</span>
816
820
<a name="set_color"></a>  sub <span class="m">set_color</span> <span class="s">{</span>
817
 
    <span class="i">$_</span>[<span class="n">0</span>]-&gt;{Color} = <span class="i">$_</span>[<span class="n">1</span>]<span class="sc">;</span>
 
821
    <span class="i">$_</span>[<span class="n">0</span>]-&gt;{<span class="w">Color</span>} = <span class="i">$_</span>[<span class="n">1</span>]<span class="sc">;</span>
818
822
  <span class="s">}</span></pre>
819
823
<p>Note the alternate way of accessing the arguments: <code class="inline"><span class="i">$_</span>[<span class="n">0</span>]</code>
820
824
 is used
821
825
in-place, rather than with a <code class="inline"><a class="l_k" href="functions/shift.html">shift</a></code>.  (This saves us a bit of time
822
826
for something that may be invoked frequently.)  And now we can fix
823
827
that color for Mr. Ed:</p>
824
 
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$talking</span> = Horse-&gt;named<span class="s">(</span><span class="q">&quot;Mr. Ed&quot;</span><span class="s">)</span><span class="sc">;</span>
 
828
<pre class="verbatim">  <a class="l_k" href="functions/my.html">my</a> <span class="i">$talking</span> = <span class="w">Horse</span><span class="w">-&gt;named</span><span class="s">(</span><span class="q">&quot;Mr. Ed&quot;</span><span class="s">)</span><span class="sc">;</span>
825
829
  <span class="i">$talking</span><span class="i">-&gt;set_color</span><span class="s">(</span><span class="q">&quot;black-and-white&quot;</span><span class="s">)</span><span class="sc">;</span>
826
830
  <a class="l_k" href="functions/print.html">print</a> <span class="i">$talking</span><span class="i">-&gt;name</span><span class="cm">,</span> <span class="q">&quot; is colored &quot;</span><span class="cm">,</span> <span class="i">$talking</span><span class="i">-&gt;color</span><span class="cm">,</span> <span class="q">&quot;\n&quot;</span><span class="sc">;</span></pre>
827
831
<p>which results in:</p>
828
 
<pre class="verbatim">  Mr. Ed is colored black-and-white</pre>
 
832
<pre class="verbatim">  <span class="w">Mr</span>. <span class="w">Ed</span> <span class="w">is</span> <span class="w">colored</span> <span class="w">black</span>-and-<span class="w">white</span></pre>
829
833
<a name="Summary"></a><h2>Summary</h2>
830
834
<p>So, now we have class methods, constructors, instance methods,
831
835
instance data, and even accessors.  But that's still just the
832
836
beginning of what Perl has to offer.  We haven't even begun to talk
833
837
about accessors that double as getters and setters, destructors,
834
838
indirect object notation, subclasses that add instance data, per-class
835
 
data, overloading, "isa" and "can" tests, <code class="inline"><a class="l_w" href="UNIVERSAL.html">UNIVERSAL</a></code> class, and so
 
839
data, overloading, "isa" and "can" tests, <code class="inline"><span class="w">UNIVERSAL</span></code>
 
840
 class, and so
836
841
on.  That's for the rest of the Perl documentation to cover.
837
842
Hopefully, this gets you started, though.</p>
838
843
<a name="SEE-ALSO"></a><h1>SEE ALSO</h1>
873
878
          <!--<select name="r"><option value="1" selected>Go to top result<option value="0">Show results list</select>-->
874
879
        </form>
875
880
      </p>
 
881
      <script language="JavaScript" type="text/javascript" src="/perl-version.js"></script>
876
882
      <h2>Labels:</h2>
877
883
      <p>
878
884
        <a href="#" onClick="addLabel('perlboot','perlboot.html')">Add this page</a>