use MRO::Compat;
use Carp 'confess';
-use Scalar::Util 'weaken';
-
+use Devel::GlobalDestruction qw( in_global_destruction );
+use Scalar::Util 'weaken', 'reftype';
+use Sub::Name qw( subname );
use Class::MOP::Class;
use Class::MOP::Attribute;
*check_package_cache_flag = \&mro::get_pkg_gen;
}
-our $VERSION = '0.76';
+our $VERSION = '0.77_01';
our $XS_VERSION = $VERSION;
$VERSION = eval $VERSION;
our $AUTHORITY = 'cpan:STEVAN';
-# after that everything is loaded, if we're allowed try to load faster XS
-# versions of various things
-_try_load_xs() or _load_pure_perl();
-
-sub _try_load_xs {
- return if $ENV{CLASS_MOP_NO_XS};
-
- my $e = do {
- local $@;
- eval {
- require XSLoader;
- # just doing this - no warnings 'redefine' - doesn't work
- # for some reason
- local $^W = 0;
- __PACKAGE__->XSLoader::load($XS_VERSION);
-
- require Sub::Name;
- Sub::Name->import(qw(subname));
-
- require Devel::GlobalDestruction;
- Devel::GlobalDestruction->import("in_global_destruction");
-
- *USING_XS = sub () { 1 };
- };
- $@;
- };
-
- die $e if $e && $e !~ /object version|loadable object/;
-
- return $e ? 0 : 1;
-}
-
-sub _load_pure_perl {
- require Sub::Identify;
- Sub::Identify->import('get_code_info');
-
- *subname = sub { $_[1] };
- *in_global_destruction = sub () { !1 };
-
- *USING_XS = sub () { 0 };
-}
+require XSLoader;
+XSLoader::load( __PACKAGE__, $XS_VERSION );
{
return 0;
}
-sub is_class_loaded {
- my $class = shift;
-
- return 0 unless _is_valid_class_name($class);
-
- # walk the symbol table tree to avoid autovififying
- # \*{${main::}{"Foo::"}} == \*main::Foo::
-
- my $pack = \*::;
- foreach my $part (split('::', $class)) {
- return 0 unless exists ${$$pack}{"${part}::"};
- $pack = \*{${$$pack}{"${part}::"}};
- }
-
- # check for $VERSION or @ISA
- return 1 if exists ${$$pack}{VERSION}
- && defined *{${$$pack}{VERSION}}{SCALAR};
- return 1 if exists ${$$pack}{ISA}
- && defined *{${$$pack}{ISA}}{ARRAY};
-
- # check for any method
- foreach ( keys %{$$pack} ) {
- next if substr($_, -2, 2) eq '::';
-
- my $glob = ${$$pack}{$_} || next;
-
- # constant subs
- if ( IS_RUNNING_ON_5_10 ) {
- return 1 if ref $glob eq 'SCALAR';
- }
-
- return 1 if defined *{$glob}{CODE};
- }
-
- # fail
- return 0;
-}
-
-
## ----------------------------------------------------------------------------
## Setting up our environment ...
## ----------------------------------------------------------------------------
);
Class::MOP::Class->meta->add_attribute(
+ Class::MOP::Attribute->new('wrapped_method_metaclass' => (
+ reader => {
+ # NOTE:
+ # we just alias the original method
+ # rather than re-produce it here
+ 'wrapped_method_metaclass' => \&Class::MOP::Class::wrapped_method_metaclass
+ },
+ default => 'Class::MOP::Method::Wrapped',
+ ))
+);
+
+Class::MOP::Class->meta->add_attribute(
Class::MOP::Attribute->new('instance_metaclass' => (
reader => {
# NOTE: we need to do this in order