Mercurial > pub > Impl
view lib/IMPL/Code/Loader.pm @ 418:3f38dabaf5cc ref20150831
sync
author | cin |
---|---|
date | Mon, 28 Dec 2015 15:11:35 +0300 |
parents | ee36115f6a34 |
children |
line wrap: on
line source
package IMPL::Code::Loader; use strict; use warnings; use IMPL::Const qw(:prop); use File::Spec; use IMPL::declare { require => { Exception => 'IMPL::Exception', ArgumentException => '-IMPL::InvalidArgumentException' }, base => { 'IMPL::Object' => undef, }, props => [ verifyNames => PROP_RO, prefix => PROP_RO, _pending => PROP_RW ] }; my $default; sub default { $default ||= new IMPL::Code::Loader; } my $safe; sub safe { $safe ||= new IMPL::Code::Loader(verifyNames => 1); } sub CTOR { my ($this, %params) = @_; $this->verifyNames($params{verifyNames}) if $params{verifyNames}; $this->prefix($params{prefix}) if $params{prefix}; $this->_pending({}); } sub Require { my ($this,$package) = @_; if ($this->verifyNames) { $package =~ m/^([a-zA-Z_0-9]+(?:::[a-zA-Z_0-9]+)*)$/ or die ArgumentException->new(package => 'Invalid package name') ; $package = $1; } $package = $this->prefix . '::' . $package if $this->prefix; my $file = join('/', split(/::/,$package)) . ".pm"; require $file; return $package; } sub ModuleExists { my ($this,$package) = @_; my $file = join('/', split(/::/,$this->GetFullName($package))) . ".pm"; -f File::Spec->catfile($_,$file) and return 1 foreach @INC; return 0; } sub GetFullName { my ($this,$package) = @_; if ($this->verifyNames) { $package =~ m/^([a-zA-Z_0-9]+(?:::[a-zA-Z_0-9]+)*)$/ or die ArgumentException->new(package => 'Invalid package name') ; } return $this->prefix . '::' . $package if $this->prefix; } 1;