Initial commit of Moosified Catalyst parts.
[catagits/Catalyst-Runtime.git] / lib / Catalyst / ActionChain.pm
index 2bcc31f..60fd6db 100644 (file)
@@ -1,9 +1,25 @@
 package Catalyst::ActionChain;
 
-use strict;
-use base qw/Catalyst::Action/;
+use Moose;
+extends qw(Catalyst::Action);
 
-__PACKAGE__->mk_accessors(qw/chain/);
+has chain => (is => 'rw');
+
+=head1 NAME
+
+Catalyst::ActionChain - Chain of Catalyst Actions
+
+=head1 SYNOPSIS
+
+See L<Catalyst::Manual::Intro> for more info about Chained actions.
+
+=head1 DESCRIPTION
+
+This class represents a chain of Catalyst Actions. It behaves exactly like
+the action at the *end* of the chain except on dispatch it will execute all
+the actions in the chain in order.
+
+=cut
 
 use overload (
 
@@ -18,19 +34,32 @@ use overload (
 
 );
 
-=head1 NAME
-
-Catalyst::ActionChain - Chain of Catalyst Actions
 
-=head1 SYNOPSIS
+sub dispatch {
+    my ( $self, $c ) = @_;
+    my @captures = @{$c->req->captures||[]};
+    my @chain = @{ $self->chain };
+    my $last = pop(@chain);
+    foreach my $action ( @chain ) {
+        my @args;
+        if (my $cap = $action->attributes->{CaptureArgs}) {
+          @args = splice(@captures, 0, $cap->[0]);
+        }
+        local $c->request->{arguments} = \@args;
+        $action->dispatch( $c );
+    }
+    $last->dispatch( $c );
+}
 
-See L<Catalyst>.
+sub from_chain {
+    my ( $self, $actions ) = @_;
+    my $final = $actions->[-1];
+    return $self->new({ %$final, chain => $actions });
+}
 
-=head1 DESCRIPTION
+1;
 
-This class represents a chain of Catalyst Actions. It behaves exactly like
-the action at the *end* of the chain except on dispatch it will execute all
-the actions in the chain in order.
+__END__
 
 =head1 METHODS
 
@@ -44,27 +73,14 @@ objects encapsulated by this chain.
 Dispatch this action chain against a context; will dispatch the encapsulated
 actions in order.
 
-=cut
-
-sub dispatch {
-    my ( $self, $c ) = @_;
-    foreach my $action ( @{ $self->chain } ) {
-        $action->dispatch( $c );
-    }
-}
-
 =head2 from_chain( \@actions )
 
 Takes a list of Catalyst::Action objects and constructs and returns a
 Catalyst::ActionChain object representing a chain of these actions
 
-=cut
+=head2 meta
 
-sub from_chain {
-    my ( $self, $actions ) = @_;
-    my $final = $actions->[-1];
-    return $self->new({ %$final, chain => $actions });
-}
+Provided by Moose
 
 =head1 AUTHOR
 
@@ -76,5 +92,3 @@ This program is free software, you can redistribute it and/or modify it under
 the same terms as Perl itself.
 
 =cut
-
-1;