Class-Inspector
view release on metacpan or search on metacpan
lib/Class/Inspector.pm view on Meta::CPAN
package Class::Inspector;
use 5.006;
# We don't want to use strict refs anywhere in this module, since we do a
# lot of things in here that aren't strict refs friendly.
use strict qw{vars subs};
use warnings;
use File::Spec ();
# ABSTRACT: Get information about a class and its structure
our $VERSION = '1.36'; # VERSION
# If Unicode is available, enable it so that the
# pattern matches below match unicode method names.
# We can safely ignore any failure here.
BEGIN {
local $@;
eval {
require utf8;
utf8->import;
};
}
# Predefine some regexs
our $RE_IDENTIFIER = qr/\A[^\W\d]\w*\z/s;
our $RE_CLASS = qr/\A[^\W\d]\w*(?:(?:\'|::)\w+)*\z/s;
# Are we on something Unix-like?
our $UNIX = !! ( $File::Spec::ISA[0] eq 'File::Spec::Unix' );
#####################################################################
# Basic Methods
sub _resolved_inc_handler {
my $class = shift;
my $filename = $class->_inc_filename(shift) or return undef;
foreach my $inc ( @INC ) {
my $ref = ref $inc;
if($ref eq 'CODE') {
my @ret = $inc->($inc, $filename);
if(@ret == 1 && ! defined $ret[0]) {
# do nothing.
} elsif(@ret) {
return 1;
}
}
elsif($ref eq 'ARRAY' && ref($inc->[0]) eq 'CODE') {
my @ret = $inc->[0]->($inc, $filename);
if(@ret) {
return 1;
}
}
elsif($ref && eval { $inc->can('INC') }) {
my @ret = $inc->INC($filename);
if(@ret) {
return 1;
}
}
}
'';
}
sub installed {
my $class = shift;
!! ($class->loaded_filename($_[0]) or $class->resolved_filename($_[0]) or $class->_resolved_inc_handler($_[0]));
}
sub loaded {
my $class = shift;
( run in 1.599 second using v1.01-cache-2.11-cpan-39bf76dae61 )