package Perl::Dist::Asset;
# Convenience base class for Perl::Dist assets
use 5.006;
use strict;
use warnings;
use Carp 'croak';
use File::Spec ();
use File::Spec::Unix ();
use File::ShareDir ();
use URI::file ();
use Params::Util qw{ _STRING _CODELIKE };
use vars qw{$VERSION};
BEGIN {
$VERSION = '1.16';
}
use Object::Tiny qw{
parent
file
url
share
dist
};
#####################################################################
# Constructor
sub new {
my $self = shift->SUPER::new(@_);
unless ( $self->url ) {
if ( $self->share ) {
# Map share to url vis File::ShareDir
my ($dist, $name) = split /\s+/, $self->share;
$self->trace("Finding $name in $dist... ");
my $file = File::Spec->rel2abs(
File::ShareDir::dist_file( $dist, $name )
);
unless ( -f $file ) {
croak("Failed to find $file");
}
$self->{url} = URI::file->new($file)->as_string;
$self->trace(" found\n");
} elsif ( $self->dist ) {
# Map CPAN dist path to url
my $dist = $self->dist;
$self->trace("Using distribution path $dist\n");
my $one = substr( $self->dist, 0, 1 );
my $two = substr( $self->dist, 1, 1 );
my $path = File::Spec::Unix->catfile(
'authors', 'id', $one, "$one$two", $dist,
);
$self->{url} = URI->new_abs( $path, $self->cpan )->as_string;
} elsif ( $self->can('name') and $self->name ) {
# Map name to URL via the default package path
$self->{url} = $self->parent->binary_url($self->name);
}
}
# Check params
unless ( _STRING($self->url) ) {
croak("Missing or invalid url param");
}
# Create the filename from the url
$self->{file} = $self->url;
$self->{file} =~ s|.+/||;
unless ( $self->file and length $self->file ) {
croak("Missing or invalid file");
}
return $self;
}
sub cpan {
$_[0]->parent->cpan;
}
#####################################################################
# Support Methods
sub trace {
my $self = shift;
if ( _CODELIKE($self->{trace}) ) {
$self->{trace}->(@_);
} else {
print $_[0];
}
}
1;