incremental improvement in ~~ documentation, already in maint-5.10
[p5sagit/p5-mst-13.2.git] / lib / overload.pm
CommitLineData
4633a7c4 1package overload;
2
af048c18 3our $VERSION = '1.08';
b75c8c73 4
a6006777 5sub nil {}
6
4633a7c4 7sub OVERLOAD {
8 $package = shift;
9 my %arg = @_;
a6006777 10 my ($sub, $fb);
11 $ {$package . "::OVERLOAD"}{dummy}++; # Register with magic by touching.
12 *{$package . "::()"} = \&nil; # Make it findable via fetchmethod.
4633a7c4 13 for (keys %arg) {
a6006777 14 if ($_ eq 'fallback') {
15 $fb = $arg{$_};
16 } else {
17 $sub = $arg{$_};
18 if (not ref $sub and $sub !~ /::/) {
44a8e56a 19 $ {$package . "::(" . $_} = $sub;
20 $sub = \&nil;
a6006777 21 }
22 #print STDERR "Setting `$ {'package'}::\cO$_' to \\&`$sub'.\n";
23 *{$package . "::(" . $_} = \&{ $sub };
24 }
4633a7c4 25 }
a6006777 26 ${$package . "::()"} = $fb; # Make it findable too (fallback only).
4633a7c4 27}
28
29sub import {
30 $package = (caller())[0];
31 # *{$package . "::OVERLOAD"} = \&OVERLOAD;
32 shift;
33 $package->overload::OVERLOAD(@_);
34}
35
36sub unimport {
37 $package = (caller())[0];
a6006777 38 ${$package . "::OVERLOAD"}{dummy}++; # Upgrade the table
4633a7c4 39 shift;
40 for (@_) {
a6006777 41 if ($_ eq 'fallback') {
42 undef $ {$package . "::()"};
43 } else {
44 delete $ {$package . "::"}{"(" . $_};
45 }
4633a7c4 46 }
47}
48
49sub Overloaded {
a6006777 50 my $package = shift;
51 $package = ref $package if ref $package;
52 $package->can('()');
4633a7c4 53}
54
44a8e56a 55sub ov_method {
56 my $globref = shift;
57 return undef unless $globref;
58 my $sub = \&{*$globref};
59 return $sub if $sub ne \&nil;
60 return shift->can($ {*$globref});
61}
62
4633a7c4 63sub OverloadedStringify {
a6006777 64 my $package = shift;
65 $package = ref $package if ref $package;
44a8e56a 66 #$package->can('(""')
ee239bfe 67 ov_method mycan($package, '(""'), $package
68 or ov_method mycan($package, '(0+'), $package
69 or ov_method mycan($package, '(bool'), $package
70 or ov_method mycan($package, '(nomethod'), $package;
4633a7c4 71}
72
73sub Method {
a6006777 74 my $package = shift;
05a4b9b1 75 if(ref $package) {
4de05ceb 76 local $@;
77 local $!;
78 require Scalar::Util;
05a4b9b1 79 $package = Scalar::Util::blessed($package);
80 return undef if !defined $package;
81 }
44a8e56a 82 #my $meth = $package->can('(' . shift);
83 ov_method mycan($package, '(' . shift), $package;
84 #return $meth if $meth ne \&nil;
85 #return $ {*{$meth}};
4633a7c4 86}
87
88sub AddrRef {
a6006777 89 my $package = ref $_[0];
90 return "$_[0]" unless $package;
b3c0ec7c 91
4de05ceb 92 local $@;
93 local $!;
94 require Scalar::Util;
295812e0 95 my $class = Scalar::Util::blessed($_[0]);
96 my $class_prefix = defined($class) ? "$class=" : "";
97 my $type = Scalar::Util::reftype($_[0]);
98 my $addr = Scalar::Util::refaddr($_[0]);
99 return sprintf("$class_prefix$type(0x%x)", $addr);
4633a7c4 100}
101
1b1d102f 102*StrVal = *AddrRef;
4633a7c4 103
44a8e56a 104sub mycan { # Real can would leave stubs.
105 my ($package, $meth) = @_;
e1a479c5 106
1e9bd118 107 local $@;
108 local $!;
109 require mro;
110
e1a479c5 111 my $mro = mro::get_linear_isa($package);
112 foreach my $p (@$mro) {
113 my $fqmeth = $p . q{::} . $meth;
114 return \*{$fqmeth} if defined &{$fqmeth};
44a8e56a 115 }
e1a479c5 116
44a8e56a 117 return undef;
118}
119
b3ac6de7 120%constants = (
9cfe5470 121 'integer' => 0x1000, # HINT_NEW_INTEGER
122 'float' => 0x2000, # HINT_NEW_FLOAT
123 'binary' => 0x4000, # HINT_NEW_BINARY
124 'q' => 0x8000, # HINT_NEW_STRING
125 'qr' => 0x10000, # HINT_NEW_RE
b3ac6de7 126 );
127
ee239bfe 128%ops = ( with_assign => "+ - * / % ** << >> x .",
129 assign => "+= -= *= /= %= **= <<= >>= x= .=",
2877bd81 130 num_comparison => "< <= > >= == !=",
ee239bfe 131 '3way_comparison'=> "<=> cmp",
2877bd81 132 str_comparison => "lt le gt ge eq ne",
6dd85743 133 binary => '& &= | |= ^ ^=',
ee239bfe 134 unary => "neg ! ~",
135 mutators => '++ --',
f216259d 136 func => "atan2 cos sin exp abs log sqrt int",
ee239bfe 137 conversion => 'bool "" 0+',
f5284f61 138 iterators => '<>',
e2210791 139 filetest => "-X",
f5284f61 140 dereferencing => '${} @{} %{} &{} *{}',
ae20c3aa 141 matching => '~~',
ee239bfe 142 special => 'nomethod fallback =');
143
6b82e2f5 144use warnings::register;
b3ac6de7 145sub constant {
146 # Arguments: what, sub
147 while (@_) {
6b82e2f5 148 if (@_ == 1) {
4498a751 149 warnings::warnif ("Odd number of arguments for overload::constant");
6b82e2f5 150 last;
151 }
152 elsif (!exists $constants {$_ [0]}) {
4498a751 153 warnings::warnif ("`$_[0]' is not an overloadable type");
6b82e2f5 154 }
1e70e886 155 elsif (!ref $_ [1] || "$_[1]" !~ /(^|=)CODE\(0x[0-9a-f]+\)$/) {
6b82e2f5 156 # Can't use C<ref $_[1] eq "CODE"> above as code references can be
157 # blessed, and C<ref> would return the package the ref is blessed into.
158 if (warnings::enabled) {
6b82e2f5 159 $_ [1] = "undef" unless defined $_ [1];
4498a751 160 warnings::warn ("`$_[1]' is not a code reference");
6b82e2f5 161 }
162 }
163 else {
164 $^H{$_[0]} = $_[1];
f22a2069 165 $^H |= $constants{$_[0]};
6b82e2f5 166 }
b3ac6de7 167 shift, shift;
168 }
169}
170
171sub remove_constant {
172 # Arguments: what, sub
173 while (@_) {
174 delete $^H{$_[0]};
175 $^H &= ~ $constants{$_[0]};
176 shift, shift;
177 }
178}
179
4633a7c4 1801;
181
182__END__
183
b267980d 184=head1 NAME
4633a7c4 185
7adf7a02 186overload - Package for overloading Perl operations
4633a7c4 187
188=head1 SYNOPSIS
189
190 package SomeThing;
191
b267980d 192 use overload
4633a7c4 193 '+' => \&myadd,
194 '-' => \&mysub;
195 # etc
196 ...
197
198 package main;
2b393bf4 199 $a = SomeThing->new( 57 );
4633a7c4 200 $b=5+$a;
201 ...
202 if (overload::Overloaded $b) {...}
203 ...
204 $strval = overload::StrVal $b;
205
4633a7c4 206=head1 DESCRIPTION
207
caf82a01 208This pragma allows overloading of Perl's operators for a class.
209To overload built-in functions, see L<perlsub/Overriding Built-in Functions> instead.
210
4633a7c4 211=head2 Declaration of overloaded functions
212
213The compilation directive
214
215 package Number;
216 use overload
b267980d 217 "+" => \&add,
4633a7c4 218 "*=" => "muas";
219
220declares function Number::add() for addition, and method muas() in
221the "class" C<Number> (or one of its base classes)
b267980d 222for the assignment form C<*=> of multiplication.
4633a7c4 223
224Arguments of this directive come in (key, value) pairs. Legal values
e7ea3e70 225are values legal inside a C<&{ ... }> call, so the name of a
226subroutine, a reference to a subroutine, or an anonymous subroutine
227will all work. Note that values specified as strings are
228interpreted as methods, not subroutines. Legal keys are listed below.
4633a7c4 229
230The subroutine C<add> will be called to execute C<$a+$b> if $a
231is a reference to an object blessed into the package C<Number>, or if $a is
232not an object from a package with defined mathemagic addition, but $b is a
233reference to a C<Number>. It can also be called in other situations, like
234C<$a+=7>, or C<$a++>. See L<MAGIC AUTOGENERATION>. (Mathemagical
235methods refer to methods triggered by an overloaded mathematical
236operator.)
237
774d564b 238Since overloading respects inheritance via the @ISA hierarchy, the
239above declaration would also trigger overloading of C<+> and C<*=> in
240all the packages which inherit from C<Number>.
e7ea3e70 241
4633a7c4 242=head2 Calling Conventions for Binary Operations
243
244The functions specified in the C<use overload ...> directive are called
245with three (in one particular case with four, see L<Last Resort>)
246arguments. If the corresponding operation is binary, then the first
247two arguments are the two arguments of the operation. However, due to
248general object calling conventions, the first argument should always be
249an object in the package, so in the situation of C<7+$a>, the
250order of the arguments is interchanged. It probably does not matter
251when implementing the addition method, but whether the arguments
252are reversed is vital to the subtraction method. The method can
253query this information by examining the third argument, which can take
254three different values:
255
256=over 7
257
258=item FALSE
259
260the order of arguments is as in the current operation.
261
262=item TRUE
263
264the arguments are reversed.
265
266=item C<undef>
267
268the current operation is an assignment variant (as in
269C<$a+=7>), but the usual function is called instead. This additional
ee239bfe 270information can be used to generate some optimizations. Compare
271L<Calling Conventions for Mutators>.
4633a7c4 272
273=back
274
275=head2 Calling Conventions for Unary Operations
276
277Unary operation are considered binary operations with the second
278argument being C<undef>. Thus the functions that overloads C<{"++"}>
279is called with arguments C<($a,undef,'')> when $a++ is executed.
280
ee239bfe 281=head2 Calling Conventions for Mutators
282
283Two types of mutators have different calling conventions:
284
88c28ceb 285=over
ee239bfe 286
287=item C<++> and C<-->
288
289The routines which implement these operators are expected to actually
290I<mutate> their arguments. So, assuming that $obj is a reference to a
291number,
292
293 sub incr { my $n = $ {$_[0]}; ++$n; $_[0] = bless \$n}
294
295is an appropriate implementation of overloaded C<++>. Note that
296
297 sub incr { ++$ {$_[0]} ; shift }
298
299is OK if used with preincrement and with postincrement. (In the case
300of postincrement a copying will be performed, see L<Copy Constructor>.)
301
302=item C<x=> and other assignment versions
303
304There is nothing special about these methods. They may change the
305value of their arguments, and may leave it as is. The result is going
306to be assigned to the value in the left-hand-side if different from
307this value.
308
f610777f 309This allows for the same method to be used as overloaded C<+=> and
ee239bfe 310C<+>. Note that this is I<allowed>, but not recommended, since by the
311semantic of L<"Fallback"> Perl will call the method for C<+> anyway,
312if C<+=> is not overloaded.
313
314=back
315
d1be9408 316B<Warning.> Due to the presence of assignment versions of operations,
b267980d 317routines which may be called in assignment context may create
318self-referential structures. Currently Perl will not free self-referential
ee239bfe 319structures until cycles are C<explicitly> broken. You may get problems
320when traversing your structures too.
321
b267980d 322Say,
ee239bfe 323
324 use overload '+' => sub { bless [ \$_[0], \$_[1] ] };
325
326is asking for trouble, since for code C<$obj += $foo> the subroutine
b267980d 327is called as C<$obj = add($obj, $foo, undef)>, or C<$obj = [\$obj,
ee239bfe 328\$foo]>. If using such a subroutine is an important optimization, one
329can overload C<+=> explicitly by a non-"optimized" version, or switch
b267980d 330to non-optimized version if C<not defined $_[2]> (see
ee239bfe 331L<Calling Conventions for Binary Operations>).
332
333Even if no I<explicit> assignment-variants of operators are present in
334the script, they may be generated by the optimizer. Say, C<",$obj,"> or
335C<',' . $obj . ','> may be both optimized to
336
337 my $tmp = ',' . $obj; $tmp .= ',';
338
4633a7c4 339=head2 Overloadable Operations
340
ee239bfe 341The following symbols can be specified in C<use overload> directive:
4633a7c4 342
343=over 5
344
345=item * I<Arithmetic operations>
346
347 "+", "+=", "-", "-=", "*", "*=", "/", "/=", "%", "%=",
348 "**", "**=", "<<", "<<=", ">>", ">>=", "x", "x=", ".", ".=",
349
350For these operations a substituted non-assignment variant can be called if
fa8a6580 351the assignment variant is not available. Methods for operations C<+>,
352C<->, C<+=>, and C<-=> can be called to automatically generate
353increment and decrement methods. The operation C<-> can be used to
4633a7c4 354autogenerate missing methods for unary minus or C<abs>.
355
ee239bfe 356See L<"MAGIC AUTOGENERATION">, L<"Calling Conventions for Mutators"> and
357L<"Calling Conventions for Binary Operations">) for details of these
358substitutions.
359
4633a7c4 360=item * I<Comparison operations>
361
362 "<", "<=", ">", ">=", "==", "!=", "<=>",
363 "lt", "le", "gt", "ge", "eq", "ne", "cmp",
364
365If the corresponding "spaceship" variant is available, it can be
366used to substitute for the missing operation. During C<sort>ing
367arrays, C<cmp> is used to compare values subject to C<use overload>.
368
369=item * I<Bit operations>
370
6dd85743 371 "&", "&=", "^", "^=", "|", "|=", "neg", "!", "~",
4633a7c4 372
fa8a6580 373C<neg> stands for unary minus. If the method for C<neg> is not
3bc6ec80 374specified, it can be autogenerated using the method for
fa8a6580 375subtraction. If the method for C<!> is not specified, it can be
376autogenerated using the methods for C<bool>, or C<"">, or C<0+>.
4633a7c4 377
6dd85743 378The same remarks in L<"Arithmetic operations"> about
379assignment-variants and autogeneration apply for
380bit operations C<"&">, C<"^">, and C<"|"> as well.
381
4633a7c4 382=item * I<Increment and decrement>
383
384 "++", "--",
385
386If undefined, addition and subtraction methods can be
387used instead. These operations are called both in prefix and
388postfix form.
389
390=item * I<Transcendental functions>
391
f216259d 392 "atan2", "cos", "sin", "exp", "abs", "log", "sqrt", "int"
4633a7c4 393
394If C<abs> is unavailable, it can be autogenerated using methods
1fef88e7 395for "E<lt>" or "E<lt>=E<gt>" combined with either unary minus or subtraction.
4633a7c4 396
f216259d 397Note that traditionally the Perl function L<int> rounds to 0, thus for
398floating-point-like types one should follow the same semantic. If
399C<int> is unavailable, it can be autogenerated using the overloading of
400C<0+>.
401
4633a7c4 402=item * I<Boolean, string and numeric conversion>
403
fa8a6580 404 'bool', '""', '0+',
4633a7c4 405
f5284f61 406If one or two of these operations are not overloaded, the remaining ones can
4633a7c4 407be used instead. C<bool> is used in the flow control operators
fa8a6580 408(like C<while>) and for the ternary C<?:> operation. These functions can
4633a7c4 409return any arbitrary Perl value. If the corresponding operation for this value
410is overloaded too, that operation will be called again with this value.
411
1554e226 412As a special case if the overload returns the object itself then it will
413be used directly. An overloaded conversion returning the object is
414probably a bug, because you're likely to get something that looks like
415C<YourPackage=HASH(0x8172b34)>.
416
f5284f61 417=item * I<Iteration>
418
419 "<>"
420
421If not overloaded, the argument will be converted to a filehandle or
422glob (which may require a stringification). The same overloading
423happens both for the I<read-filehandle> syntax C<E<lt>$varE<gt>> and
424I<globbing> syntax C<E<lt>${var}E<gt>>.
425
54f8c773 426B<BUGS> Even in list context, the iterator is currently called only
427once and with scalar context.
428
e2210791 429=item * I<File tests>
430
431 "-X"
432
433This overload is used for all the filetest operators (C<-f>, C<-x> and
434so on: see L<perlfunc/-X> for the full list). Even though these are
435unary operators, the method will be called with a second argument which
436is a single letter indicating which test was performed. Note that the
437overload key is the literal string C<"-X">: you can't provide separate
438overloads for the different tests.
439
440Calling an overloaded filetest operator does not affect the stat value
441associated with the special filehandle C<_>. It still refers to the
442result of the last C<stat>, C<lstat> or unoverloaded filetest.
443
444If not overloaded, these operators will fall back to the default
445behaviour even without C<< fallback => 1 >>. This means that if the
446object is a blessed glob or blessed IO ref it will be treated as a
447filehandle, otherwise string overloading will be invoked and the result
448treated as a filename.
449
450This overload was introduced in perl 5.12.
451
ae20c3aa 452=item * I<Matching>
453
b3ed409d 454The key C<"~~"> allows you to override the smart matching logic used by
455the C<~~> operator and the switch construct (C<given>/C<when>). See
456L<perlsyn/switch> and L<feature>.
ae20c3aa 457
f5284f61 458=item * I<Dereferencing>
459
460 '${}', '@{}', '%{}', '&{}', '*{}'.
461
462If not overloaded, the argument will be dereferenced I<as is>, thus
463should be of correct type. These functions should return a reference
464of correct type, or another object with overloaded dereferencing.
465
b267980d 466As a special case if the overload returns the object itself then it
467will be used directly (provided it is the correct type).
468
469The dereference operators must be specified explicitly they will not be passed to
470"nomethod".
471
4633a7c4 472=item * I<Special>
473
ae20c3aa 474 "nomethod", "fallback", "=".
4633a7c4 475
476see L<SPECIAL SYMBOLS FOR C<use overload>>.
477
478=back
479
ee239bfe 480See L<"Fallback"> for an explanation of when a missing method can be
481autogenerated.
482
483A computer-readable form of the above table is available in the hash
484%overload::ops, with values being space-separated lists of names:
485
486 with_assign => '+ - * / % ** << >> x .',
487 assign => '+= -= *= /= %= **= <<= >>= x= .=',
2877bd81 488 num_comparison => '< <= > >= == !=',
ee239bfe 489 '3way_comparison'=> '<=> cmp',
2877bd81 490 str_comparison => 'lt le gt ge eq ne',
6dd85743 491 binary => '& &= | |= ^ ^=',
ee239bfe 492 unary => 'neg ! ~',
493 mutators => '++ --',
494 func => 'atan2 cos sin exp abs log sqrt',
495 conversion => 'bool "" 0+',
f5284f61 496 iterators => '<>',
e2210791 497 filetest => '-X',
f5284f61 498 dereferencing => '${} @{} %{} &{} *{}',
ae20c3aa 499 matching => '~~',
ee239bfe 500 special => 'nomethod fallback ='
4633a7c4 501
e7ea3e70 502=head2 Inheritance and overloading
503
774d564b 504Inheritance interacts with overloading in two ways.
e7ea3e70 505
88c28ceb 506=over
e7ea3e70 507
508=item Strings as values of C<use overload> directive
509
774d564b 510If C<value> in
e7ea3e70 511
512 use overload key => value;
513
774d564b 514is a string, it is interpreted as a method name.
e7ea3e70 515
516=item Overloading of an operation is inherited by derived classes
517
774d564b 518Any class derived from an overloaded class is also overloaded. The
519set of overloaded methods is the union of overloaded methods of all
520the ancestors. If some method is overloaded in several ancestor, then
e7ea3e70 521which description will be used is decided by the usual inheritance
774d564b 522rules:
e7ea3e70 523
774d564b 524If C<A> inherits from C<B> and C<C> (in this order), C<B> overloads
525C<+> with C<\&D::plus_sub>, and C<C> overloads C<+> by C<"plus_meth">,
526then the subroutine C<D::plus_sub> will be called to implement
527operation C<+> for an object in package C<A>.
e7ea3e70 528
529=back
530
774d564b 531Note that since the value of the C<fallback> key is not a subroutine,
532its inheritance is not governed by the above rules. In the current
533implementation, the value of C<fallback> in the first overloaded
534ancestor is used, but this is accidental and subject to change.
e7ea3e70 535
4633a7c4 536=head1 SPECIAL SYMBOLS FOR C<use overload>
537
538Three keys are recognized by Perl that are not covered by the above
539description.
540
774d564b 541=head2 Last Resort
4633a7c4 542
543C<"nomethod"> should be followed by a reference to a function of four
544parameters. If defined, it is called when the overloading mechanism
545cannot find a method for some operation. The first three arguments of
546this function coincide with the arguments for the corresponding method if
547it were found, the fourth argument is the symbol
548corresponding to the missing method. If several methods are tried,
549the last one is used. Say, C<1-$a> can be equivalent to
550
551 &nomethodMethod($a,1,1,"-")
552
553if the pair C<"nomethod" =E<gt> "nomethodMethod"> was specified in the
554C<use overload> directive.
555
b267980d 556The C<"nomethod"> mechanism is I<not> used for the dereference operators
557( ${} @{} %{} &{} *{} ).
558
559
4633a7c4 560If some operation cannot be resolved, and there is no function
561assigned to C<"nomethod">, then an exception will be raised via die()--
562unless C<"fallback"> was specified as a key in C<use overload> directive.
563
b267980d 564
565=head2 Fallback
4633a7c4 566
567The key C<"fallback"> governs what to do if a method for a particular
568operation is not found. Three different cases are possible depending on
569the value of C<"fallback">:
570
571=over 16
572
573=item * C<undef>
574
575Perl tries to use a
576substituted method (see L<MAGIC AUTOGENERATION>). If this fails, it
577then tries to calls C<"nomethod"> value; if missing, an exception
578will be raised.
579
580=item * TRUE
581
582The same as for the C<undef> value, but no exception is raised. Instead,
583it silently reverts to what it would have done were there no C<use overload>
584present.
585
586=item * defined, but FALSE
587
588No autogeneration is tried. Perl tries to call
b267980d 589C<"nomethod"> value, and if this is missing, raises an exception.
4633a7c4 590
591=back
592
e7ea3e70 593B<Note.> C<"fallback"> inheritance via @ISA is not carved in stone
594yet, see L<"Inheritance and overloading">.
595
4633a7c4 596=head2 Copy Constructor
597
598The value for C<"="> is a reference to a function with three
599arguments, i.e., it looks like the other values in C<use
600overload>. However, it does not overload the Perl assignment
601operator. This would go against Camel hair.
602
603This operation is called in the situations when a mutator is applied
604to a reference that shares its object with some other reference, such
605as
606
b267980d 607 $a=$b;
ee239bfe 608 ++$a;
4633a7c4 609
610To make this change $a and not change $b, a copy of C<$$a> is made,
611and $a is assigned a reference to this new object. This operation is
ee239bfe 612done during execution of the C<++$a>, and not during the assignment,
4633a7c4 613(so before the increment C<$$a> coincides with C<$$b>). This is only
ee239bfe 614done if C<++> is expressed via a method for C<'++'> or C<'+='> (or
615C<nomethod>). Note that if this operation is expressed via C<'+'>
616a nonmutator, i.e., as in
4633a7c4 617
b267980d 618 $a=$b;
4633a7c4 619 $a=$a+1;
620
621then C<$a> does not reference a new copy of C<$$a>, since $$a does not
622appear as lvalue when the above code is executed.
623
624If the copy constructor is required during the execution of some mutator,
625but a method for C<'='> was not specified, it can be autogenerated as a
49c95d58 626string copy if the object is a plain scalar or a simple assignment if it
627is not.
4633a7c4 628
629=over 5
630
631=item B<Example>
632
b267980d 633The actually executed code for
4633a7c4 634
b267980d 635 $a=$b;
4633a7c4 636 Something else which does not modify $a or $b....
637 ++$a;
638
639may be
640
b267980d 641 $a=$b;
4633a7c4 642 Something else which does not modify $a or $b....
643 $a = $a->clone(undef,"");
644 $a->incr(undef,"");
645
646if $b was mathemagical, and C<'++'> was overloaded with C<\&incr>,
647C<'='> was overloaded with C<\&clone>.
648
649=back
650
f610777f 651Same behaviour is triggered by C<$b = $a++>, which is consider a synonym for
ee239bfe 652C<$b = $a; ++$a>.
653
4633a7c4 654=head1 MAGIC AUTOGENERATION
655
656If a method for an operation is not found, and the value for C<"fallback"> is
657TRUE or undefined, Perl tries to autogenerate a substitute method for
658the missing operation based on the defined operations. Autogenerated method
659substitutions are possible for the following operations:
660
661=over 16
662
663=item I<Assignment forms of arithmetic operations>
664
665C<$a+=$b> can use the method for C<"+"> if the method for C<"+=">
666is not defined.
667
b267980d 668=item I<Conversion operations>
4633a7c4 669
670String, numeric, and boolean conversion are calculated in terms of one
671another if not all of them are defined.
672
673=item I<Increment and decrement>
674
675The C<++$a> operation can be expressed in terms of C<$a+=1> or C<$a+1>,
676and C<$a--> in terms of C<$a-=1> and C<$a-1>.
677
678=item C<abs($a)>
679
680can be expressed in terms of C<$aE<lt>0> and C<-$a> (or C<0-$a>).
681
682=item I<Unary minus>
683
684can be expressed in terms of subtraction.
685
3bc6ec80 686=item I<Negation>
687
688C<!> and C<not> can be expressed in terms of boolean conversion, or
689string or numerical conversion.
690
4633a7c4 691=item I<Concatenation>
692
693can be expressed in terms of string conversion.
694
b267980d 695=item I<Comparison operations>
4633a7c4 696
697can be expressed in terms of its "spaceship" counterpart: either
698C<E<lt>=E<gt>> or C<cmp>:
1fef88e7 699
4633a7c4 700 <, >, <=, >=, ==, != in terms of <=>
701 lt, gt, le, ge, eq, ne in terms of cmp
702
f5284f61 703=item I<Iterator>
704
705 <> in terms of builtin operations
706
707=item I<Dereferencing>
708
709 ${} @{} %{} &{} *{} in terms of builtin operations
710
4633a7c4 711=item I<Copy operator>
712
713can be expressed in terms of an assignment to the dereferenced value, if this
49c95d58 714value is a scalar and not a reference, or simply a reference assignment
715otherwise.
4633a7c4 716
717=back
718
84fc275b 719=head1 Minimal set of overloaded operations
720
721Since some operations can be automatically generated from others, there is
722a minimal set of operations that need to be overloaded in order to have
299476e0 723the complete set of overloaded operations at one's disposal.
724Of course, the autogenerated operations may not do exactly what the user
725expects. See L<MAGIC AUTOGENERATION> above. The minimal set is:
84fc275b 726
727 + - * / % ** << >> x
728 <=> cmp
729 & | ^ ~
730 atan2 cos sin exp log sqrt int
731
732Additionally, you need to define at least one of string, boolean or
299476e0 733numeric conversions because any one can be used to emulate the others.
734The string conversion can also be used to emulate concatenation.
84fc275b 735
ee239bfe 736=head1 Losing overloading
4633a7c4 737
738The restriction for the comparison operation is that even if, for example,
739`C<cmp>' should return a blessed reference, the autogenerated `C<lt>'
740function will produce only a standard logical value based on the
741numerical value of the result of `C<cmp>'. In particular, a working
742numeric conversion is needed in this case (possibly expressed in terms of
743other conversions).
744
745Similarly, C<.=> and C<x=> operators lose their mathemagical properties
746if the string conversion substitution is applied.
747
748When you chop() a mathemagical object it is promoted to a string and its
749mathemagical properties are lost. The same can happen with other
750operations as well.
751
752=head1 Run-time Overloading
753
754Since all C<use> directives are executed at compile-time, the only way to
755change overloading during run-time is to
756
757 eval 'use overload "+" => \&addmethod';
758
759You can also use
760
761 eval 'no overload "+", "--", "<="';
762
763though the use of these constructs during run-time is questionable.
764
765=head1 Public functions
766
767Package C<overload.pm> provides the following public functions:
768
769=over 5
770
771=item overload::StrVal(arg)
772
6a0e9e72 773Gives string value of C<arg> as in absence of stringify overloading. If you
774are using this to get the address of a reference (useful for checking if two
775references point to the same thing) then you may be better off using
776C<Scalar::Util::refaddr()>, which is faster.
4633a7c4 777
778=item overload::Overloaded(arg)
779
780Returns true if C<arg> is subject to overloading of some operations.
781
782=item overload::Method(obj,op)
783
784Returns C<undef> or a reference to the method that implements C<op>.
785
786=back
787
b3ac6de7 788=head1 Overloading constants
789
7adf7a02 790For some applications, the Perl parser mangles constants too much.
bfce84ec 791It is possible to hook into this process via C<overload::constant()>
7adf7a02 792and C<overload::remove_constant()> functions.
b3ac6de7 793
794These functions take a hash as an argument. The recognized keys of this hash
7adf7a02 795are:
b3ac6de7 796
797=over 8
798
799=item integer
800
801to overload integer constants,
802
803=item float
804
805to overload floating point constants,
806
807=item binary
808
809to overload octal and hexadecimal constants,
810
811=item q
812
813to overload C<q>-quoted strings, constant pieces of C<qq>- and C<qx>-quoted
814strings and here-documents,
815
816=item qr
817
818to overload constant pieces of regular expressions.
819
820=back
821
822The corresponding values are references to functions which take three arguments:
823the first one is the I<initial> string form of the constant, the second one
b267980d 824is how Perl interprets this constant, the third one is how the constant is used.
b3ac6de7 825Note that the initial string form does not
b267980d 826contain string delimiters, and has backslashes in backslash-delimiter
b3ac6de7 827combinations stripped (thus the value of delimiter is not relevant for
b267980d 828processing of this string). The return value of this function is how this
b3ac6de7 829constant is going to be interpreted by Perl. The third argument is undefined
830unless for overloaded C<q>- and C<qr>- constants, it is C<q> in single-quote
831context (comes from strings, regular expressions, and single-quote HERE
b267980d 832documents), it is C<tr> for arguments of C<tr>/C<y> operators,
b3ac6de7 833it is C<s> for right-hand side of C<s>-operator, and it is C<qq> otherwise.
834
835Since an expression C<"ab$cd,,"> is just a shortcut for C<'ab' . $cd . ',,'>,
836it is expected that overloaded constant strings are equipped with reasonable
b267980d 837overloaded catenation operator, otherwise absurd results will result.
b3ac6de7 838Similarly, negative numbers are considered as negations of positive constants.
839
840Note that it is probably meaningless to call the functions overload::constant()
841and overload::remove_constant() from anywhere but import() and unimport() methods.
842From these methods they may be called as
843
844 sub import {
845 shift;
846 return unless @_;
847 die "unknown import: @_" unless @_ == 1 and $_[0] eq ':constant';
848 overload::constant integer => sub {Math::BigInt->new(shift)};
849 }
850
4633a7c4 851=head1 IMPLEMENTATION
852
853What follows is subject to change RSN.
854
e7ea3e70 855The table of methods for all operations is cached in magic for the
856symbol table hash for the package. The cache is invalidated during
857processing of C<use overload>, C<no overload>, new function
858definitions, and changes in @ISA. However, this invalidation remains
859unprocessed until the next C<bless>ing into the package. Hence if you
860want to change overloading structure dynamically, you'll need an
861additional (fake) C<bless>ing to update the table.
862
863(Every SVish thing has a magic queue, and magic is an entry in that
864queue. This is how a single variable may participate in multiple
865forms of magic simultaneously. For instance, environment variables
866regularly have two forms at once: their %ENV magic and their taint
867magic. However, the magic which implements overloading is applied to
868the stashes, which are rarely used directly, thus should not slow down
869Perl.)
4633a7c4 870
871If an object belongs to a package using overload, it carries a special
872flag. Thus the only speed penalty during arithmetic operations without
873overloading is the checking of this flag.
874
774d564b 875In fact, if C<use overload> is not present, there is almost no overhead
876for overloadable operations, so most programs should not suffer
877measurable performance penalties. A considerable effort was made to
878minimize the overhead when overload is used in some package, but the
879arguments in question do not belong to packages using overload. When
880in doubt, test your speed with C<use overload> and without it. So far
881there have been no reports of substantial speed degradation if Perl is
882compiled with optimization turned on.
4633a7c4 883
e7ea3e70 884There is no size penalty for data if overload is not used. The only
885size penalty if overload is used in some package is that I<all> the
886packages acquire a magic during the next C<bless>ing into the
887package. This magic is three-words-long for packages without
f610777f 888overloading, and carries the cache table if the package is overloaded.
4633a7c4 889
b267980d 890Copying (C<$a=$b>) is shallow; however, a one-level-deep copying is
4633a7c4 891carried out before any operation that can imply an assignment to the
892object $a (or $b) refers to, like C<$a++>. You can override this
893behavior by defining your own copy constructor (see L<"Copy Constructor">).
894
895It is expected that arguments to methods that are not explicitly supposed
896to be changed are constant (but this is not enforced).
897
ee239bfe 898=head1 Metaphor clash
899
f610777f 900One may wonder why the semantic of overloaded C<=> is so counter intuitive.
b267980d 901If it I<looks> counter intuitive to you, you are subject to a metaphor
902clash.
ee239bfe 903
904Here is a Perl object metaphor:
905
906I< object is a reference to blessed data>
907
908and an arithmetic metaphor:
909
910I< object is a thing by itself>.
911
912The I<main> problem of overloading C<=> is the fact that these metaphors
913imply different actions on the assignment C<$a = $b> if $a and $b are
914objects. Perl-think implies that $a becomes a reference to whatever
915$b was referencing. Arithmetic-think implies that the value of "object"
916$a is changed to become the value of the object $b, preserving the fact
917that $a and $b are separate entities.
918
919The difference is not relevant in the absence of mutators. After
920a Perl-way assignment an operation which mutates the data referenced by $a
b267980d 921would change the data referenced by $b too. Effectively, after
ee239bfe 922C<$a = $b> values of $a and $b become I<indistinguishable>.
923
b267980d 924On the other hand, anyone who has used algebraic notation knows the
ee239bfe 925expressive power of the arithmetic metaphor. Overloading works hard
926to enable this metaphor while preserving the Perlian way as far as
d1be9408 927possible. Since it is not possible to freely mix two contradicting
ee239bfe 928metaphors, overloading allows the arithmetic way to write things I<as
929far as all the mutators are called via overloaded access only>. The
930way it is done is described in L<Copy Constructor>.
931
932If some mutator methods are directly applied to the overloaded values,
b267980d 933one may need to I<explicitly unlink> other values which references the
ee239bfe 934same value:
935
2b393bf4 936 $a = Data->new(23);
ee239bfe 937 ...
938 $b = $a; # $b is "linked" to $a
939 ...
940 $a = $a->clone; # Unlink $b from $a
941 $a->increment_by(4);
942
943Note that overloaded access makes this transparent:
944
2b393bf4 945 $a = Data->new(23);
ee239bfe 946 $b = $a; # $b is "linked" to $a
947 $a += 4; # would unlink $b automagically
948
949However, it would not make
950
2b393bf4 951 $a = Data->new(23);
ee239bfe 952 $a = 4; # Now $a is a plain 4, not 'Data'
953
954preserve "objectness" of $a. But Perl I<has> a way to make assignments
955to an object do whatever you want. It is just not the overload, but
956tie()ing interface (see L<perlfunc/tie>). Adding a FETCH() method
b267980d 957which returns the object itself, and STORE() method which changes the
ee239bfe 958value of the object, one can reproduce the arithmetic metaphor in its
959completeness, at least for variables which were tie()d from the start.
960
961(Note that a workaround for a bug may be needed, see L<"BUGS">.)
962
963=head1 Cookbook
964
965Please add examples to what follows!
966
967=head2 Two-face scalars
968
969Put this in F<two_face.pm> in your Perl library directory:
970
971 package two_face; # Scalars with separate string and
972 # numeric values.
973 sub new { my $p = shift; bless [@_], $p }
974 use overload '""' => \&str, '0+' => \&num, fallback => 1;
975 sub num {shift->[1]}
976 sub str {shift->[0]}
977
978Use it as follows:
979
980 require two_face;
2b393bf4 981 my $seven = two_face->new("vii", 7);
ee239bfe 982 printf "seven=$seven, seven=%d, eight=%d\n", $seven, $seven+1;
983 print "seven contains `i'\n" if $seven =~ /i/;
984
985(The second line creates a scalar which has both a string value, and a
986numeric value.) This prints:
987
988 seven=vii, seven=7, eight=8
989 seven contains `i'
990
f5284f61 991=head2 Two-face references
992
993Suppose you want to create an object which is accessible as both an
6d822dc4 994array reference and a hash reference.
f5284f61 995
996 package two_refs;
997 use overload '%{}' => \&gethash, '@{}' => sub { $ {shift()} };
b267980d 998 sub new {
999 my $p = shift;
f5284f61 1000 bless \ [@_], $p;
1001 }
1002 sub gethash {
1003 my %h;
1004 my $self = shift;
1005 tie %h, ref $self, $self;
1006 \%h;
1007 }
1008
1009 sub TIEHASH { my $p = shift; bless \ shift, $p }
1010 my %fields;
1011 my $i = 0;
1012 $fields{$_} = $i++ foreach qw{zero one two three};
b267980d 1013 sub STORE {
f5284f61 1014 my $self = ${shift()};
1015 my $key = $fields{shift()};
1016 defined $key or die "Out of band access";
1017 $$self->[$key] = shift;
1018 }
b267980d 1019 sub FETCH {
f5284f61 1020 my $self = ${shift()};
1021 my $key = $fields{shift()};
1022 defined $key or die "Out of band access";
1023 $$self->[$key];
1024 }
1025
1026Now one can access an object using both the array and hash syntax:
1027
2b393bf4 1028 my $bar = two_refs->new(3,4,5,6);
f5284f61 1029 $bar->[2] = 11;
1030 $bar->{two} == 11 or die 'bad hash fetch';
1031
1032Note several important features of this example. First of all, the
1033I<actual> type of $bar is a scalar reference, and we do not overload
1034the scalar dereference. Thus we can get the I<actual> non-overloaded
1035contents of $bar by just using C<$$bar> (what we do in functions which
1036overload dereference). Similarly, the object returned by the
1037TIEHASH() method is a scalar reference.
1038
1039Second, we create a new tied hash each time the hash syntax is used.
1040This allows us not to worry about a possibility of a reference loop,
d1be9408 1041which would lead to a memory leak.
f5284f61 1042
1043Both these problems can be cured. Say, if we want to overload hash
1044dereference on a reference to an object which is I<implemented> as a
1045hash itself, the only problem one has to circumvent is how to access
1fd16925 1046this I<actual> hash (as opposed to the I<virtual> hash exhibited by the
f5284f61 1047overloaded dereference operator). Here is one possible fetching routine:
1048
1049 sub access_hash {
1050 my ($self, $key) = (shift, shift);
1051 my $class = ref $self;
b267980d 1052 bless $self, 'overload::dummy'; # Disable overloading of %{}
f5284f61 1053 my $out = $self->{$key};
1054 bless $self, $class; # Restore overloading
1055 $out;
1056 }
1057
1fd16925 1058To remove creation of the tied hash on each access, one may an extra
f5284f61 1059level of indirection which allows a non-circular structure of references:
1060
1061 package two_refs1;
1062 use overload '%{}' => sub { ${shift()}->[1] },
1063 '@{}' => sub { ${shift()}->[0] };
b267980d 1064 sub new {
1065 my $p = shift;
f5284f61 1066 my $a = [@_];
1067 my %h;
1068 tie %h, $p, $a;
1069 bless \ [$a, \%h], $p;
1070 }
1071 sub gethash {
1072 my %h;
1073 my $self = shift;
1074 tie %h, ref $self, $self;
1075 \%h;
1076 }
1077
1078 sub TIEHASH { my $p = shift; bless \ shift, $p }
1079 my %fields;
1080 my $i = 0;
1081 $fields{$_} = $i++ foreach qw{zero one two three};
b267980d 1082 sub STORE {
f5284f61 1083 my $a = ${shift()};
1084 my $key = $fields{shift()};
1085 defined $key or die "Out of band access";
1086 $a->[$key] = shift;
1087 }
b267980d 1088 sub FETCH {
f5284f61 1089 my $a = ${shift()};
1090 my $key = $fields{shift()};
1091 defined $key or die "Out of band access";
1092 $a->[$key];
1093 }
1094
1fd16925 1095Now if $baz is overloaded like this, then C<$baz> is a reference to a
f5284f61 1096reference to the intermediate array, which keeps a reference to an
1097actual array, and the access hash. The tie()ing object for the access
1fd16925 1098hash is a reference to a reference to the actual array, so
f5284f61 1099
88c28ceb 1100=over
f5284f61 1101
1102=item *
1103
1104There are no loops of references.
1105
1106=item *
1107
1108Both "objects" which are blessed into the class C<two_refs1> are
1109references to a reference to an array, thus references to a I<scalar>.
1110Thus the accessor expression C<$$foo-E<gt>[$ind]> involves no
1111overloaded operations.
1112
1113=back
1114
ee239bfe 1115=head2 Symbolic calculator
1116
1117Put this in F<symbolic.pm> in your Perl library directory:
1118
1119 package symbolic; # Primitive symbolic calculator
1120 use overload nomethod => \&wrap;
1121
1122 sub new { shift; bless ['n', @_] }
1123 sub wrap {
1124 my ($obj, $other, $inv, $meth) = @_;
1125 ($obj, $other) = ($other, $obj) if $inv;
1126 bless [$meth, $obj, $other];
1127 }
1128
1129This module is very unusual as overloaded modules go: it does not
88c28ceb 1130provide any usual overloaded operators, instead it provides the L<Last
1131Resort> operator C<nomethod>. In this example the corresponding
f610777f 1132subroutine returns an object which encapsulates operations done over
2b393bf4 1133the objects: C<< symbolic->new(3) >> contains C<['n', 3]>, C<< 2 +
1134symbolic->new(3) >> contains C<['+', 2, ['n', 3]]>.
ee239bfe 1135
1136Here is an example of the script which "calculates" the side of
1137circumscribed octagon using the above package:
1138
1139 require symbolic;
1140 my $iter = 1; # 2**($iter+2) = 8
2b393bf4 1141 my $side = symbolic->new(1);
ee239bfe 1142 my $cnt = $iter;
3cb6de81 1143
ee239bfe 1144 while ($cnt--) {
1145 $side = (sqrt(1 + $side**2) - 1)/$side;
1146 }
1147 print "OK\n";
1148
1149The value of $side is
1150
1151 ['/', ['-', ['sqrt', ['+', 1, ['**', ['n', 1], 2]],
1152 undef], 1], ['n', 1]]
1153
1154Note that while we obtained this value using a nice little script,
1155there is no simple way to I<use> this value. In fact this value may
2d3232d7 1156be inspected in debugger (see L<perldebug>), but only if
ee239bfe 1157C<bareStringify> B<O>ption is set, and not via C<p> command.
1158
1159If one attempts to print this value, then the overloaded operator
1160C<""> will be called, which will call C<nomethod> operator. The
1161result of this operator will be stringified again, but this result is
1162again of type C<symbolic>, which will lead to an infinite loop.
1163
1164Add a pretty-printer method to the module F<symbolic.pm>:
1165
1166 sub pretty {
1167 my ($meth, $a, $b) = @{+shift};
1168 $a = 'u' unless defined $a;
1169 $b = 'u' unless defined $b;
1170 $a = $a->pretty if ref $a;
1171 $b = $b->pretty if ref $b;
1172 "[$meth $a $b]";
b267980d 1173 }
ee239bfe 1174
1175Now one can finish the script by
1176
1177 print "side = ", $side->pretty, "\n";
1178
1179The method C<pretty> is doing object-to-string conversion, so it
1180is natural to overload the operator C<""> using this method. However,
1181inside such a method it is not necessary to pretty-print the
1182I<components> $a and $b of an object. In the above subroutine
1183C<"[$meth $a $b]"> is a catenation of some strings and components $a
1184and $b. If these components use overloading, the catenation operator
1fd16925 1185will look for an overloaded operator C<.>; if not present, it will
ee239bfe 1186look for an overloaded operator C<"">. Thus it is enough to use
1187
1188 use overload nomethod => \&wrap, '""' => \&str;
1189 sub str {
1190 my ($meth, $a, $b) = @{+shift};
1191 $a = 'u' unless defined $a;
1192 $b = 'u' unless defined $b;
1193 "[$meth $a $b]";
b267980d 1194 }
ee239bfe 1195
1196Now one can change the last line of the script to
1197
1198 print "side = $side\n";
1199
1200which outputs
1201
1202 side = [/ [- [sqrt [+ 1 [** [n 1 u] 2]] u] 1] [n 1 u]]
1203
1204and one can inspect the value in debugger using all the possible
b267980d 1205methods.
ee239bfe 1206
d1be9408 1207Something is still amiss: consider the loop variable $cnt of the
ee239bfe 1208script. It was a number, not an object. We cannot make this value of
1209type C<symbolic>, since then the loop will not terminate.
1210
1211Indeed, to terminate the cycle, the $cnt should become false.
1212However, the operator C<bool> for checking falsity is overloaded (this
1213time via overloaded C<"">), and returns a long string, thus any object
1214of type C<symbolic> is true. To overcome this, we need a way to
1215compare an object to 0. In fact, it is easier to write a numeric
1216conversion routine.
1217
1218Here is the text of F<symbolic.pm> with such a routine added (and
f610777f 1219slightly modified str()):
ee239bfe 1220
1221 package symbolic; # Primitive symbolic calculator
1222 use overload
1223 nomethod => \&wrap, '""' => \&str, '0+' => \&num;
1224
1225 sub new { shift; bless ['n', @_] }
1226 sub wrap {
1227 my ($obj, $other, $inv, $meth) = @_;
1228 ($obj, $other) = ($other, $obj) if $inv;
1229 bless [$meth, $obj, $other];
1230 }
1231 sub str {
1232 my ($meth, $a, $b) = @{+shift};
1233 $a = 'u' unless defined $a;
1234 if (defined $b) {
1235 "[$meth $a $b]";
1236 } else {
1237 "[$meth $a]";
1238 }
b267980d 1239 }
1240 my %subr = ( n => sub {$_[0]},
1241 sqrt => sub {sqrt $_[0]},
ee239bfe 1242 '-' => sub {shift() - shift()},
1243 '+' => sub {shift() + shift()},
1244 '/' => sub {shift() / shift()},
1245 '*' => sub {shift() * shift()},
1246 '**' => sub {shift() ** shift()},
1247 );
1248 sub num {
1249 my ($meth, $a, $b) = @{+shift};
b267980d 1250 my $subr = $subr{$meth}
ee239bfe 1251 or die "Do not know how to ($meth) in symbolic";
1252 $a = $a->num if ref $a eq __PACKAGE__;
1253 $b = $b->num if ref $b eq __PACKAGE__;
1254 $subr->($a,$b);
1255 }
1256
1257All the work of numeric conversion is done in %subr and num(). Of
f610777f 1258course, %subr is not complete, it contains only operators used in the
ee239bfe 1259example below. Here is the extra-credit question: why do we need an
1260explicit recursion in num()? (Answer is at the end of this section.)
1261
1262Use this module like this:
1263
1264 require symbolic;
2b393bf4 1265 my $iter = symbolic->new(2); # 16-gon
1266 my $side = symbolic->new(1);
ee239bfe 1267 my $cnt = $iter;
3cb6de81 1268
ee239bfe 1269 while ($cnt) {
1270 $cnt = $cnt - 1; # Mutator `--' not implemented
1271 $side = (sqrt(1 + $side**2) - 1)/$side;
1272 }
1273 printf "%s=%f\n", $side, $side;
1274 printf "pi=%f\n", $side*(2**($iter+2));
1275
1276It prints (without so many line breaks)
1277
1278 [/ [- [sqrt [+ 1 [** [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1]
1279 [n 1]] 2]]] 1]
1280 [/ [- [sqrt [+ 1 [** [n 1] 2]]] 1] [n 1]]]=0.198912
1281 pi=3.182598
1282
1283The above module is very primitive. It does not implement
1284mutator methods (C<++>, C<-=> and so on), does not do deep copying
1285(not required without mutators!), and implements only those arithmetic
1286operations which are used in the example.
1287
1fd16925 1288To implement most arithmetic operations is easy; one should just use
ee239bfe 1289the tables of operations, and change the code which fills %subr to
1290
1291 my %subr = ( 'n' => sub {$_[0]} );
1292 foreach my $op (split " ", $overload::ops{with_assign}) {
1293 $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}";
1294 }
1295 my @bins = qw(binary 3way_comparison num_comparison str_comparison);
1296 foreach my $op (split " ", "@overload::ops{ @bins }") {
1297 $subr{$op} = eval "sub {shift() $op shift()}";
1298 }
1299 foreach my $op (split " ", "@overload::ops{qw(unary func)}") {
1300 print "defining `$op'\n";
1301 $subr{$op} = eval "sub {$op shift()}";
1302 }
1303
1304Due to L<Calling Conventions for Mutators>, we do not need anything
1305special to make C<+=> and friends work, except filling C<+=> entry of
1306%subr, and defining a copy constructor (needed since Perl has no
1307way to know that the implementation of C<'+='> does not mutate
1308the argument, compare L<Copy Constructor>).
1309
1fd16925 1310To implement a copy constructor, add C<< '=' => \&cpy >> to C<use overload>
ee239bfe 1311line, and code (this code assumes that mutators change things one level
1312deep only, so recursive copying is not needed):
1313
1314 sub cpy {
1315 my $self = shift;
1316 bless [@$self], ref $self;
1317 }
1318
b267980d 1319To make C<++> and C<--> work, we need to implement actual mutators,
ee239bfe 1320either directly, or in C<nomethod>. We continue to do things inside
1321C<nomethod>, thus add
1322
1323 if ($meth eq '++' or $meth eq '--') {
1324 @$obj = ($meth, (bless [@$obj]), 1); # Avoid circular reference
1325 return $obj;
1326 }
1327
b267980d 1328after the first line of wrap(). This is not a most effective
ee239bfe 1329implementation, one may consider
1330
1331 sub inc { $_[0] = bless ['++', shift, 1]; }
1332
1333instead.
1334
1335As a final remark, note that one can fill %subr by
1336
1337 my %subr = ( 'n' => sub {$_[0]} );
1338 foreach my $op (split " ", $overload::ops{with_assign}) {
1339 $subr{$op} = $subr{"$op="} = eval "sub {shift() $op shift()}";
1340 }
1341 my @bins = qw(binary 3way_comparison num_comparison str_comparison);
1342 foreach my $op (split " ", "@overload::ops{ @bins }") {
1343 $subr{$op} = eval "sub {shift() $op shift()}";
1344 }
1345 foreach my $op (split " ", "@overload::ops{qw(unary func)}") {
1346 $subr{$op} = eval "sub {$op shift()}";
1347 }
1348 $subr{'++'} = $subr{'+'};
1349 $subr{'--'} = $subr{'-'};
1350
b267980d 1351This finishes implementation of a primitive symbolic calculator in
135250 lines of Perl code. Since the numeric values of subexpressions
ee239bfe 1353are not cached, the calculator is very slow.
1354
1355Here is the answer for the exercise: In the case of str(), we need no
1356explicit recursion since the overloaded C<.>-operator will fall back
1357to an existing overloaded operator C<"">. Overloaded arithmetic
1358operators I<do not> fall back to numeric conversion if C<fallback> is
1359not explicitly requested. Thus without an explicit recursion num()
1360would convert C<['+', $a, $b]> to C<$a + $b>, which would just rebuild
1361the argument of num().
1362
1363If you wonder why defaults for conversion are different for str() and
1364num(), note how easy it was to write the symbolic calculator. This
1365simplicity is due to an appropriate choice of defaults. One extra
f610777f 1366note: due to the explicit recursion num() is more fragile than sym():
1367we need to explicitly check for the type of $a and $b. If components
ee239bfe 1368$a and $b happen to be of some related type, this may lead to problems.
1369
1370=head2 I<Really> symbolic calculator
1371
1372One may wonder why we call the above calculator symbolic. The reason
1373is that the actual calculation of the value of expression is postponed
1374until the value is I<used>.
1375
1376To see it in action, add a method
1377
b267980d 1378 sub STORE {
1379 my $obj = shift;
1380 $#$obj = 1;
ee239bfe 1381 @$obj->[0,1] = ('=', shift);
1382 }
1383
1384to the package C<symbolic>. After this change one can do
1385
2b393bf4 1386 my $a = symbolic->new(3);
1387 my $b = symbolic->new(4);
ee239bfe 1388 my $c = sqrt($a**2 + $b**2);
1389
1390and the numeric value of $c becomes 5. However, after calling
1391
1392 $a->STORE(12); $b->STORE(5);
1393
1394the numeric value of $c becomes 13. There is no doubt now that the module
1395symbolic provides a I<symbolic> calculator indeed.
1396
1397To hide the rough edges under the hood, provide a tie()d interface to the
1398package C<symbolic> (compare with L<Metaphor clash>). Add methods
1399
1400 sub TIESCALAR { my $pack = shift; $pack->new(@_) }
1401 sub FETCH { shift }
1402 sub nop { } # Around a bug
1403
1404(the bug is described in L<"BUGS">). One can use this new interface as
1405
1406 tie $a, 'symbolic', 3;
1407 tie $b, 'symbolic', 4;
1408 $a->nop; $b->nop; # Around a bug
1409
1410 my $c = sqrt($a**2 + $b**2);
1411
1412Now numeric value of $c is 5. After C<$a = 12; $b = 5> the numeric value
1413of $c becomes 13. To insulate the user of the module add a method
1414
1415 sub vars { my $p = shift; tie($_, $p), $_->nop foreach @_; }
1416
1417Now
1418
1419 my ($a, $b);
1420 symbolic->vars($a, $b);
1421 my $c = sqrt($a**2 + $b**2);
1422
1423 $a = 3; $b = 4;
1424 printf "c5 %s=%f\n", $c, $c;
1425
1426 $a = 12; $b = 5;
1427 printf "c13 %s=%f\n", $c, $c;
1428
1429shows that the numeric value of $c follows changes to the values of $a
1430and $b.
1431
4633a7c4 1432=head1 AUTHOR
1433
1fef88e7 1434Ilya Zakharevich E<lt>F<ilya@math.mps.ohio-state.edu>E<gt>.
4633a7c4 1435
7e494759 1436=head1 SEE ALSO
1437
1438The L<overloading> pragma can be used to enable or disable overloaded
1439operations within a lexical scope.
1440
4633a7c4 1441=head1 DIAGNOSTICS
1442
1443When Perl is run with the B<-Do> switch or its equivalent, overloading
1444induces diagnostic messages.
1445
e7ea3e70 1446Using the C<m> command of Perl debugger (see L<perldebug>) one can
1447deduce which operations are overloaded (and which ancestor triggers
1448this overloading). Say, if C<eq> is overloaded, then the method C<(eq>
1449is shown by debugger. The method C<()> corresponds to the C<fallback>
1450key (in fact a presence of this method shows that this package has
1451overloading enabled, and it is what is used by the C<Overloaded>
ee239bfe 1452function of module C<overload>).
e7ea3e70 1453
6ad11d81 1454The module might issue the following warnings:
6b82e2f5 1455
1456=over 4
1457
1458=item Odd number of arguments for overload::constant
1459
1460(W) The call to overload::constant contained an odd number of arguments.
1461The arguments should come in pairs.
1462
1463=item `%s' is not an overloadable type
1464
1465(W) You tried to overload a constant type the overload package is unaware of.
1466
1467=item `%s' is not a code reference
1468
1469(W) The second (fourth, sixth, ...) argument of overload::constant needs
1470to be a code reference. Either an anonymous subroutine, or a reference
1471to a subroutine.
1472
1473=back
1474
4633a7c4 1475=head1 BUGS
1476
aa689395 1477Because it is used for overloading, the per-package hash %OVERLOAD now
1478has a special meaning in Perl. The symbol table is filled with names
1479looking like line-noise.
4633a7c4 1480
a6006777 1481For the purpose of inheritance every overloaded package behaves as if
1482C<fallback> is present (possibly undefined). This may create
1483interesting effects if some package is not overloaded, but inherits
1484from two overloaded packages.
4633a7c4 1485
b267980d 1486Relation between overloading and tie()ing is broken. Overloading is
ee239bfe 1487triggered or not basing on the I<previous> class of tie()d value.
1488
b267980d 1489This happens because the presence of overloading is checked too early,
ee239bfe 1490before any tie()d access is attempted. If the FETCH()ed class of the
b267980d 1491tie()d value does not change, a simple workaround is to access the value
ee239bfe 1492immediately after tie()ing, so that after this call the I<previous> class
1493coincides with the current one.
1494
1495B<Needed:> a way to fix this without a speed penalty.
1496
b3ac6de7 1497Barewords are not covered by overloaded string constants.
1498
ee239bfe 1499This document is confusing. There are grammos and misleading language
1500used in places. It would seem a total rewrite is needed.
4633a7c4 1501
1502=cut
1503