# 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);
=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);