Commit | Line | Data |
7462160e |
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; |