qbit
view release on metacpan or search on metacpan
lib/qbit/Packages.pm view on Meta::CPAN
B<$package> - string, package name;
=item
B<$res> - scalar, result's stash;
=back
=item
B<$baseclass> - string, upper level package name.
=back
Recursive merge data into $res from all levels packages hierarchy.
=cut
sub package_merge_isa_data {
my ($package, $res, $func, $baseclass) = @_;
my $isa;
{
no strict 'refs';
$isa = \@{$package . '::ISA'};
}
foreach my $pkg (@$isa) {
next if defined($baseclass) && !$pkg->isa($baseclass);
package_merge_isa_data($pkg, $res, $func, $baseclass);
}
$func->($package, $res);
}
=head2 require_class
B<Arguments:>
=over
=item
B<$class> - string, class name.
=back
Convert class name to .pm file path and require it.
B<Return value:> return value of CORE::require if all is Ok or throw Exception if cannot load .pm file.
=cut
sub require_class {
my ($class) = @_;
my $file_name = "$class.pm";
$file_name =~ s/::/\//g;
my $result;
try {
$result = require($file_name);
}
catch {
throw $_[0];
};
return $result || throw Exception gettext('Cannot requre class "%s": %s', $class, fix_utf($@ || $!));
}
=head2 dynamic_loading
B<Arguments:>
=over
=item
B<$package_prefix> - string.
=back
Dynamic loading all packages from directory $package_prefix.
B<Example:>
dynamic_loading('QBit::Application::Model::DBManager::Filter');
=cut
sub dynamic_loading {
my ($pakage_prefix) = @_;
my $stash = package_stash(__PACKAGE__);
unless ($stash->{$pakage_prefix}) {
my $dir = File::Spec->catdir(split(/::/, $pakage_prefix));
my @dirs = map {File::Spec->catdir($_, $dir)} @INC;
my %package_names = ();
foreach my $basedir (@dirs) {
next unless -d $basedir;
find(
{
wanted => sub {
my $name = File::Spec->abs2rel($_, $basedir);
return unless $name && $name ne File::Spec->curdir();
return unless /\.pm$/ && -r;
$name =~ s/\.pm$//;
$name = join('::', File::Spec->splitdir($name));
$package_names{$name} = 1;
},
no_chdir => 1,
follow => 1
},
$basedir
( run in 1.598 second using v1.01-cache-2.11-cpan-39bf76dae61 )