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