From: gfx Date: Sat, 22 Aug 2009 08:09:50 +0000 (+0900) Subject: Separate deprecated features to Deprecated.pm X-Git-Tag: 0.92_01~12 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=30229767f5f7ae6e55ea054a1b71ce634ae7724e;p=gitmo%2FClass-MOP.git Separate deprecated features to Deprecated.pm With cleanups by Dave Rolksy --- diff --git a/lib/Class/MOP.pm b/lib/Class/MOP.pm index 0af7f84..ba8b14d 100644 --- a/lib/Class/MOP.pm +++ b/lib/Class/MOP.pm @@ -20,11 +20,6 @@ BEGIN { ? sub () { 0 } : sub () { 1 }; - sub HAVE_ISAREV () { - Carp::cluck("Class::MOP::HAVE_ISAREV is deprecated and will be removed in a future release. It has always returned 1 anyway."); - return 1; - } - # this is either part of core or set up appropriately by MRO::Compat *check_package_cache_flag = \&mro::get_pkg_gen; } @@ -153,18 +148,6 @@ sub _is_valid_class_name { return 0; } -sub subname { - require Sub::Name; - Carp::carp("Class::MOP::subname is deprecated. Please use Sub::Name directly."); - goto \&Sub::Name::subname; -} - -sub in_global_destruction { - require Devel::GlobalDestruction; - Carp::carp("Class::MOP::in_global_destruction is deprecated. Please use Devel::GlobalDestruction directly."); - goto \&Devel::GlobalDestruction::in_global_destruction; -} - ## ---------------------------------------------------------------------------- ## Setting up our environment ... ## ---------------------------------------------------------------------------- @@ -676,6 +659,7 @@ Class::MOP::Instance->meta->add_attribute( ), ); +require Class::MOP::Deprecated unless our $no_deprecated; # we need the meta instance of the meta instance to be created now, in order # for the constructor to be able to use it diff --git a/lib/Class/MOP/Attribute.pm b/lib/Class/MOP/Attribute.pm index 8f30cc2..57dbf85 100644 --- a/lib/Class/MOP/Attribute.pm +++ b/lib/Class/MOP/Attribute.pm @@ -341,12 +341,6 @@ sub clear_value { sub accessor_metaclass { 'Class::MOP::Method::Accessor' } -sub process_accessors { - Carp::cluck('The process_accessors method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_process_accessors(@_); -} - sub _process_accessors { my ($self, $type, $accessor, $generate_as_inline_methods) = @_; diff --git a/lib/Class/MOP/Class.pm b/lib/Class/MOP/Class.pm index 4d4d6f7..c2679a7 100644 --- a/lib/Class/MOP/Class.pm +++ b/lib/Class/MOP/Class.pm @@ -41,12 +41,6 @@ sub initialize { || $class->_construct_class_instance(package => $package_name, @_); } -sub construct_class_instance { - Carp::cluck('The construct_class_instance method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_construct_class_instance(@_); -} - # NOTE: (meta-circularity) # this is a special form of _construct_instance # (see below), which is used to construct class @@ -170,13 +164,6 @@ sub update_package_cache_flag { $self->{'_package_cache_flag'} = Class::MOP::check_package_cache_flag($self->name); } - -sub check_metaclass_compatibility { - Carp::cluck('The check_metaclass_compatibility method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_check_metaclass_compatibility(@_); -} - sub _check_metaclass_compatibility { my $self = shift; @@ -364,12 +351,6 @@ sub new_object { return $class->_construct_instance(@_); } -sub construct_instance { - Carp::cluck('The construct_instance method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_construct_instance(@_); -} - sub _construct_instance { my $class = shift; my $params = @_ == 1 ? $_[0] : {@_}; @@ -403,12 +384,6 @@ sub get_meta_instance { $self->{'_meta_instance'} ||= $self->_create_meta_instance(); } -sub create_meta_instance { - Carp::cluck('The create_meta_instance method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_create_meta_instance(@_); -} - sub _create_meta_instance { my $self = shift; @@ -437,12 +412,6 @@ sub clone_object { $class->_clone_instance($instance, @_); } -sub clone_instance { - Carp::cluck('The clone_instance method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_clone_instance(@_); -} - sub _clone_instance { my ($class, $instance, %params) = @_; (blessed($instance)) @@ -668,12 +637,6 @@ sub class_precedence_list { # to, and so don't need the fully qualified name. } -sub alias_method { - Carp::cluck("The alias_method method is deprecated. Use add_method instead.\n"); - - shift->add_method(@_); -} - sub find_method_by_name { my ($self, $method_name) = @_; (defined $method_name && $method_name) @@ -691,19 +654,6 @@ sub get_all_methods { return values %methods; } -sub compute_all_applicable_methods { - Carp::cluck('The compute_all_applicable_methods method is deprecated.' - . " Use get_all_methods instead.\n"); - - return map { - { - name => $_->name, - class => $_->package_name, - code => $_, # sigh, overloading - }, - } shift->get_all_methods(@_); -} - sub get_all_method_names { my $self = shift; my %uniq; @@ -894,13 +844,6 @@ sub get_all_attributes { return values %attrs; } -sub compute_all_applicable_attributes { - Carp::cluck('The compute_all_applicable_attributes method has been deprecated.' - . " Use get_all_attributes instead.\n"); - - shift->get_all_attributes(@_); -} - sub find_attribute_by_name { my ($self, $attr_name) = @_; foreach my $class ($self->linearized_isa) { diff --git a/lib/Class/MOP/Deprecated.pm b/lib/Class/MOP/Deprecated.pm new file mode 100755 index 0000000..a3225fe --- /dev/null +++ b/lib/Class/MOP/Deprecated.pm @@ -0,0 +1,391 @@ +package Class::MOP::Deprecated; + +use strict; +use warnings; +use Carp qw(cluck); + +our $VERSION = '0.92'; +$VERSION = eval $VERSION; +our $AUTHORITY = 'cpan:STEVAN'; + +my %DeprecatedAt = ( + + # features deprecated before 0.93 + 'Class::MOP::HAVE_ISAREV' => 0.93, + 'Class::MOP::subname' => 0.93, + 'Class::MOP::in_global_destruction' => 0.93, + + 'Class::MOP::Class::construct_class_instance' => 0.93, + 'Class::MOP::Class::check_metaclass_compatibility' => 0.93, + 'Class::MOP::Class::create_meta_instance' => 0.93, + 'Class::MOP::Class::clone_instance' => 0.93, + 'Class::MOP::Class::alias_method' => 0.93, + 'Class::MOP::Class::compute_all_applicable_methods' => 0.93, + 'Class::MOP::Class::compute_all_applicable_attributes' => 0.93, + + 'Class::MOP::Instance::bless_instance_structure' => 0.93, + + 'Class::MOP::Attribute::process_accessors' => 0.93, + + 'Class::MOP::Method::Accessor::initialize_body' => 0.93, + 'Class::MOP::Method::Accessor::generate_accessor_method' => 0.93, + 'Class::MOP::Method::Accessor::generate_reader_method' => 0.93, + 'Class::MOP::Method::Accessor::generate_writer_method' => 0.93, + 'Class::MOP::Method::Accessor::generate_predicate_method' => 0.93, + 'Class::MOP::Method::Accessor::generate_clearer_method' => 0.93, + 'Class::MOP::Method::Accessor::generate_accessor_method_inline' => 0.93, + 'Class::MOP::Method::Accessor::generate_reader_method_inline' => 0.93, + 'Class::MOP::Method::Accessor::generate_writer_method_inline' => 0.93, + 'Class::MOP::Method::Accessor::generate_clearer_method_inline' => 0.93, + 'Class::MOP::Method::Accessor::generate_predicate_method_inline' => 0.93, + + 'Class::MOP::Method::Constructor::meta_instance' => 0.93, + 'Class::MOP::Method::Constructor::attributes' => 0.93, + 'Class::MOP::Method::Constructor::initialize_body' => 0.93, + 'Class::MOP::Method::Constructor::generate_constructor_method' => 0.93, + 'Class::MOP::Method::Constructor::generate_constructor_method_inline' => + 0.93, + + # features deprecated after 0.93 + # ... +); + +my %Registry; + +sub import { + my ( $class, %args ) = @_; + + if ( defined( my $compat_version = delete $args{-compatible} ) ) { + $Registry{ (caller) } = $compat_version; + } + + if (%args) { + my $unknowns = join q{ }, keys %args; + cluck "Unknown argument(s) for $class->import: $unknowns.\n"; + } + return; +} + +sub warn { + my ( $package, undef, undef, $feature ) = caller(1); + + my $compat_version; + while ( $package && !defined( $compat_version = $Registry{$package} ) ) { + $package =~ s/ :: \w+ \z//xms or last; + } + + my $deprecated_at = $DeprecatedAt{$feature} + or die "Unregistered deprecated feature: $feature"; + + if ( !defined($compat_version) + || $compat_version >= $DeprecatedAt{$feature} ) { + goto &cluck; + } +} + +package + Class::MOP; + +sub HAVE_ISAREV () { + Class::MOP::Deprecated::warn( + "Class::MOP::HAVE_ISAREV is deprecated and will be removed in a future release. It has always returned 1 anyway." + ); + return 1; +} + +sub subname { + Class::MOP::Deprecated::warn( + "Class::MOP::subname is deprecated. Please use Sub::Name directly."); + require Sub::Name; + goto \&Sub::Name::subname; +} + +sub in_global_destruction { + Class::MOP::Deprecated::warn( + "Class::MOP::in_global_destruction is deprecated. Please use Devel::GlobalDestruction directly." + ); + require Devel::GlobalDestruction; + goto \&Devel::GlobalDestruction::in_global_destruction; +} + +package + Class::MOP::Package; + +package + Class::MOP::Module; + +package + Class::MOP::Class; + +sub construct_class_instance { + Class::MOP::Deprecated::warn( + 'The construct_class_instance method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_construct_class_instance(@_); +} + +sub check_metaclass_compatibility { + Class::MOP::Deprecated::warn( + 'The check_metaclass_compatibility method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_check_metaclass_compatibility(@_); +} + +sub construct_instance { + Class::MOP::Deprecated::warn( + 'The construct_instance method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_construct_instance(@_); +} + +sub create_meta_instance { + Class::MOP::Deprecated::warn( + 'The create_meta_instance method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_create_meta_instance(@_); +} + +sub clone_instance { + Class::MOP::Deprecated::warn( + 'The clone_instance method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_clone_instance(@_); +} + +sub alias_method { + Class::MOP::Deprecated::warn( + "The alias_method method is deprecated. Use add_method instead.\n"); + + shift->add_method(@_); +} + +sub compute_all_applicable_methods { + Class::MOP::Deprecated::warn( + 'The compute_all_applicable_methods method is deprecated.' + . " Use get_all_methods instead.\n" ); + + return map { + { + name => $_->name, + class => $_->package_name, + code => $_, # sigh, overloading + }, + } shift->get_all_methods(@_); +} + +sub compute_all_applicable_attributes { + Class::MOP::Deprecated::warn( + 'The compute_all_applicable_attributes method has been deprecated.' + . " Use get_all_attributes instead.\n" ); + + shift->get_all_attributes(@_); +} + +package + Class::MOP::Instance; + +sub bless_instance_structure { + Class::MOP::Deprecated::warn( + 'The bless_instance_structure method is deprecated.' + . " It will be removed in a future release.\n" ); + + my ( $self, $instance_structure ) = @_; + bless $instance_structure, $self->_class_name; +} + +package + Class::MOP::Attribute; + +sub process_accessors { + Class::MOP::Deprecated::warn( + 'The process_accessors method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_process_accessors(@_); +} + +package + Class::MOP::Method::Accessor; + +sub initialize_body { + Class::MOP::Deprecated::warn( + 'The initialize_body method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_initialize_body; +} + +sub generate_accessor_method { + Class::MOP::Deprecated::warn( + 'The generate_accessor_method method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_generate_accessor_method; +} + +sub generate_reader_method { + Class::MOP::Deprecated::warn( + 'The generate_reader_method method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_generate_reader_method; +} + +sub generate_writer_method { + Class::MOP::Deprecated::warn( + 'The generate_writer_method method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_generate_writer_method; +} + +sub generate_predicate_method { + Class::MOP::Deprecated::warn( + 'The generate_predicate_method method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_generate_predicate_method; +} + +sub generate_clearer_method { + Class::MOP::Deprecated::warn( + 'The generate_clearer_method method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_generate_clearer_method; +} + +sub generate_accessor_method_inline { + Class::MOP::Deprecated::warn( + 'The generate_accessor_method_inline method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_generate_accessor_method_inline; +} + +sub generate_reader_method_inline { + Class::MOP::Deprecated::warn( + 'The generate_reader_method_inline method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_generate_reader_method_inline; +} + +sub generate_writer_method_inline { + Class::MOP::Deprecated::warn( + 'The generate_writer_method_inline method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_generate_writer_method_inline; +} + +sub generate_predicate_method_inline { + Class::MOP::Deprecated::warn( + 'The generate_predicate_method_inline method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_generate_predicate_method_inline; +} + +sub generate_clearer_method_inline { + Class::MOP::Deprecated::warn( + 'The generate_clearer_method_inline method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_generate_clearer_method_inline; +} + +package + Class::MOP::Method::Constructor; + +sub meta_instance { + Class::MOP::Deprecated::warn( + 'The meta_instance method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_meta_instance; +} + +sub attributes { + Class::MOP::Deprecated::warn( + 'The attributes method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + + return shift->_attributes; +} + +sub initialize_body { + Class::MOP::Deprecated::warn( + 'The initialize_body method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_initialize_body; +} + +sub generate_constructor_method { + Class::MOP::Deprecated::warn( + 'The generate_constructor_method method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_generate_constructor_method; +} + +sub generate_constructor_method_inline { + Class::MOP::Deprecated::warn( + 'The generate_constructor_method_inline method has been made private.' + . " The public version is deprecated and will be removed in a future release.\n" + ); + shift->_generate_constructor_method_inline; +} + +1; + +__END__ + +=pod + +=head1 NAME + +Class::MOP::Deprecated - List of deprecated methods + +=head1 DESCRIPTION + + use Class::MOP::Deprecated -compatible => $version; + +=head1 FUNCTIONS + +This class provides methods that have been deprecated but remain for backward compatibility. + +If you specify C<< -compatible => $version >>, you can use deprecated features without warnings. +Note that this special treatment is package-scoped. + +=over 4 + +=item B + +Checks compatibility for the caller feature, and produces warnings if needed. + +This function is used in internals. + +=back + +=head1 AUTHORS + +Goro Fuji Egfuji@cpan.orgE + +=head1 COPYRIGHT AND LICENSE + +Copyright 2006-2009 by Infinity Interactive, Inc. + +L + +This library is free software; you can redistribute it and/or modify +it under the same terms as Perl itself. + +=cut diff --git a/lib/Class/MOP/Instance.pm b/lib/Class/MOP/Instance.pm index fc418d8..ad787e3 100644 --- a/lib/Class/MOP/Instance.pm +++ b/lib/Class/MOP/Instance.pm @@ -77,15 +77,6 @@ sub create_instance { bless {}, $self->_class_name; } -# for compatibility -sub bless_instance_structure { - Carp::cluck('The bless_instance_structure method is deprecated.' - . " It will be removed in a future release.\n"); - - my ($self, $instance_structure) = @_; - bless $instance_structure, $self->_class_name; -} - sub clone_instance { my ($self, $instance) = @_; bless { %$instance }, $self->_class_name; diff --git a/lib/Class/MOP/Method/Accessor.pm b/lib/Class/MOP/Method/Accessor.pm index a92b5bc..13889ab 100644 --- a/lib/Class/MOP/Method/Accessor.pm +++ b/lib/Class/MOP/Method/Accessor.pm @@ -74,12 +74,6 @@ sub accessor_type { (shift)->{'accessor_type'} } ## factory -sub initialize_body { - Carp::cluck('The initialize_body method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_initialize_body; -} - sub _initialize_body { my $self = shift; @@ -95,12 +89,6 @@ sub _initialize_body { ## generators -sub generate_accessor_method { - Carp::cluck('The generate_accessor_method method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_generate_accessor_method; -} - sub _generate_accessor_method { my $attr = (shift)->associated_attribute; return sub { @@ -109,12 +97,6 @@ sub _generate_accessor_method { }; } -sub generate_reader_method { - Carp::cluck('The generate_reader_method method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_generate_reader_method; -} - sub _generate_reader_method { my $attr = (shift)->associated_attribute; return sub { @@ -123,11 +105,6 @@ sub _generate_reader_method { }; } -sub generate_writer_method { - Carp::cluck('The generate_writer_method method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_generate_writer_method; -} sub _generate_writer_method { my $attr = (shift)->associated_attribute; @@ -136,12 +113,6 @@ sub _generate_writer_method { }; } -sub generate_predicate_method { - Carp::cluck('The generate_predicate_method method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_generate_predicate_method; -} - sub _generate_predicate_method { my $attr = (shift)->associated_attribute; return sub { @@ -149,12 +120,6 @@ sub _generate_predicate_method { }; } -sub generate_clearer_method { - Carp::cluck('The generate_clearer_method method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_generate_clearer_method; -} - sub _generate_clearer_method { my $attr = (shift)->associated_attribute; return sub { @@ -164,12 +129,6 @@ sub _generate_clearer_method { ## Inline methods -sub generate_accessor_method_inline { - Carp::cluck('The generate_accessor_method_inline method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_generate_accessor_method_inline; -} - sub _generate_accessor_method_inline { my $self = shift; my $attr = $self->associated_attribute; @@ -189,12 +148,6 @@ sub _generate_accessor_method_inline { return $code; } -sub generate_reader_method_inline { - Carp::cluck('The generate_reader_method_inline method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_generate_reader_method_inline; -} - sub _generate_reader_method_inline { my $self = shift; my $attr = $self->associated_attribute; @@ -213,12 +166,6 @@ sub _generate_reader_method_inline { return $code; } -sub generate_writer_method_inline { - Carp::cluck('The generate_writer_method_inline method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_generate_writer_method_inline; -} - sub _generate_writer_method_inline { my $self = shift; my $attr = $self->associated_attribute; @@ -236,12 +183,6 @@ sub _generate_writer_method_inline { return $code; } -sub generate_predicate_method_inline { - Carp::cluck('The generate_predicate_method_inline method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_generate_predicate_method_inline; -} - sub _generate_predicate_method_inline { my $self = shift; my $attr = $self->associated_attribute; @@ -259,12 +200,6 @@ sub _generate_predicate_method_inline { return $code; } -sub generate_clearer_method_inline { - Carp::cluck('The generate_clearer_method_inline method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_generate_clearer_method_inline; -} - sub _generate_clearer_method_inline { my $self = shift; my $attr = $self->associated_attribute; diff --git a/lib/Class/MOP/Method/Constructor.pm b/lib/Class/MOP/Method/Constructor.pm index e145a48..36fce28 100644 --- a/lib/Class/MOP/Method/Constructor.pm +++ b/lib/Class/MOP/Method/Constructor.pm @@ -72,24 +72,11 @@ sub associated_metaclass { (shift)->{'associated_metaclass'} } ## cached values ... -sub meta_instance { - Carp::cluck('The meta_instance method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_meta_instance; -} - sub _meta_instance { my $self = shift; $self->{'meta_instance'} ||= $self->associated_metaclass->get_meta_instance; } -sub attributes { - Carp::cluck('The attributes method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - - return shift->_attributes; -} - sub _attributes { my $self = shift; $self->{'attributes'} ||= [ $self->associated_metaclass->get_all_attributes ] @@ -97,12 +84,6 @@ sub _attributes { ## method -sub initialize_body { - Carp::cluck('The initialize_body method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_initialize_body; -} - sub _initialize_body { my $self = shift; my $method_name = '_generate_constructor_method'; @@ -112,22 +93,10 @@ sub _initialize_body { $self->{'body'} = $self->$method_name; } -sub generate_constructor_method { - Carp::cluck('The generate_constructor_method method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_generate_constructor_method; -} - sub _generate_constructor_method { return sub { Class::MOP::Class->initialize(shift)->new_object(@_) } } -sub generate_constructor_method_inline { - Carp::cluck('The generate_constructor_method_inline method has been made private.' - . " The public version is deprecated and will be removed in a future release.\n"); - shift->_generate_constructor_method_inline; -} - sub _generate_constructor_method_inline { my $self = shift; diff --git a/t/500_deprecated.t b/t/500_deprecated.t new file mode 100755 index 0000000..165219e --- /dev/null +++ b/t/500_deprecated.t @@ -0,0 +1,55 @@ +use strict; +use warnings; + +use Test::More tests => 4; +use Test::Exception; + +use Carp; + +$SIG{__WARN__} = \&croak; + +{ + package Foo; + use Test::More; + use Test::Exception; + + throws_ok { + Class::MOP::in_global_destruction(); + } qr/\b deprecated \b/xmsi, 'complained'; +} + +{ + package Bar; + use Test::More; + use Test::Exception; + + use Class::MOP::Deprecated -compatible => 0.93; + + throws_ok { + Class::MOP::in_global_destruction(); + } qr/\b deprecated \b/xmsi, 'complained'; +} + +{ + package Baz; + use Test::More; + use Test::Exception; + + use Class::MOP::Deprecated -compatible => 0.92; + + lives_ok { + Class::MOP::in_global_destruction(); + } 'safe'; +} + + +{ + package Baz::Inner; + use Test::More; + use Test::Exception; + + lives_ok { + Class::MOP::in_global_destruction(); + } 'safe in an inner class'; +} + diff --git a/xt/author/pod_spell.t b/xt/author/pod_spell.t index 1ad23e6..53a1703 100644 --- a/xt/author/pod_spell.t +++ b/xt/author/pod_spell.t @@ -64,6 +64,7 @@ Stevan Vilain wreis Yuval +Goro ## proper names AOP