use File::stat;
use NEXT;
use Text::SimpleTable;
-use Path::Class;
+use Path::Class::Dir;
+use Path::Class::File;
use Time::HiRes qw/gettimeofday tv_interval/;
use URI;
use Scalar::Util qw/weaken blessed/;
$c->error('Something bad happened');
-Clear errors. You probably don't want to clear the errors unless you are
-implementing a custom error screen.
-
- $c->error(0);
-
=cut
sub error {
return $c->{error} || [];
}
+=head2 $c->clear_errors
+
+Clear errors. You probably don't want to clear the errors unless you are
+implementing a custom error screen.
+
+This is equivalent to running
+
+ $c->error(0);
+
+=cut
+
+sub clear_errors {
+ my $c = shift;
+ $c->error(0);
+}
+
=head2 $c->response
=head2 $c->res
# search via regex
sub _comp_search {
- my ($c, @names) = @_;
+ my ( $c, @names ) = @_;
foreach my $name (@names) {
foreach my $component ( keys %{ $c->components } ) {
- my $comp = $c->components->{$component} if $component =~ /$name/i;
- if ($comp) {
- if ( eval { $comp->can('ACCEPT_CONTEXT'); } ) {
- return $comp->ACCEPT_CONTEXT($c);
- }
- else { return $comp }
- }
+ return $c->components->{$component} if $component =~ /$name/i;
}
}
# try explicit component names
sub _comp_explicit {
- my ($c, @names) = @_;
+ my ( $c, @names ) = @_;
foreach my $try (@names) {
- if ( exists $c->components->{$try} ) {
- my $comp = $c->components->{$try};
- if ( eval { $comp->can('ACCEPT_CONTEXT'); } ) {
- return $comp->ACCEPT_CONTEXT($c);
- }
- else { return $comp }
- }
+ return $c->components->{$try} if ( exists $c->components->{$try} );
}
return undef;
# like component, but try just these prefixes before regex searching,
# and do not try to return "sort keys %{ $c->components }"
sub _comp_prefixes {
- my ($c, $name, @prefixes) = @_;
+ my ( $c, $name, @prefixes ) = @_;
my $appclass = ref $c || $c;
# Return a component if only one matches.
sub _comp_singular {
- my ($c, @prefixes) = @_;
+ my ( $c, @prefixes ) = @_;
my $appclass = ref $c || $c;
- my ($comp,$rest) = map { $c->_comp_search("^${appclass}::${_}::") }
- @prefixes;
+ my ( $comp, $rest ) =
+ map { $c->_comp_search("^${appclass}::${_}::") } @prefixes;
return $comp unless $rest;
}
+# Filter a component before returning by calling ACCEPT_CONTEXT if available
+sub _filter_component {
+ my ( $c, $comp, @args ) = @_;
+ if ( eval { $comp->can('ACCEPT_CONTEXT'); } ) {
+ return $comp->ACCEPT_CONTEXT( $c, @args );
+ }
+ else { return $comp }
+}
+
=head2 COMPONENT ACCESSORS
=head2 $c->comp($name)
);
my $comp = $c->_comp_explicit(@names);
- return $comp if defined($comp);
+ return $c->_filter_component( $comp, @_ ) if defined($comp);
$comp = $c->_comp_search($name);
- return $comp if defined($comp);
+ return $c->_filter_component( $comp, @_ ) if defined($comp);
}
return sort keys %{ $c->components };
=cut
sub controller {
- my ( $c, $name ) = @_;
- return $c->_comp_prefixes($name, qw/Controller C/)
- if ($name);
- return $c->component($c->action->class);
+ my ( $c, $name, @args ) = @_;
+ return $c->_filter_component( $c->_comp_prefixes( $name, qw/Controller C/ ),
+ @args )
+ if ($name);
+ return $c->component( $c->action->class );
}
=head2 $c->model($name)
=cut
sub model {
- my ( $c, $name ) = @_;
- return $c->_comp_prefixes($name, qw/Model M/)
- if $name;
- return $c->comp($c->config->{default_model})
- if $c->config->{default_model};
- return $c->_comp_singular(qw/Model M/);
+ my ( $c, $name, @args ) = @_;
+ return $c->_filter_component( $c->_comp_prefixes( $name, qw/Model M/ ),
+ @args )
+ if $name;
+ return $c->component( $c->config->{default_model} )
+ if $c->config->{default_model};
+ return $c->_filter_component( $c->_comp_singular(qw/Model M/), @args );
}
=cut
sub view {
- my ( $c, $name ) = @_;
- return $c->_comp_prefixes($name, qw/View V/)
- if $name;
- return $c->comp($c->config->{default_view})
- if $c->config->{default_view};
- return $c->_comp_singular(qw/View V/);
+ my ( $c, $name, @args ) = @_;
+ return $c->_filter_component( $c->_comp_prefixes( $name, qw/View V/ ),
+ @args )
+ if $name;
+ return $c->component( $c->config->{default_view} )
+ if $c->config->{default_view};
+ return $c->_filter_component( $c->_comp_singular(qw/View V/) );
}
=head2 Class data and helper classes
sub path_to {
my ( $c, @path ) = @_;
- my $path = dir( $c->config->{home}, @path );
+ my $path = Path::Class::Dir->new( $c->config->{home}, @path );
if ( -d $path ) { return $path }
- else { return file( $c->config->{home}, @path ) }
+ else { return Path::Class::File->new( $c->config->{home}, @path ) }
}
=head2 $c->plugin( $name, $class, @args )
$class = $c->component($class) || $class;
$c->state(0);
- if ($c->depth >= $RECURSION) {
+ if ( $c->depth >= $RECURSION ) {
my $action = "$code";
$action = "/$action" unless $action =~ /\-\>/;
my $error = qq/Deep recursion detected calling "$action"/;
return $c->state;
}
-
if ( $c->debug ) {
my $action = "$code";
$action = "/$action" unless $action =~ /\-\>/;
if ( $c->response->body && !$c->response->content_length ) {
# get the length from a filehandle
- if ( blessed($c->response->body) && $c->response->body->can('read') ) {
+ if ( blessed( $c->response->body ) && $c->response->body->can('read') )
+ {
if ( my $stat = stat $c->response->body ) {
$c->response->content_length( $stat->size );
}
if ($home) {
$class->config->{home} ||= $home;
- $class->config->{root} ||= dir($home)->subdir('root');
+ $class->config->{root} ||= Path::Class::Dir->new($home)->subdir('root');
}
}
sub registered_plugins {
my $proto = shift;
- return sort keys %{$proto->_plugins} unless @_;
+ return sort keys %{ $proto->_plugins } unless @_;
my $plugin = shift;
return 1 if exists $proto->_plugins->{$plugin};
return exists $proto->_plugins->{"Catalyst::Plugin::$plugin"};
message => qq/Couldn't load ${type}plugin "$plugin", $error/ );
}
- $proto->_plugins->{$plugin} = 1;
+ $proto->_plugins->{$plugin} = 1;
unless ($instant) {
no strict 'refs';
unshift @{"$class\::ISA"}, $plugin;