start adding logs and add support for routed logs and logging to stderr
[scpubgit/Object-Remote.git] / lib / Object / Remote / ModuleLoader.pm
1 package Object::Remote::ModuleLoader;
2
3 BEGIN {
4   package Object::Remote::ModuleLoader::Hook;
5   use Moo;
6   use Object::Remote::Logging qw(:log);
7   has sender => (is => 'ro', required => 1);
8
9   # unqualified INC forced into package main
10   sub Object::Remote::ModuleLoader::Hook::INC {
11     my ($self, $module) = @_;
12     #TODO not logging - timing issue?
13     log_debug { "Loading $module via " . ref($self) };
14     if (my $code = $self->sender->source_for($module)) {
15       open my $fh, '<', \$code;
16       return $fh;
17     }
18     return;
19   }
20 }
21
22 use Moo;
23
24 use Object::Remote::Logging qw( :log );
25
26 has module_sender => (is => 'ro', required => 1);
27
28 has inc_hook => (is => 'lazy');
29
30 sub _build_inc_hook {
31   my ($self) = @_;
32   log_debug { "Constructing module builder hook" };
33   #TODO why didn't log_trace return the argument? 
34   logS_trace { "Done constructing module builder hook" }
35     Object::Remote::ModuleLoader::Hook->new(sender => $self->module_sender);
36 }
37
38 sub BUILD { shift->enable }
39
40 sub enable {
41   log_debug { "enabling module loader hook" };
42   push @INC, shift->inc_hook;
43   return;
44 }
45
46 sub disable {
47   my ($self) = @_;
48   log_debug { "disabling module loader hook" };
49   my $hook = $self->inc_hook;
50   @INC = grep $_ ne $hook, @INC;
51   return;
52 }
53
54 sub DEMOLISH { $_[0]->disable unless $_[1] }
55
56 1;