Commit | Line | Data |
7462160e |
1 | package Object::Remote::FromData; |
2 | |
3 | use strictures 1; |
4 | use Object::Remote; |
07105aca |
5 | use Object::Remote::Logging qw ( :log ); |
7462160e |
6 | |
7 | our %Modules; |
8 | our %Not_Loaded_Yet; |
9 | our %Seen; |
10 | |
11 | sub import { |
12 | my $target = caller; |
07105aca |
13 | log_trace { "import has been invoked by '$target' on " . __PACKAGE__ }; |
7462160e |
14 | return if $Seen{$target}; |
07105aca |
15 | log_debug { "'$target' has not yet loaded " . __PACKAGE__ }; |
7462160e |
16 | $Seen{$target} = $Not_Loaded_Yet{$target} = 1; |
17 | } |
18 | |
19 | sub flush_loaded { |
07105aca |
20 | log_debug { "flushing the loaded classes" }; |
7462160e |
21 | foreach my $key (keys %Not_Loaded_Yet) { |
07105aca |
22 | log_trace { "flushing '$key'" }; |
7462160e |
23 | my $data_fh = do { no strict 'refs'; *{"${key}::DATA"} }; |
24 | my $data = do { local $/; <$data_fh> }; |
25 | my %modules = reverse( |
26 | $data =~ m/(^package ([^;]+);\n.*?(?:(?=^package)|\Z))/msg |
27 | ); |
28 | $_ .= "\n1;\n" for values %modules; |
29 | @Modules{keys %modules} = values %modules; |
30 | delete $Not_Loaded_Yet{$key}; |
31 | } |
07105aca |
32 | log_trace { "done flushing loaded classes" }; |
7462160e |
33 | } |
34 | |
35 | sub find_module { |
36 | flush_loaded; |
37 | my ($module) = @_; |
38 | $module =~ s/\//::/g; |
39 | $module =~ s/\.pm$//; |
40 | return $Modules{$module}; |
41 | } |
42 | |
43 | 1; |