From: Guillermo Roditi Date: Mon, 23 Jun 2008 21:20:54 +0000 (+0000) Subject: still failing some tests. waiting for suggestions on whether to fix old CDIretardedness X-Git-Tag: 5.8000_03~91 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Runtime.git;a=commitdiff_plain;h=76aab9932e14205c81eeb31d811d2a131eede4cf still failing some tests. waiting for suggestions on whether to fix old CDIretardedness r18426@martha (orig r7904): groditi | 2008-06-09 16:00:14 -0400 --- diff --git a/lib/Catalyst/AttrContainer.pm b/lib/Catalyst/AttrContainer.pm index 39befd4..060ee59 100644 --- a/lib/Catalyst/AttrContainer.pm +++ b/lib/Catalyst/AttrContainer.pm @@ -4,6 +4,7 @@ use Moose; use Catalyst::Exception; with 'Catalyst::ClassData'; +use Scalar::Util 'blessed'; no Moose; diff --git a/lib/Catalyst/ClassData.pm b/lib/Catalyst/ClassData.pm index 23fd110..b4eecbe 100644 --- a/lib/Catalyst/ClassData.pm +++ b/lib/Catalyst/ClassData.pm @@ -1,6 +1,7 @@ package Catalyst::ClassData; use Moose::Role; +use Class::MOP; use Scalar::Util 'blessed'; sub mk_classdata { @@ -11,19 +12,20 @@ sub mk_classdata { my $slot = '$'.$attribute; my $accessor = sub { if(@_ > 1){ - $_[0]->meta->add_package_symbol($slot, \ $_[1]); + $_[0]->meta->add_package_symbol($slot, \ $_[1]); return $_[1]; } - foreach my $super ( $_[0], $_[0]->meta->linearized_isa ) { - my $meta = $super->meta; + + foreach my $super ( (blessed $_[0] || $_[0]), $_[0]->meta->linearized_isa ) { + my $meta = Moose::Meta::Class->initialize($super); if( $meta->has_package_symbol($slot) ){ - return $meta->get_package_symbol($slot); + return ${ $meta->get_package_symbol($slot) }; } } return; }; - my $accessor = eval $code; - confess("Failed to create accessor: $@ \n $code \n") + + confess("Failed to create accessor: $@ ") unless ref $accessor eq 'CODE'; my $meta = $class->meta; @@ -37,18 +39,3 @@ sub mk_classdata { 1; __END__ - -# my $code = ' sub { -# if(@_ > 1){ -# $_[0]->meta->add_package_symbol(\''.$slot.'\', \ $_[1]); -# return $_[1]; -# } -# foreach my $super ( $_[0], $_[0]->meta->linearized_isa ) { -# my $meta = $super->meta; -# if( $meta->has_package_symbol(\''.$slot.'\') ){ -# return $meta->get_package_symbol(\''.$slot.'\'); -# } -# } -# return; -# }'; -# my $accessor = eval $code; diff --git a/lib/Catalyst/Component.pm b/lib/Catalyst/Component.pm index 0d80785..a66a7c2 100644 --- a/lib/Catalyst/Component.pm +++ b/lib/Catalyst/Component.pm @@ -84,29 +84,12 @@ sub COMPONENT { sub config { my $self = shift; - my $config_sub = $self->can('_config'); - my $config = $self->$config_sub() || {}; + my $config = $self->_config ||{}; 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_core_classdata.t b/t/unit_core_classdata.t new file mode 100644 index 0000000..eee3a35 --- /dev/null +++ b/t/unit_core_classdata.t @@ -0,0 +1,84 @@ +#!/usr/bin/perl + +use strict; +use warnings; +use Scalar::Util qw/refaddr blessed/; +use Test::More tests => 32; + +{ + package ClassDataTest; + use Moose; + with 'Catalyst::ClassData'; + + package ClassDataTest2; + use Moose; + extends 'ClassDataTest'; + +} + + my $scalar = '100'; + my $arrayref = []; + my $hashref = {}; + my $scalarref = \$scalar; + my $coderef = sub { "beep" }; + + my $scalar2 = '200'; + my $arrayref2 = []; + my $hashref2 = {}; + my $scalarref2 = \$scalar2; + my $coderef2 = sub { "beep" }; + + +my @accessors = qw/_arrayref _hashref _scalarref _coderef _scalar/; +ClassDataTest->mk_classdata($_) for @accessors; +can_ok('ClassDataTest', @accessors); + +ClassDataTest2->mk_classdata("beep", "meep"); +is(ClassDataTest2->beep, "meep"); + +ClassDataTest->_arrayref($arrayref); +ClassDataTest->_hashref($hashref); +ClassDataTest->_scalarref($scalarref); +ClassDataTest->_coderef($coderef); +ClassDataTest->_scalar($scalar); + +is(ref(ClassDataTest->_arrayref), 'ARRAY'); +is(ref(ClassDataTest->_hashref), 'HASH'); +is(ref(ClassDataTest->_scalarref), 'SCALAR'); +is(ref(ClassDataTest->_coderef), 'CODE'); +ok( !ref(ClassDataTest->_scalar) ); +is(refaddr(ClassDataTest->_arrayref), refaddr($arrayref)); +is(refaddr(ClassDataTest->_hashref), refaddr($hashref)); +is(refaddr(ClassDataTest->_scalarref), refaddr($scalarref)); +is(refaddr(ClassDataTest->_coderef), refaddr($coderef)); +is(ClassDataTest->_scalar, $scalar); + + +is(ref(ClassDataTest2->_arrayref), 'ARRAY'); +is(ref(ClassDataTest2->_hashref), 'HASH'); +is(ref(ClassDataTest2->_scalarref), 'SCALAR'); +is(ref(ClassDataTest2->_coderef), 'CODE'); +ok( !ref(ClassDataTest2->_scalar) ); +is(refaddr(ClassDataTest2->_arrayref), refaddr($arrayref)); +is(refaddr(ClassDataTest2->_hashref), refaddr($hashref)); +is(refaddr(ClassDataTest2->_scalarref), refaddr($scalarref)); +is(refaddr(ClassDataTest2->_coderef), refaddr($coderef)); +is(ClassDataTest2->_scalar, $scalar); + +ClassDataTest2->_arrayref($arrayref2); +ClassDataTest2->_hashref($hashref2); +ClassDataTest2->_scalarref($scalarref2); +ClassDataTest2->_coderef($coderef2); +ClassDataTest2->_scalar($scalar2); + +is(refaddr(ClassDataTest2->_arrayref), refaddr($arrayref2)); +is(refaddr(ClassDataTest2->_hashref), refaddr($hashref2)); +is(refaddr(ClassDataTest2->_scalarref), refaddr($scalarref2)); +is(refaddr(ClassDataTest2->_coderef), refaddr($coderef2)); +is(ClassDataTest2->_scalar, $scalar2); + +is(refaddr(ClassDataTest->_arrayref), refaddr($arrayref)); +is(refaddr(ClassDataTest->_hashref), refaddr($hashref)); +is(refaddr(ClassDataTest->_scalarref), refaddr($scalarref)); +is(refaddr(ClassDataTest->_coderef), refaddr($coderef)); +is(ClassDataTest->_scalar, $scalar);