From: Matt S Trout Date: Mon, 26 Nov 2007 17:16:50 +0000 (+0000) Subject: fix __PACKAGE__->config->{foo} = 'bar' for subclassing X-Git-Tag: 5.7099_04~103 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=300633a88f8eb00275336ef1088036a117c60478 fix __PACKAGE__->config->{foo} = 'bar' for subclassing --- diff --git a/Changes b/Changes index c48d05a..f44fa49 100644 --- a/Changes +++ b/Changes @@ -1,6 +1,7 @@ # This file documents the revision history for Perl extension Catalyst. 5.7012 + - Fix __PACKAGE__->config->{foo} = 'bar' case with subclassing - Add Catalyst::Stats (Jon Schutz) - Fixed a bug where ?q=bar=baz is decoded as q=>'bar', not 'bar=baz'. (Tatsuhiko Miyagawa, Masahiro Nagano) diff --git a/lib/Catalyst/Component.pm b/lib/Catalyst/Component.pm index 62ab066..116aa9a 100644 --- a/lib/Catalyst/Component.pm +++ b/lib/Catalyst/Component.pm @@ -87,15 +87,29 @@ sub COMPONENT { sub config { my $self = shift; - my $config = $self->_config; - unless ($config) { - $self->_config( $config = {} ); - } + my $config_sub = $self->can('_config'); + my $config = $self->$config_sub() || {}; if (@_) { my $newconfig = { %{@_ > 1 ? {@_} : $_[0]} }; $self->_config( $self->merge_config_hashes( $config, $newconfig ) ); + } else { + # this is a bit of a kludge, required to make + # __PACKAGE__->config->{foo} = 'bar'; + # work in a subclass. Calling the Class::Data::Inheritable setter + # will create a new _config method in the current class if it's + # currently inherited from the superclass. So, the can() call will + # return a different subref in that case and that means we know to + # copy and reset the value stored in the class data. + + $self->_config( $config ); + + if ((my $config_sub_now = $self->can('_config')) ne $config_sub) { + + $config = $self->merge_config_hashes( $config, {} ); + $self->$config_sub_now( $config ); + } } return $config; } diff --git a/t/unit_controller_config.t b/t/unit_controller_config.t index 1a6bd78..d99471c 100755 --- a/t/unit_controller_config.t +++ b/t/unit_controller_config.t @@ -44,7 +44,7 @@ use_ok('Catalyst'); use base 'base_controller'; - __PACKAGE__->config( key_b => 'value_b' ); + __PACKAGE__->config->{key_b} = 'value_b'; } ## Okay, we expect that the base controller has a config with one key