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