Exclude vendorarch and sitearch from FatNode and ModuleSender
[scpubgit/Object-Remote.git] / lib / Object / Remote / ModuleSender.pm
1 package Object::Remote::ModuleSender;
2
3 use Config;
4 use File::Spec;
5 use List::Util qw(first);
6 use Moo;
7
8 has dir_list => (is => 'lazy');
9
10 sub _build_dir_list {
11   my %core = map +($_ => 1), grep $_, @Config{
12     qw(privlibexp archlibexp vendorarchexp sitearchexp)
13   };
14   [ grep !/\Q$Config{archname}/, grep !/\Q$Config{myarchname}/, grep !$core{$_}, @INC ];
15 }
16
17 sub source_for {
18   my ($self, $module) = @_;
19   if (my $find = Object::Remote::FromData->can('find_module')) {
20     if (my $source = $find->($module)) {
21       return $source;
22     }
23   }
24   my ($found) = first {  -f $_ }
25                   map File::Spec->catfile($_, $module),
26                     @{$self->dir_list};
27   die "Couldn't find ${module} in remote \@INC. dir_list contains:\n"
28       .join("\n", @{$self->dir_list})
29     unless $found;
30   open my $fh, '<', $found or die "Couldn't open ${found} for ${module}: $!";
31   return do { local $/; <$fh> };
32 }
33
34 1;