diff options
author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-06-25 04:47:55 +0000 |
---|---|---|
committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-06-25 04:47:55 +0000 |
commit | 7e7ddbe33ca34359d711aee1e0ddebaeb40c2a18 (patch) | |
tree | 2a03e101e7b0302f5dcde62ed415a415ecca041d /lib/Class/Load/PP.pm | |
download | Class-Load-tarball-master.tar.gz |
Class-Load-0.23HEADClass-Load-0.23master
Diffstat (limited to 'lib/Class/Load/PP.pm')
-rw-r--r-- | lib/Class/Load/PP.pm | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/lib/Class/Load/PP.pm b/lib/Class/Load/PP.pm new file mode 100644 index 0000000..a38d408 --- /dev/null +++ b/lib/Class/Load/PP.pm @@ -0,0 +1,59 @@ +use strict; +use warnings; +package Class::Load::PP; + +our $VERSION = '0.23'; + +use Module::Runtime (); +use Package::Stash 0.14; +use Scalar::Util (); +use Try::Tiny; + +sub is_class_loaded { + my $class = shift; + my $options = shift; + + my $loaded = _is_class_loaded($class); + + return $loaded if ! $loaded; + return $loaded unless $options && $options->{-version}; + + return try { + $class->VERSION($options->{-version}); + 1; + } + catch { + 0; + }; +} + +sub _is_class_loaded { + my $class = shift; + + return 0 unless Module::Runtime::is_module_name($class); + + my $stash = Package::Stash->new($class); + + if ($stash->has_symbol('$VERSION')) { + my $version = ${ $stash->get_symbol('$VERSION') }; + if (defined $version) { + return 1 if ! ref $version; + # Sometimes $VERSION ends up as a reference to undef (weird) + return 1 if ref $version && Scalar::Util::reftype $version eq 'SCALAR' && defined ${$version}; + # a version object + return 1 if Scalar::Util::blessed $version; + } + } + + if ($stash->has_symbol('@ISA')) { + return 1 if @{ $stash->get_symbol('@ISA') }; + } + + # check for any method + return 1 if $stash->list_all_symbols('CODE'); + + # fail + return 0; +} + +1; |