Cat 5.80003 で C:C:Resources 0.04 のテストがコケる

なんか、修正してコミットしようかとか思ったんだけど、色々調べてどうしたらいいのかわからんくなったので、気が付いたことをメモっておきます。
以下の三つをなおすと期待した挙動はします。unattached_action の対処方法で controller に直接書く以外の方法がわかればテストも通るとおもう。

$class->_action_cache

Catalyst::Controller::Resource の setup_actions 内で $class->_action_cache が使われてるけど、Catalyst::AttrContainer がもう使われてないっぽい。(クラス自体はある)

$class->_action_cache のところをコメントアウトすると動く

sub setup_actions {
    my ($self, $map_to, $maps) = @_;
    my $class = ref $self || $self;

#     my @action_cache = @{ $class->_action_cache };
    while (my ($action, $map) = each %$maps) {
        next unless my $code = $class->can($action);
        $map = { method => uc $map } unless ref($map) eq 'HASH';

        my @attrs = $self->_construct_action_attributes($map_to, $map);
        unshift @attrs => @{ attributes::get($code) || [] };

#         # rewrite cache
#         if (my $cache = first { $code eq $_->[0] } @action_cache) {
#             $cache->[1] = [@attrs];
#         }
#         else {
#             push @action_cache => [ $code => [@attrs] ];
#         }
#         $class->_attr_cache->{$code} = [@attrs];
        attributes->import($class, $code, @attrs);
    }

#     # set action_cache
#     $class->_action_cache(\@action_cache);
}

Catalyst::DispatchType::Chained#list の unattached_actions に引っかかる

Catalyst::DispatchType::Chained の Line 113 あたり。5.7 までは chain 元があるかないかとか見てなかったんだけど、追加されたっぽい。

そもそも C:C:Resource の setup_resources で collection と member を追加するようになってるんだけど、DispatchType::Chained の list の方が先に評価されてるとかそういう感じ?

CATALYST_DEBUG=1 で prove 走らせると以下のように出力されます。

[debug] Unattached Chained actions:

.-------------------------------------+--------------------------------------.
| Private                             | Missing parent                       |
+-------------------------------------+--------------------------------------+
| /account/create                     | /account/collection                  |
| /account/destroy                    | /account/member                      |
...

ちなみに MyApp::Controller::* に sub collection {} と sub member {} を直接書くと回避できる。hmm...

belongs_to した時の挙動が変わってしまう

MyApp::Controller::Users::Articles を M:C::Users に blongs_to させておくと例えば各記事の期待する path は /users/1/articles/1 となるんだけど、実際には /users/1/users/articles/1 になる。5.7 系だと期待通り。

この patch あてると 5.8 でも期待通りのどうさになります。これだけコミットしようかとも考えたんだけど、テストが通らないままというのもなんなので。さーせん >_<

*** lib/Catalyst/Controller/Resource.pm.org     2009-05-10 16:53:44.000000000 +0900
--- lib/Catalyst/Controller/Resource.pm 2009-05-10 16:55:05.000000000 +0900
***************
*** 73,79 ****
  
  sub _parse_PathPrefix_attr {
      my ($self, $c, $name, $value) = @_;
!     return PathPart => $self->path_prefix;
  }
  
  sub new {
--- 73,79 ----
  
  sub _parse_PathPrefix_attr {
      my ($self, $c, $name, $value) = @_;
!     return PathPart => $self->{path} || $self->path_prefix;
  }
  
  sub new {

「何言ってんだ、こいつ」と思ったら捕まえてくださいw > id:ikasam_a