X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FBase.pm;h=6bda121cc85a68260f1867cbaf775435d5788418;hb=ba599d1c7a0c3219cd3825264c44d22362ed179a;hp=789c6ab9f987b41334456a1761e787f5c9e36946;hpb=fe9da43b6e3d56a319467179c17b5e0c4b272b8a;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Base.pm b/lib/Catalyst/Base.pm index 789c6ab..6bda121 100644 --- a/lib/Catalyst/Base.pm +++ b/lib/Catalyst/Base.pm @@ -1,24 +1,65 @@ package Catalyst::Base; use strict; -use base qw/Class::Data::Inheritable Class::Accessor::Fast/; +use base qw/Catalyst::AttrContainer Class::Accessor::Fast/; use Catalyst::Exception; use NEXT; -__PACKAGE__->mk_classdata($_) for qw/_attr_cache _action_cache _config/; -__PACKAGE__->_attr_cache( {} ); -__PACKAGE__->_action_cache( [] ); +__PACKAGE__->mk_classdata($_) for qw/_config/; -# note - see attributes(3pm) -sub MODIFY_CODE_ATTRIBUTES { - my ( $class, $code, @attrs ) = @_; - $class->_attr_cache->{$code} = [@attrs]; - push @{ $class->_action_cache }, [ $code, [@attrs] ]; - return (); -} +sub _DISPATCH :Private { + my ( $self, $c ) = @_; + my @containers = $c->dispatcher->get_containers( $c->namespace ); + my %actions; + foreach my $name (qw/begin auto end/) { + + # Go down the container list representing each part of the + # current namespace inheritance tree, grabbing the actions hash + # of the ActionContainer object and looking for actions of the + # appropriate name registered to the namespace + + $actions{$name} = [ + map { $_->{$name} } + grep { exists $_->{$name} } + map { $_->actions } @containers + ]; + } + + # Errors break the normal flow and the end action is instantly run + my $error = 0; -sub FETCH_CODE_ATTRIBUTES { $_[0]->_attr_cache->{ $_[1] } || () } + # Execute last begin + $c->state(1); + if ( my $begin = @{ $actions{begin} }[-1] ) { + $begin->execute($c); + $error++ if scalar @{ $c->error }; + } + + # Execute the auto chain + my $autorun = 0; + for my $auto ( @{ $actions{auto} } ) { + last if $error; + $autorun++; + $auto->execute($c); + $error++ if scalar @{ $c->error }; + last unless $c->state; + } + + # Execute the action or last default + my $mkay = $autorun ? $c->state ? 1 : 0 : 1; + if ($mkay) { + unless ($error) { + $c->action->execute($c); + $error++ if scalar @{ $c->error }; + } + } + + # Execute last end + if ( my $end = @{ $actions{end} }[-1] ) { + $end->execute($c); + } +} =head1 NAME @@ -126,6 +167,7 @@ L. Sebastian Riedel, C Marcus Ramberg, C +Matt S Trout, C =head1 COPYRIGHT