comparison lib/IMPL/Code/Loader.pm @ 407:c6e90e02dd17 ref20150831

renamed Lib->lib
author cin
date Fri, 04 Sep 2015 19:40:23 +0300
parents
children ee36115f6a34
comparison
equal deleted inserted replaced
406:f23fcb19d3c1 407:c6e90e02dd17
1 package IMPL::Code::Loader;
2 use strict;
3 use warnings;
4
5 use IMPL::Const qw(:prop);
6 use File::Spec;
7 use IMPL::declare {
8 require => {
9 Exception => 'IMPL::Exception',
10 ArgumentException => '-IMPL::InvalidArgumentException'
11 },
12 base => {
13 'IMPL::Object' => undef,
14 'IMPL::Object::Autofill' => '@_'
15 },
16 props => [
17 verifyNames => PROP_RO,
18 prefix => PROP_RO,
19 _pending => PROP_RW
20 ]
21 };
22
23 my $default;
24 sub default {
25 $default ||= new IMPL::Code::Loader;
26 }
27
28 my $safe;
29 sub safe {
30 $safe ||= new IMPL::Code::Loader(verifyNames => 1);
31 }
32
33 sub CTOR {
34 my ($this) = @_;
35
36 $this->_pending({});
37 }
38
39 sub Require {
40 my ($this,$package) = @_;
41
42 if ($this->verifyNames) {
43 $package =~ m/^([a-zA-Z_0-9]+(?:::[a-zA-Z_0-9]+)*)$/
44 or die ArgumentException->new(package => 'Invalid package name') ;
45 $package = $1;
46 }
47
48 $package = $this->prefix . '::' . $package if $this->prefix;
49
50 my $file = join('/', split(/::/,$package)) . ".pm";
51
52 require $file;
53
54 return $package;
55 }
56
57 sub ModuleExists {
58 my ($this,$package) = @_;
59
60 my $file = join('/', split(/::/,$this->GetFullName($package))) . ".pm";
61
62 -f File::Spec->catfile($_,$file) and return 1 foreach @INC;
63
64 return 0;
65 }
66
67 sub GetFullName {
68 my ($this,$package) = @_;
69
70 if ($this->verifyNames) {
71 $package =~ m/^([a-zA-Z_0-9]+(?:::[a-zA-Z_0-9]+)*)$/
72 or die ArgumentException->new(package => 'Invalid package name') ;
73 }
74
75 return $this->prefix . '::' . $package if $this->prefix;
76 }
77
78 1;
79