use MRO::Compat;
use Carp 'confess';
-use Scalar::Util 'weaken';
+use Scalar::Util 'weaken', 'reftype';
use Class::MOP::Class;
*check_package_cache_flag = \&mro::get_pkg_gen;
}
-our $VERSION = '0.75';
+our $VERSION = '0.77';
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 {
require Devel::GlobalDestruction;
Devel::GlobalDestruction->import("in_global_destruction");
+
+ *USING_XS = sub () { 1 };
};
$@;
};
Sub::Identify->import('get_code_info');
*subname = sub { $_[1] };
- *in_global_destruction = sub () { !1 }
+ *in_global_destruction = sub () { !1 };
+
+ *USING_XS = sub () { 0 };
}
$pack = \*{${$$pack}{"${part}::"}};
}
- # check for $VERSION or @ISA
- return 1 if exists ${$$pack}{VERSION}
- && defined *{${$$pack}{VERSION}}{SCALAR};
+ # We used to check in the package stash, but it turns out that
+ # *{${$$package}{VERSION}{SCALAR}} can end up pointing to a
+ # reference to undef. It looks
+
+ my $version = do {
+ no strict 'refs';
+ ${$class . '::VERSION'};
+ };
+
+ return 1 if ! ref $version && defined $version;
+ # Sometimes $VERSION ends up as a reference to undef (weird)
+ return 1 if ref $version && reftype $version eq 'SCALAR' && defined ${$version};
+
return 1 if exists ${$$pack}{ISA}
&& defined *{${$$pack}{ISA}}{ARRAY};
);
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
);
Class::MOP::Attribute->meta->add_attribute(
+ Class::MOP::Attribute->new('definition_context' => (
+ reader => { 'definition_context' => \&Class::MOP::Attribute::definition_context },
+ ))
+);
+
+Class::MOP::Attribute->meta->add_attribute(
Class::MOP::Attribute->new('writer' => (
reader => { 'writer' => \&Class::MOP::Attribute::writer },
predicate => { 'has_writer' => \&Class::MOP::Attribute::has_writer },
))
);
+Class::MOP::Method::Generated->meta->add_attribute(
+ Class::MOP::Attribute->new('definition_context' => (
+ reader => { 'definition_context' => \&Class::MOP::Method::Generated::definition_context },
+ ))
+);
+
## --------------------------------------------------------
## Class::MOP::Method::Accessor
Whether or not C<mro> provides C<get_isarev>, a much faster way to get all the
subclasses of a certain class.
+=item I<USING_XS>
+
+Whether or not the running C<Class::MOP> is using its XS version.
+
=back
=head2 Utility functions