FromData
[scpubgit/Object-Remote.git] / lib / Object / Remote / FromData.pm
1 package Object::Remote::FromData;
2
3 use strictures 1;
4 use Object::Remote;
5
6 our %Modules;
7 our %Not_Loaded_Yet;
8 our %Seen;
9
10 sub import {
11   my $target = caller;
12   return if $Seen{$target};
13   $Seen{$target} = $Not_Loaded_Yet{$target} = 1;
14 }
15
16 sub flush_loaded {
17   foreach my $key (keys %Not_Loaded_Yet) {
18     my $data_fh = do { no strict 'refs'; *{"${key}::DATA"} };
19     my $data = do { local $/; <$data_fh> };
20     my %modules = reverse(
21       $data =~ m/(^package ([^;]+);\n.*?(?:(?=^package)|\Z))/msg
22     );
23     $_ .= "\n1;\n" for values %modules;
24     @Modules{keys %modules} = values %modules;
25     delete $Not_Loaded_Yet{$key};
26   }
27 }
28
29 sub find_module {
30   flush_loaded;
31   my ($module) = @_;
32   $module =~ s/\//::/g;
33   $module =~ s/\.pm$//;
34   return $Modules{$module};
35 }
36
37 1;