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

use strict;
use warnings;

use Archive::Tar;
use File::Spec;

sub new {
    my ( $class, $path ) = @_;

    my $self = {
        archivefile =>  $path,
    };

    return bless $self, $class;
}

require Enbld::Error;

sub extract {
    my ( $self, $dir ) = @_;

    my ( undef, undef, $file ) = File::Spec->splitpath( $self->{archivefile} );

    require Enbld::Message;
    Enbld::Message->notify( "--> Extract archive file '$file'." );

    my $tar = Archive::Tar->new;
    $tar->read( $self->{archivefile} ) or
        _err( "Can't read archive file.", $tar->error );

    my @list = $tar->list_files or _err( "Can't list up file.", $tar->error );

    my @frag = split( '/', $list[0] );

    my $path = File::Spec->catdir( $dir, $frag[0] );
    $tar->setcwd( $dir ) or _err( "Can't move to cwd dir.", $tar->error );
    $tar->extract or _err( "Can't extract archive file.", $tar->error );

    return $path;
}

sub _err {
    my ( $err, $msg ) = @_;

    require Enbld::Error;
    Enbld::Error->throw( $err, $msg );
}

1;