Acme-OCEORA-Utils

 view release on metacpan or  search on metacpan

lib/Tie/Cycle.pm  view on Meta::CPAN

package Tie::Cycle;
use strict;

our $VERSION = '1.224';

use Carp qw(carp);

use constant CURSOR_COL => 0;
use constant COUNT_COL  => 1;
use constant ITEM_COL   => 2;

sub TIESCALAR {
	my( $class, $list_ref ) = @_;
	my $self = bless [], $class;

	unless( $self->STORE( $list_ref ) ) {
		carp "The argument to Tie::Cycle must be an array reference";
		return;
		}

	return $self;
	}

sub FETCH {
	my( $self ) = @_;

	my $index = $self->[CURSOR_COL]++;
	$self->[CURSOR_COL] %= $self->_count;

	return $self->_item( $index );
	}

sub STORE {
	my( $self, $list_ref ) = @_;
	return unless ref $list_ref eq ref [];
	my @shallow_copy = map { $_ } @$list_ref;

	$self->[CURSOR_COL] = 0;
	$self->[COUNT_COL]  = scalar @shallow_copy;
	$self->[ITEM_COL]   = \@shallow_copy;
	}

sub reset { $_[0]->[CURSOR_COL] = 0 }

sub previous {
	my( $self ) = @_;

	my $index = $self->_cursor - 1;
	$self->[CURSOR_COL] %= $self->_count;

	return $self->_item( $index );
	}

sub next {
	my( $self ) = @_;

	my $index = $self->_cursor + 1;
	$self->[CURSOR_COL] %= $self->_count;

	return $self->_item( $index );
	}

sub _cursor  { $_[0]->[CURSOR_COL] }
sub _count   { $_[0]->[COUNT_COL] }
sub _item    {
	my( $self, $index ) = @_;
	$index = defined $index ? $index : $self->_cursor;
	$self->[ITEM_COL][ $index ]
	}

"Tie::Cycle";

__END__



( run in 0.602 second using v1.01-cache-2.11-cpan-5a3173703d6 )