use List::Util;
use Scalar::Util 'blessed';
-our $VERSION = '0.002';
+use constant REDUCE => ($] >= 5.008009 ? \&List::Util::reduce : \&_reduce);
+
+our $VERSION = '0.004';
sub new {
my $class = shift;
sub reduce {
my $self = shift;
@_ = (@_, @$self);
- goto &List::Util::reduce;
+ goto &{REDUCE()};
}
sub reverse { $_[0]->new(reverse @{$_[0]}) }
map { _ref($_) ? _flatten(@$_) : $_ } @_;
}
+# For perl < 5.8.9
+sub _reduce (&@) {
+ my $code = shift;
+
+ return shift unless @_ > 1;
+
+ my $caller = caller;
+
+ no strict 'refs';
+
+ local (*{"${caller}::a"}, *{"${caller}::b"}) = (\my $x, \my $y);
+
+ $x = shift;
+ foreach my $e (@_) {
+ $y = $e;
+ $x = $code->();
+ }
+
+ $x;
+}
+
sub _ref { ref $_[0] eq 'ARRAY' || blessed $_[0] && $_[0]->isa(__PACKAGE__) }
1;