The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

package Archive::Tar::Streamed;
use strict;

BEGIN {
	use vars qw ($VERSION @ISA);
	$VERSION     = 0.03;
}

use Archive::Tar;
use Archive::Tar::Constant;
use Carp;

sub new {
	my ($pkg,$arch) = @_;

	bless {file => $arch}, $pkg;
}

sub add {
    my $self = shift;

    my $arch = Archive::Tar->new;
    $arch->add_files(@_) or croak "add: $!";
    my $tf = $arch->write;
    syswrite $self->{file}, $tf, length($tf) - (BLOCK * 2);
}

sub next {
    my $self = shift;

    $self->{pending} ||= [];
    return shift @{$self->{pending}} if @{$self->{pending}};
    my $arch = Archive::Tar->new;
    my ($fil,@pend) = $arch->read( $self->{file}, 0, {limit => 1});
    $self->{pending} = \@pend;
    $fil;
}

sub writeeof {
    my $self = shift;

    syswrite $self->{file},TAR_END;
}

1; 
__END__
=head1 NAME

Archive::Tar::Streamed - Tar archives, non memory resident

=head1 SYNOPSIS

  use Archive::Tar::Streamed;

  my $fh;
  open $fh,'>','/home/myarch.tar' or die "Couldn't create archive";
  binmode $fh;
  my $tar = Archive::Tar::Streamed->new($fh);
  $tar->add('file1');
  $tar->add(@files);

  my $fh2l
  open $fh2,'<','prevarch.tar' or die "Couldn't open archive";
  binmode $fh;
  my $tar2 = Archive::Tar::Streamed->new($fh2);
  my $fil = $tar2->next;

=head1 DESCRIPTION

The L<Archive::Tar> module is a powerfull tool for manipulating archives from 
perl. However, most of the time, this module needs the entire archive to be
resident in memory. This renders the module per se, not to be directly usable
for very large archive (of the order of gigabytes).

Archive::Tar::Streamed provides a wrapper, which allows working with tar
archives on disk, with no need for the archive to be memory resident.

This module provides an alternative answer to the FAQ "Isn't Archive::Tar 
heavier on memory than /bin/tar?". It also aims to be portable, and available
on platforms without a native tar.

=head2 add

This is a method call to add one or more files to an archive. These are written
to disk before the method returns.

=head2 next

This method is an iterator, which returns an L<Archive::Tar::File> object
for the next file, or undef. undef indicates the end of the archive; any 
unexpected conditions result in throwing an exception.

=head1 BUGS

Please use http://rt.cpan.org to report any bugs in this module

=head1 AUTHOR

	I. Williams
	bitumen@xemaps.com

=head1 COPYRIGHT

This program is free software; you can redistribute
it and/or modify it under the same terms as Perl itself.

The full text of the license can be found in the
LICENSE file included with this module.


=head1 SEE ALSO

L<Archive::Tar>