I was all ready to use the following bit of code in one of my modules to let it build properly with ActivePerl:
use Scalar::Util; BEGIN { if ( defined &Scalar::Util::refaddr ) { *_ident = \&Scalar::Util::refaddr; } else { require overload; *_ident = sub { my ( $object ) = @_; if ( overload::Method($object, '""') ) { croak "Overloaded stringification requires &Scalar::Util::refaddr (version 1.08 or greater)"; } return "$object"; }; } }
Then I double-checked and saw that refaddr is a pure Perl function. Regrettably, I copied it into my code:
sub _refaddr($) { my $pkg = ref( $_[0] ) or return undef; if ( blessed( $_[0] ) ) { bless $_[0], 'Class::BuildMethods::Fake'; } else { $pkg = undef; } "$_[0]" =~ /0x(\w+)/; my $i = do { local $^W; hex $1 }; bless $_[0], $pkg if defined $pkg; $i; }
This raises an interesting, but ugly, question. What about a module which provides functionality which core modules have, but only in upgraded versions which AS does not provide? For example:
use Module::Substitute 'Scalar::Util' => [qw/refaddr openhandle/];
That's a terrible name, but this would be something designed to not go into core, thus allowing people to use these extra functions if they want to build on ActiveState. I really hate the idea of duplicating this code, but this might be a way to get around some of the AS build problems.