package AnnoCPAN::Archive;

$VERSION = '0.22';

use strict;
use warnings;

use Archive::Zip;
use Archive::Tar;

=head1 NAME

AnnoCPAN::Archive - Simple archive abstraction layer

=head1 SYNOPSIS

=head1 DESCRIPTION

AnnoCPAN is expected to handle both tar.gz and zip archives. L<Archive::Tar>
and L<Archive::Zip> take care of accessing those types of files, but they 
have different interfaces. AnnoCPAN::Archive provides a common interface to 
the very few methods that are actually needed.

=head1 METHODS

=over

=item $class->new($fname)

Create a new AnnoCPAN::Archive object. It uses the filename extension, which
must be .zip or .tar.gz, to determine the type of archive. Returns undefined
if there is any problem.

=cut

sub new {
    my ($class, $fname) = @_;
    return AnnoCPAN::Archive::Zip->new($fname) 
        if $fname =~ /\.zip$/;
    return AnnoCPAN::Archive::Tar->new($fname) 
        if $fname =~ /(\.tar\.gz|\.tgz)$/;
    return;
}

=item $obj->files

Returns a list of the filenames contained in the archive.

=item $obj->read_file($fname)

Returns as a string the contents of file $fname in the archive.

=cut

package AnnoCPAN::Archive::Zip;
our @ISA = qw(AnnoCPAN::Archive Archive::Zip::Archive);
sub new { shift->Archive::Zip::Archive::new(@_) }
sub files { shift->memberNames }
sub read_file { shift->contents(@_) }

package AnnoCPAN::Archive::Tar;
our @ISA = qw(AnnoCPAN::Archive Archive::Tar);
sub new { shift->Archive::Tar::new(@_) }
sub files { shift->list_files }
sub read_file { shift->get_content(@_) }

=back

=head1 SEE ALSO

L<Archive::Tar>, L<Archive::Zip>

There are other modules on CPAN, such as L<Archive::Any>, L<Archive::Extract>,
and L<File::Archive>, that seem to do similar things, but they didn't appear to
do exactly what I wanted or seemed too complicated, so I resorted to rolling my
own. It was just a dozen lines of code (heck, this documentation is way longer
than the code itself!)

=head1 AUTHOR

Ivan Tubert-Brohman E<lt>itub@cpan.orgE<gt>

=head1 COPYRIGHT

Copyright (c) 2005 Ivan Tubert-Brohman. All rights reserved. This program is
free software; you can redistribute it and/or modify it under the same terms as
Perl itself.

=cut

1;