As last resort, default value of 80 chars will be used.
+Calling C<term_width> with a true value will cause it to be recalculated; you
+can use this to cause it to get recalculated when your terminal is resized like
+this
+
+ $SIG{WINCH} = sub { Catalyst::Utils::term_width(1) };
+
=cut
my $_term_width;
sub term_width {
+ my $force_reset = shift;
+
+ undef $_term_width if $force_reset;
+
return $_term_width if $_term_width;
my $width;
eval '
- require Term::Size::Any;
- my ($columns, $rows) = Term::Size::Any::chars;
- $width = $columns;
- 1;
+ use Term::Size::Any;
+ ($width) = Term::Size::Any::chars;
+ 1;
' or do {
+ if($@ =~m[Can't locate Term/Size/Any.pm]) {
+ warn "Term::Size::Any is not installed, can't autodetect terminal column width\n";
+ } else {
+ warn "There was an error trying to detect your terminal size: $@\n";
+ }
+ warn 'Trouble trying to detect your terminal size, looking at $ENV{COLUMNS}'."\n";
$width = $ENV{COLUMNS}
if exists($ENV{COLUMNS})
&& $ENV{COLUMNS} =~ m/^\d+$/;
};
- $width = 80 unless ($width && $width >= 80);
+ do {
+ warn "Cannot determine desired terminal width, using default of 80 columns\n";
+ $width = 80 } unless ($width && $width >= 80);
return $_term_width = $width;
}
my $env = $c->Catalyst::Utils::env_at_path_prefix;
}
-Assuming you have a requst like GET /user/name:
+Assuming you have a request like GET /user/name:
In the example case C<$env> will have PATH_INFO of '/name' instead of
'/user/name' and SCRIPT_NAME will now be '/user'.
=head2 env_at_action
-Localize C<$env> under the current controller path prefix:
+Localize C<$env> under the current action namespace.
package MyApp::Controller::User;
my $env = $c->Catalyst::Utils::env_at_action;
}
-Assuming you have a requst like GET /user/name:
+Assuming you have a request like GET /user/name:
In the example case C<$env> will have PATH_INFO of '/' instead of
'/user/name' and SCRIPT_NAME will now be '/user/name'.
+Alternatively, assuming you have a request like GET /user/name/foo:
+
+In this example case C<$env> will have PATH_INFO of '/foo' instead of
+'/user/name/foo' and SCRIPT_NAME will now be '/user/name'.
+
This is probably a common case where you want to mount a PSGI application
under an action but let the Args fall through to the PSGI app.
=head2 env_at_request_uri
-Localize C<$env> under the current controller path prefix:
+Localize C<$env> under the current request URI:
package MyApp::Controller::User;
my $env = $c->Catalyst::Utils::env_at_request_uri
}
-Assuming you have a requst like GET /user/name/hello:
+Assuming you have a request like GET /user/name/hello:
In the example case C<$env> will have PATH_INFO of '/' instead of
'/user/name' and SCRIPT_NAME will now be '/user/name/hello'.