X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Foverload.pm;h=c02fddbfab2e5243b4bb89aab8fcc67cbd45853d;hb=8d115822ac460e3494c9fe3f3452d7331adea3d7;hp=e11c30f5a2cc1a9effbd3d09d7a5e4c8ecfeec0f;hpb=98225a64488c895097b3ce3f7ac9c94f464be86b;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/overload.pm b/lib/overload.pm index e11c30f..c02fddb 100644 --- a/lib/overload.pm +++ b/lib/overload.pm @@ -1,8 +1,6 @@ package overload; -our $VERSION = '1.04'; - -$overload::hint_bits = 0x20000; # HINT_LOCALIZE_HH +our $VERSION = '1.06'; sub nil {} @@ -74,7 +72,13 @@ sub OverloadedStringify { sub Method { my $package = shift; - $package = ref $package if ref $package; + if(ref $package) { + local $@; + local $!; + require Scalar::Util; + $package = Scalar::Util::blessed($package); + return undef if !defined $package; + } #my $meth = $package->can('(' . shift); ov_method mycan($package, '(' . shift), $package; #return $meth if $meth ne \&nil; @@ -85,24 +89,27 @@ sub AddrRef { my $package = ref $_[0]; return "$_[0]" unless $package; - require Scalar::Util; - my $class = Scalar::Util::blessed($_[0]); - my $class_prefix = defined($class) ? "$class=" : ""; - my $type = Scalar::Util::reftype($_[0]); - my $addr = Scalar::Util::refaddr($_[0]); - return sprintf("$class_prefix$type(0x%x)", $addr); + local $@; + local $!; + require Scalar::Util; + my $class = Scalar::Util::blessed($_[0]); + my $class_prefix = defined($class) ? "$class=" : ""; + my $type = Scalar::Util::reftype($_[0]); + my $addr = Scalar::Util::refaddr($_[0]); + return sprintf("$class_prefix$type(0x%x)", $addr); } *StrVal = *AddrRef; sub mycan { # Real can would leave stubs. my ($package, $meth) = @_; - return \*{$package . "::$meth"} if defined &{$package . "::$meth"}; - my $p; - foreach $p (@{$package . "::ISA"}) { - my $out = mycan($p, $meth); - return $out if $out; + + my $mro = mro::get_linear_isa($package); + foreach my $p (@$mro) { + my $fqmeth = $p . q{::} . $meth; + return \*{$fqmeth} if defined &{$fqmeth}; } + return undef; } @@ -119,7 +126,7 @@ sub mycan { # Real can would leave stubs. num_comparison => "< <= > >= == !=", '3way_comparison'=> "<=> cmp", str_comparison => "lt le gt ge eq ne", - binary => "& | ^", + binary => '& &= | |= ^ ^=', unary => "neg ! ~", mutators => '++ --', func => "atan2 cos sin exp abs log sqrt int", @@ -149,7 +156,7 @@ sub constant { } else { $^H{$_[0]} = $_[1]; - $^H |= $constants{$_[0]} | $overload::hint_bits; + $^H |= $constants{$_[0]}; } shift, shift; } @@ -352,13 +359,17 @@ arrays, C is used to compare values subject to C. =item * I - "&", "^", "|", "neg", "!", "~", + "&", "&=", "^", "^=", "|", "|=", "neg", "!", "~", C stands for unary minus. If the method for C is not specified, it can be autogenerated using the method for subtraction. If the method for C is not specified, it can be autogenerated using the methods for C, or C<"">, or C<0+>. +The same remarks in L<"Arithmetic operations"> about +assignment-variants and autogeneration apply for +bit operations C<"&">, C<"^">, and C<"|"> as well. + =item * I "++", "--", @@ -439,7 +450,7 @@ A computer-readable form of the above table is available in the hash num_comparison => '< <= > >= == !=', '3way_comparison'=> '<=> cmp', str_comparison => 'lt le gt ge eq ne', - binary => '& | ^', + binary => '& &= | |= ^ ^=', unary => 'neg ! ~', mutators => '++ --', func => 'atan2 cos sin exp abs log sqrt', @@ -517,11 +528,6 @@ The key C<"fallback"> governs what to do if a method for a particular operation is not found. Three different cases are possible depending on the value of C<"fallback">: -=head2 Smart Match - -The key C<"~~"> allows you to override the smart matching used by -the switch construct. See L. - =over 16 =item * C @@ -547,6 +553,11 @@ C<"nomethod"> value, and if this is missing, raises an exception. B C<"fallback"> inheritance via @ISA is not carved in stone yet, see L<"Inheritance and overloading">. +=head2 Smart Match + +The key C<"~~"> allows you to override the smart matching used by +the switch construct. See L. + =head2 Copy Constructor The value for C<"="> is a reference to a function with three @@ -668,6 +679,23 @@ value is a scalar and not a reference. =back +=head1 Minimal set of overloaded operations + +Since some operations can be automatically generated from others, there is +a minimal set of operations that need to be overloaded in order to have +the complete set of overloaded operations at one's disposal. +Of course, the autogenerated operations may not do exactly what the user +expects. See L above. The minimal set is: + + + - * / % ** << >> x + <=> cmp + & | ^ ~ + atan2 cos sin exp log sqrt int + +Additionally, you need to define at least one of string, boolean or +numeric conversions because any one can be used to emulate the others. +The string conversion can also be used to emulate concatenation. + =head1 Losing overloading The restriction for the comparison operation is that even if, for example, @@ -1088,7 +1116,7 @@ The value of $side is Note that while we obtained this value using a nice little script, there is no simple way to I this value. In fact this value may -be inspected in debugger (see L), but ony if +be inspected in debugger (see L), but only if C Bption is set, and not via C

command. If one attempts to print this value, then the overloaded operator