X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2Foverload.pm;h=71b550ad5300d0739852d47e150c15704e1c227e;hb=53273a086103cdbbf7ebdd5f1a18b2c0777cbc1b;hp=fb1a0d1236e89813f8e812b4c946fc02d39cd55f;hpb=7377d752f328690fcb4417d17046f5d18d3582d6;p=p5sagit%2Fp5-mst-13.2.git diff --git a/lib/overload.pm b/lib/overload.pm index fb1a0d1..71b550a 100644 --- a/lib/overload.pm +++ b/lib/overload.pm @@ -1,8 +1,8 @@ package overload; -our $VERSION = '1.00'; +our $VERSION = '1.03'; -$overload::hint_bits = 0x20000; +$overload::hint_bits = 0x20000; # HINT_LOCALIZE_HH sub nil {} @@ -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"}; @@ -108,11 +107,11 @@ sub mycan { # Real can would leave stubs. } %constants = ( - 'integer' => 0x1000, - 'float' => 0x2000, - 'binary' => 0x4000, - 'q' => 0x8000, - 'qr' => 0x10000, + 'integer' => 0x1000, # HINT_NEW_INTEGER + 'float' => 0x2000, # HINT_NEW_FLOAT + 'binary' => 0x4000, # HINT_NEW_BINARY + 'q' => 0x8000, # HINT_NEW_STRING + 'qr' => 0x10000, # HINT_NEW_RE ); %ops = ( with_assign => "+ - * / % ** << >> x .", @@ -701,7 +700,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) @@ -922,10 +924,7 @@ numeric value.) This prints: =head2 Two-face references Suppose you want to create an object which is accessible as both an -array reference and a hash reference, similar to the -L -builtin Perl type. Let's make it better than a pseudo-hash by -allowing index 0 to be treated as a normal element. +array reference and a hash reference. package two_refs; use overload '%{}' => \&gethash, '@{}' => sub { $ {shift()} };