use strict;
use Carp;
-
-use vars qw($VERSION $docheck);
-$VERSION = do { my @r = (q$Revision$ =~ /\d+/g); sprintf "%d."."%02d" x $#r, @r};
+use vars qw($VERSION $BRANCH);
+$VERSION = sprintf( "%d.%03d", q$Revision$ =~ /(\d+)\.(\d+)/ );
+$BRANCH = sprintf( "%d.%03d", q$Revision$ =~ /\d+\.\d+\.(\d+)\.(\d+)/ || (0,0));
+$main::build += $VERSION;
+$main::branch += $BRANCH;
use constant NEXT => 0;
use constant PREV => 1;
use constant OBJ => 2;
+use vars qw($docheck);
+
$docheck = 1;
sub _check
# constructor
sub new
{
- my $name = shift;
- my $ref = shift;
+ my $pkg = shift;
+ my $name = ref $pkg || $pkg;
+
my $self = [];
- push @$self, $self, $self, $ref;
+ push @$self, $self, $self, @_;
return bless $self, $name;
}
$docheck && _check($p);
- my $q = ref $ref && $ref->isa('Chain') ? $ref : new Chain $ref;
+ my $q = ref $ref && $ref->isa('Chain') ? $ref : Chain->new($ref);
$q->[PREV] = $p->[PREV];
$q->[NEXT] = $p;
$p->[PREV]->[NEXT] = $q;
$docheck && _check($p);
- $p->[PREV]->[NEXT] = $p->[NEXT];
+ my $q = $p->[PREV]->[NEXT] = $p->[NEXT];
$p->[NEXT]->[PREV] = $p->[PREV];
- return $p->[PREV];
+ $p->[NEXT] = $p->[PREV] = undef;
+ return $q;
}
# Is this chain empty?
$docheck && _check($base);
- return $base->[NEXT] == $base ? undef : $base->[PREV] unless $p;
+ return $base->[PREV] == $base ? undef : $base->[PREV] unless $p;
$docheck && _check($p);
return $count;
}
+sub close
+{
+ my $base = shift;
+ $base->flush;
+ $base->[PREV] = $base->[NEXT] = undef;
+}
+
1;
__END__
# Below is the stub of documentation for your module. You better edit it!
=head1 SYNOPSIS
use Chain;
- $base = new Chain;
- $p->ins($ref);
- $p->add($ref);
+ $base = new Chain [$obj];
+ $p->ins($ref [,$obj]);
+ $p->add($ref [,$obj]);
$ref = $p->obj or $p->obj($ref);
$q = $base->next($p);
$q = $base->prev($p);