From: Tomas Doran Date: Sat, 5 May 2012 13:04:55 +0000 (+0100) Subject: Remove dep on B::H::EOS, for RT#76437 X-Git-Tag: 5.90012~3 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=38e43e6542f104aa1fb29819a41f6d03f78667a8 Remove dep on B::H::EOS, for RT#76437 --- diff --git a/Changes b/Changes index b1cc874..ecfb766 100644 --- a/Changes +++ b/Changes @@ -13,6 +13,10 @@ duplicate plugins are totally unwise, the C3 error given to the user is less than helpful. + - Remove dependence on obscure behaviour in B::Hooks::EndOfScope + for backward compatibility. This fixes issues with behaviour changes + in bleadperl. RT#76437 + Documentation: - Fix documentation in Catalyst::Component to show attributes and calling readers, rather than accessing elements in the $self->{} hash diff --git a/Makefile.PL b/Makefile.PL index 0ccd96f..39a964e 100644 --- a/Makefile.PL +++ b/Makefile.PL @@ -19,7 +19,6 @@ all_from 'lib/Catalyst/Runtime.pm'; requires 'List::MoreUtils'; requires 'namespace::autoclean' => '0.09'; requires 'namespace::clean' => '0.23'; -requires 'B::Hooks::EndOfScope' => '0.10'; requires 'MooseX::Emulate::Class::Accessor::Fast' => '0.00903'; requires 'Class::Load' => '0.12'; requires 'Class::MOP' => '0.95'; diff --git a/lib/Catalyst.pm b/lib/Catalyst.pm index a2cfa74..25ba9d2 100644 --- a/lib/Catalyst.pm +++ b/lib/Catalyst.pm @@ -4,7 +4,7 @@ use Moose; use Moose::Meta::Class (); extends 'Catalyst::Component'; use Moose::Util qw/find_meta/; -use B::Hooks::EndOfScope (); +use namespace::clean -except => 'meta'; use Catalyst::Exception; use Catalyst::Exception::Detach; use Catalyst::Exception::Go; @@ -1184,29 +1184,6 @@ EOF $class->log->info("$name powered by Catalyst $Catalyst::VERSION"); } - # Make sure that the application class becomes immutable at this point, - B::Hooks::EndOfScope::on_scope_end { - return if $@; - my $meta = Class::MOP::get_metaclass_by_name($class); - if ( - $meta->is_immutable - && ! { $meta->immutable_options }->{replace_constructor} - && ( - $class->isa('Class::Accessor::Fast') - || $class->isa('Class::Accessor') - ) - ) { - warn "You made your application class ($class) immutable, " - . "but did not inline the\nconstructor. " - . "This will break catalyst, as your app \@ISA " - . "Class::Accessor(::Fast)?\nPlease pass " - . "(replace_constructor => 1)\nwhen making your class immutable.\n"; - } - $meta->make_immutable( - replace_constructor => 1, - ) unless $meta->is_immutable; - }; - if ($class->config->{case_sensitive}) { $class->log->warn($class . "->config->{case_sensitive} is set."); $class->log->warn("This setting is deprecated and planned to be removed in Catalyst 5.81."); @@ -2446,11 +2423,35 @@ Starts the engine. sub run { my $app = shift; + $app->_make_immutable_if_needed; $app->engine_loader->needs_psgi_engine_compat_hack ? $app->engine->run($app, @_) : $app->engine->run( $app, $app->_finalized_psgi_app, @_ ); } +sub _make_immutable_if_needed { + my $class = shift; + my $meta = Class::MOP::get_metaclass_by_name($class); + my $isa_ca = $class->isa('Class::Accessor::Fast') || $class->isa('Class::Accessor'); + if ( + $meta->is_immutable + && ! { $meta->immutable_options }->{replace_constructor} + && $isa_ca + ) { + warn("You made your application class ($class) immutable, " + . "but did not inline the\nconstructor. " + . "This will break catalyst, as your app \@ISA " + . "Class::Accessor(::Fast)?\nPlease pass " + . "(replace_constructor => 1)\nwhen making your class immutable.\n"); + } + unless ($meta->is_immutable) { + # XXX - FIXME warning here as you should make your app immutable yourself. + $meta->make_immutable( + replace_constructor => 1, + ); + } +} + =head2 $c->set_action( $action, $code, $namespace, $attrs ) Sets an action in a given namespace. @@ -2928,6 +2929,11 @@ the plugin name does not begin with C. Class::MOP::load_class( $plugin ); $class->log->warn( "$plugin inherits from 'Catalyst::Component' - this is deprecated and will not work in 5.81" ) if $plugin->isa( 'Catalyst::Component' ); + my $plugin_meta = Moose::Meta::Class->create($plugin); + if (!$plugin_meta->has_method('new') + && ( $plugin->isa('Class::Accessor::Fast') || $plugin->isa('Class::Accessor') ) ) { + $plugin_meta->add_method('new', Moose::Object->meta->get_method('new')) + } if (!$instant && !$proto->_plugins->{$plugin}) { my $meta = Class::MOP::get_metaclass_by_name($class); $meta->superclasses($plugin, $meta->superclasses); diff --git a/t/lib/TestAppBadlyImmutable.pm b/t/lib/TestAppBadlyImmutable.pm index 2beefe6..48a13fd 100644 --- a/t/lib/TestAppBadlyImmutable.pm +++ b/t/lib/TestAppBadlyImmutable.pm @@ -1,10 +1,12 @@ package TestAppBadlyImmutable; use Catalyst qw/+TestPluginWithConstructor/; + +use base qw/Class::Accessor Catalyst/; + use Test::More; __PACKAGE__->setup; -ok !__PACKAGE__->meta->is_immutable, 'Am not already immutable'; __PACKAGE__->meta->make_immutable( inline_constructor => 0 ); ok __PACKAGE__->meta->is_immutable, 'Am now immutable'; diff --git a/t/plugin_new_method_backcompat.t b/t/plugin_new_method_backcompat.t index c0cb13a..e0b94eb 100644 --- a/t/plugin_new_method_backcompat.t +++ b/t/plugin_new_method_backcompat.t @@ -15,6 +15,7 @@ use FindBin; use lib "$FindBin::Bin/lib"; use Catalyst::Test qw/TestAppPluginWithConstructor/; +TestAppPluginWithConstructor->_make_immutable_if_needed; ok find_meta('TestAppPluginWithConstructor')->is_immutable, 'Am immutable after use'; @@ -22,8 +23,11 @@ ok request('/foo')->is_success, 'Can get /foo'; is $TestAppPluginWithConstructor::MODIFIER_FIRED, 1, 'Before modifier was fired correctly.'; my $warning; -local $SIG{__WARN__} = sub { $warning = $_[0] }; -eval "use TestAppBadlyImmutable;"; +eval "use TestAppBadlyImmutable"; +local $SIG{__WARN__} = sub { $warning .= $_[0] }; + +TestAppBadlyImmutable->_make_immutable_if_needed; + like $warning, qr/\QYou made your application class (TestAppBadlyImmutable) immutable/, 'An application class that is already immutable but does not inline the constructor warns at ->setup';