Sponsoring The Perl Toolchain Summit 2025: Help make this important event another success Learn more

use strict;
use Cwd();
my (%module_info, %vcache);
sub data_dir {
my $module = pop;
$module =~ s/::/\//g;
# first try search in loaded module's dir
if (my $path = $INC{"$module.pm"}) {
$path =~ s/\.pm$//;
my $pldir = "$path.x";
return Cwd::realpath($pldir) if -d $pldir;
}
foreach my $inc (@INC) {
my $pldir = "$inc/$module.x";
return Cwd::realpath($pldir) if -d $pldir;
}
return undef;
}
sub payload_dir {
my $data_dir = data_dir(@_) or return undef;
my $dir = "$data_dir/payload";
return $dir if -d $dir;
return undef;
}
sub include_dir {
my $data_dir = data_dir(@_) or return undef;
my $dir = "$data_dir/i";
return $dir if -d $dir;
return undef;
}
sub typemap_dir {
my $data_dir = data_dir(@_) or return undef;
my $dir = "$data_dir/tm";
return $dir if -d $dir;
return undef;
}
sub binary_module_info_file {
my $data_dir = data_dir(@_) or return undef;
return "$data_dir/info";
}
sub binary_module_info {
my $module = shift;
my $info = $module_info{$module};
unless ($info) {
my $file = binary_module_info_file($module) or return undef;
return undef unless -f $file;
$info = do($file) or return undef;
unless (ref($info) eq 'HASH') {
warn "bad module info file: $file";
return undef;
}
$module_info{$module} = $info;
}
return $info;
}
sub loaded_module_version {
my $module = shift;
no strict 'refs';
my $version = ${"${module}::VERSION"};
if (!$version and my $vsub = $module->can('VERSION')) { $version = $module->VERSION }
return $version || 0;
}
1;