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