#!/usr/bin/perl
#use Mooix::Thing;
run sub {
	my $this=shift;
	%_=@_;
	
	my $id = $this->high_watermark($this->high_watermark + 1);

	my @fields=$this->logfields;
	my @values;
	foreach my $field (@fields) {
		# Explicit stringification; includes stringification of
		# object references.
		push @values, "$_{$field}";
	}

	my $oldmask;
	if (exists $_{umask}) {
		$oldmask = umask($_{umask});
	}
	$this->$id(@values);
	if (exists $_{umask}) {
		umask($oldmask);
	}

	my $low_watermark=$this->low_watermark;
	my $overflow = $id - $low_watermark - $this->maxitems + 1;
	if ($overflow > 0 && $this->maxitems != 0) {
		my $archive=$this->archive;
		# Trim list.
		for (; $low_watermark < $id ; $low_watermark++) {
			if (ref $archive) {
				my %params;
				my @values=$this->low_watermark;
				foreach my $field (@fields) {
					$params{$field}=shift @values;
				}
				$archive->add(%params);
			}
			if (unlink $this->id."/$low_watermark") {
				$overflow--;
				last if $overflow == 0;
			}
		   }
		   $this->low_watermark($low_watermark + 1);
	}
	
	return $id;
}
