File Coverage

blib/lib/Scripting/Loader.pm
Criterion Covered Total %
statement 27 64 42.1
branch 0 20 0.0
condition 0 8 0.0
subroutine 9 13 69.2
pod 0 3 0.0
total 36 108 33.3


line stmt bran cond sub pod time code
1             # $Source: /Users/clajac/cvsroot//Scripting/Scripting/Loader.pm,v $
2             # $Author: clajac $
3             # $Date: 2003/07/21 07:33:21 $
4             # $Revision: 1.5 $
5              
6             package Scripting::Loader;
7 1     1   5 use Carp qw(croak carp);
  1         2  
  1         80  
8 1     1   943 use IO::Dir;
  1         73324  
  1         58  
9 1     1   16 use IO::File;
  1         2  
  1         144  
10 1     1   6 use File::Spec;
  1         2  
  1         24  
11 1     1   1178 use Digest::SHA1 qw(sha1);
  1         4368  
  1         104  
12 1     1   2069 use File::Find::Rule qw(find);
  1         10150  
  1         11  
13 1     1   771 use Scripting::Event qw(:constants);
  1         2  
  1         171  
14              
15 1     1   7 use strict;
  1         1  
  1         158  
16              
17             my %Engine;
18             my %Engine_Loaded;
19             my @Allow;
20              
21             # Find available engines
22             BEGIN {
23 1     1   7 my ($path) = __FILE__ =~ /^(.*)Loader\.pm$/;
24            
25 1         1954 %Engine = map {
26 1         34 (/(\w+)\.pm/)[0] => $_
27             } find(file => name => "*.pm", in => File::Spec->catfile($path, "Engine"));
28             }
29              
30             sub allow {
31 0     0 0   my ($pkg, $allow) = @_;
32              
33 0 0 0       die "Argument must be string or ARRAY reference\n" if(ref $allow && ref $allow ne 'ARRAY');
34 0 0         unless(ref $allow) {
35 0           my @allow = split/\s+/,$allow;
36 0           $allow = \@allow;
37             }
38              
39 0           for (@$allow) {
40 0 0         die "Type '$_' not supported\n" unless(exists $Engine{$_});
41             }
42              
43 0           @Allow = @$allow;
44             }
45              
46             sub load {
47 0     0 0   my ($pkg, $paths) = @_;
48              
49 0 0 0       die "Argument must be a string or ARRAY reference\n" if(ref $paths && ref $paths ne 'ARRAY');
50 0 0         $paths = [$paths] unless(ref $paths);
51              
52 0           my @files = find(file => name => [map { "*.$_" } @Allow], in => $paths);
  0            
53 0           foreach (@files) {
54 0           Scripting::Loader->load_file($_);
55             }
56             }
57              
58             sub load_file {
59 0     0 0   my ($pkg, $path) = @_;
60              
61 0           $path = File::Spec->rel2abs($path);
62              
63 0           my @parts = File::Spec->splitdir($path);
64              
65 0           my $file = pop @parts;
66 0           my $ns = pop @parts;
67              
68 0 0         $ns = "_Global" unless(Scripting::Expose->has_namespace($ns));
69 0           my ($event, $engine) = $file =~ /^(.*)\.(\w+)$/;
70              
71 0           _load_engine($engine);
72              
73 0   0       my $file = IO::File->new($path, "r") || die $!;
74 0           my $source = join "", $file->getlines;
75 0           $file->close();
76            
77 0           my $digest = sha1($source);
78 0 0         warn "Script '$path' doesn't match signed signature'\n" unless(Scripting::Security->match($path, $digest));
79              
80 0           my $cb = "Scripting::Engine::$engine"->load($path, $ns, $source);
81              
82 0 0         if(Scripting::Event->has_event($ns, $event)) {
83 0           Scripting::Event->remove_event($ns, $event);
84             }
85              
86 0           Scripting::Event->add_event($ns, $event, $cb);
87             }
88              
89             sub _load_engine {
90 0     0     my ($engine) = @_;
91              
92 0 0         if(exists $Engine{$engine}) {
93 0 0         unless(exists $Engine_Loaded{$engine}) {
94 0           require $Engine{$engine};
95 0           $Engine_Loaded{$engine} = 1;
96             }
97             }
98             }
99              
100             1;