use Scalar::Util 'blessed', 'reftype';
use Carp 'confess';
use Sub::Name 'subname';
-use B 'svref_2object';
use Sub::Exporter;
my $keyword = \&{ $class . '::' . $name };
# make sure it is from Moose
- my $pkg_name =
- eval { svref_2object($keyword)->GV->STASH->NAME };
+ my ($pkg_name) = Class::MOP::get_code_info($keyword);
next if $@;
next if $pkg_name ne 'Moose';
return $instance;
}
-
# FIXME:
# This is ugly
sub get_method_map {
my $self = shift;
+
+ if (defined $self->{'$!_package_cache_flag'} &&
+ $self->{'$!_package_cache_flag'} == Class::MOP::check_package_cache_flag()) {
+ return $self->{'%!methods'};
+ }
+
my $map = $self->{'%!methods'};
my $class_name = $self->name;
defined $map->{$symbol} &&
$map->{$symbol}->body == $code;
- my $gv = B::svref_2object($code)->GV;
+ my ($pkg, $name) = Class::MOP::get_code_info($code);
- my $pkg = $gv->STASH->NAME;
- if ($pkg->can('meta')
+ if ($pkg->can('meta')
# NOTE:
# we don't know what ->meta we are calling
- # here, so we need to be careful cause it
- # just might blow up at us, or just complain
- # loudly (in the case of Curses.pm) so we
+ # here, so we need to be careful cause it
+ # just might blow up at us, or just complain
+ # loudly (in the case of Curses.pm) so we
# just be a little overly cautious here.
# - SL
&& eval { no warnings; blessed($pkg->meta) }
#next unless $self->does_role($role);
}
else {
- next if ($gv->STASH->NAME || '') ne $class_name &&
- ($gv->NAME || '') ne '__ANON__';
+ next if ($pkg || '') ne $class_name &&
+ ($name || '') ne '__ANON__';
+
}
$map->{$symbol} = $method_metaclass->wrap($code);
my @args = @_;
no warnings 'redefine';
if ($Moose::INNER_SLOT{$_super_package}) {
- local *{$Moose::INNER_SLOT{$_super_package}} = sub {
- local *{$Moose::INNER_SLOT{$_super_package}} = sub {};
+ local *{$Moose::INNER_SLOT{$_super_package}} = sub {
+ local *{$Moose::INNER_SLOT{$_super_package}} = sub {};
$method->(@args);
};
return $super->(@args);
- }
- else {
+ }
+ else {
return $super->(@args);
}
});
use Carp 'confess';
use Scalar::Util 'blessed';
-use B 'svref_2object';
our $VERSION = '0.10';
our $AUTHORITY = 'cpan:STEVAN';
sub get_method_map {
my $self = shift;
$self->{'%!methods'} ||= {};
+ $self->{'$!_package_cache_flag'} = undef;
$self->Moose::Meta::Class::get_method_map()
}
+sub reset_package_cache_flag { () }
# FIXME:
# Yes, this is a really really UGLY hack
$self->_apply_attributes($other);
$self->_apply_methods($other);
+
+ # NOTE:
+ # we need a clear cache flag too ...
+ $other->{'$!_package_cache_flag'} = undef;
$self->_apply_override_method_modifiers($other);
$self->_apply_before_method_modifiers($other);
# so that we can tell the class were to
# find the right super() method
my $method = $self->get_override_method_modifier($method_name);
- my $package = svref_2object($method)->GV->STASH->NAME;
+ my ($package) = Class::MOP::get_code_info($method);
# if it is a class, we just add it
$other->add_override_method_modifier($method_name, $method, $package);
}
=item B<get_method_map>
+=item B<reset_package_cache_flag>
+
=back
=over 4
use Carp 'confess';
use Scalar::Util 'blessed', 'reftype';
-use B 'svref_2object';
use Sub::Exporter;
our $VERSION = '0.17';
my $keyword = \&{$class . '::' . $name};
# make sure it is from Moose
- my $pkg_name = eval { svref_2object($keyword)->GV->STASH->NAME };
+ my ($pkg_name) = Class::MOP::get_code_info($keyword);
next if $@;
next if $pkg_name ne 'Moose::Util::TypeConstraints';