Commit | Line | Data |
542d5b5c |
1 | package Object::Remote::ModuleSender; |
2 | |
4a9fa1a5 |
3 | use Object::Remote::Logging qw( :log :dlog ); |
542d5b5c |
4 | use Config; |
5 | use File::Spec; |
6 | use List::Util qw(first); |
7 | use Moo; |
8 | |
9 | has dir_list => (is => 'lazy'); |
10 | |
11 | sub _build_dir_list { |
df8e0ca6 |
12 | my %core = map +($_ => 1), grep $_, @Config{ |
13 | qw(privlibexp archlibexp vendorarchexp sitearchexp) |
14 | }; |
4a9fa1a5 |
15 | DlogS_trace { "dir list built in ModuleSender: $_" } [ grep !$core{$_}, @INC ]; |
542d5b5c |
16 | } |
17 | |
18 | sub source_for { |
19 | my ($self, $module) = @_; |
4a9fa1a5 |
20 | log_debug { "locating source for module '$module'" }; |
7462160e |
21 | if (my $find = Object::Remote::FromData->can('find_module')) { |
22 | if (my $source = $find->($module)) { |
4a9fa1a5 |
23 | return Dlog_trace { "Object::Remote::FromData->find_module('$module') returned '$_'" } $source; |
7462160e |
24 | } |
25 | } |
4a9fa1a5 |
26 | log_trace { "Searching for module in library directories" }; |
542d5b5c |
27 | my ($found) = first { -f $_ } |
28 | map File::Spec->catfile($_, $module), |
29 | @{$self->dir_list}; |
30 | die "Couldn't find ${module} in remote \@INC. dir_list contains:\n" |
31 | .join("\n", @{$self->dir_list}) |
32 | unless $found; |
4a9fa1a5 |
33 | log_debug { "found '$module' at '$found'" }; |
542d5b5c |
34 | open my $fh, '<', $found or die "Couldn't open ${found} for ${module}: $!"; |
35 | return do { local $/; <$fh> }; |
36 | } |
37 | |
38 | 1; |