Acme-Array-MaxSize

 view release on metacpan or  search on metacpan

Makefile.PL  view on Meta::CPAN

                                 file => 'lib/Acme/Array/MaxSize.pm',
                                 version => $VERSION,
                             },
                         },
    },
    macro => { TARFLAGS => '--format=ustar -cvf' },
    dist  => { COMPRESS => 'gzip -9f', SUFFIX => 'gz', },
    clean => { FILES => 'Acme-Array-MaxSize-*' },
);

sub MY::postamble {
    return "version-bump:\n\tperl-reversion --bump Makefile.PL lib/Acme/Array/MaxSize.pm\n"
}

lib/Acme/Array/MaxSize.pm  view on Meta::CPAN

package Acme::Array::MaxSize;

use 5.006;
use strict;
use warnings;

use parent 'Tie::Array';
use Carp;

my %max_size;
my $last_index = sub { $max_size{+shift} - 1 };


sub TIEARRAY {
    my ($class, $max_size) = @_;
    my $self = bless [], $class;
    $max_size{$self} = $max_size;
    return $self
}

sub STORE {
    my ($self, $index, $value) = @_;
    if ($index > $self->$last_index) {
        carp 'Array too long';
        return
    }
    $self->[$index] = $value;
}

sub FETCH {
    my ($self, $index) = @_;
    $self->[$index]
}

sub FETCHSIZE {
    my $self = shift;
    @$self
}

sub STORESIZE {
    my ($self, $count) = @_;
    if ($count > $max_size{$self}) {
        carp 'Array too long';
        $count = $max_size{$self};
    }
    $#{$self} = $count - 1;
}

sub SPLICE {
    my ($self, $offset, $length, @list) = @_;
    if ($offset > $max_size{$self}) {
        carp 'Array too long';
        return;
    }

    if ($offset + $length > $max_size{$self}) {
        carp 'Array too long';
        $length = $max_size{$self} - $offset;
    }



( run in 0.239 second using v1.01-cache-2.11-cpan-4d50c553e7e )