X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Foverload.pm;h=8a07efec6974a1d237abc7f820d3cc3b7d1b5758;hb=7b9ef14019d3c4d1aa14641dbd421c81c2cd18a4;hp=81c859869473d88c2afbf6ebd718ca5727ac452f;hpb=9cfe5470b44e33f00045a3b9c3128c6ade6e813f;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/overload.pm b/lib/overload.pm index 81c8598..8a07efe 100644 --- a/lib/overload.pm +++ b/lib/overload.pm @@ -1,6 +1,6 @@ package overload; -our $VERSION = '1.00'; +our $VERSION = '1.03'; $overload::hint_bits = 0x20000; # HINT_LOCALIZE_HH @@ -84,18 +84,17 @@ sub Method { sub AddrRef { my $package = ref $_[0]; return "$_[0]" unless $package; - bless $_[0], overload::Fake; # Non-overloaded package - my $str = "$_[0]"; - bless $_[0], $package; # Back - $package . substr $str, index $str, '='; -} -sub StrVal { - (ref $_[0] && OverloadedStringify($_[0]) or ref($_[0]) eq 'Regexp') ? - (AddrRef(shift)) : - "$_[0]"; + 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"}; @@ -171,7 +170,7 @@ __END__ =head1 NAME -overload - Package for overloading perl operations +overload - Package for overloading Perl operations =head1 SYNOPSIS @@ -423,7 +422,7 @@ The dereference operators must be specified explicitly they will not be passed t =item * I - "nomethod", "fallback", "=", + "nomethod", "fallback", "=", "~~", see L>. @@ -518,6 +517,11 @@ 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 @@ -701,7 +705,10 @@ Package C provides the following public functions: =item overload::StrVal(arg) -Gives string value of C as in absence of stringify overloading. +Gives string value of C as in absence of stringify overloading. If you +are using this to get the address of a reference (useful for checking if two +references point to the same thing) then you may be better off using +C, which is faster. =item overload::Overloaded(arg) @@ -715,12 +722,12 @@ Returns C or a reference to the method that implements C. =head1 Overloading constants -For some application Perl parser mangles constants too much. It is possible -to hook into this process via overload::constant() and overload::remove_constant() -functions. +For some applications, the Perl parser mangles constants too much. +It is possible to hook into this process via C +and C functions. These functions take a hash as an argument. The recognized keys of this hash -are +are: =over 8