package Catalyst::Utils;
use strict;
-use Catalyst::Exception;
use File::Spec;
use HTTP::Request;
use Path::Class;
use URI;
use Carp qw/croak/;
use Cwd;
+use Class::MOP;
+use String::RewritePrefix;
+
+use namespace::clean;
=head1 NAME
=head1 DESCRIPTION
+Catalyst Utilities.
+
=head1 METHODS
=head2 appprefix($class)
return $class;
}
+=head2 class2classshortsuffix($class)
+
+ MyApp::Controller::Foo::Bar becomes Foo::Bar
+
+=cut
+
+sub class2classshortsuffix {
+ my $class = shift || '';
+ my $prefix = class2classprefix($class) || '';
+ $class =~ s/$prefix\:://;
+ return $class;
+}
+
+
=head2 class2env($class);
Returns the environment name for class.
Returns a tempdir for a class. If create is true it will try to create the path.
My::App becomes /tmp/my/app
- My::App::C::Foo::Bar becomes /tmp/my/app/c/foo/bar
+ My::App::Controller::Foo::Bar becomes /tmp/my/app/c/foo/bar
=cut
eval { $tmpdir->mkpath };
if ($@) {
+ # don't load Catalyst::Exception as a BEGIN in Utils,
+ # because Utils often gets loaded before MyApp.pm, and if
+ # Catalyst::Exception is loaded before MyApp.pm, it does
+ # not honor setting
+ # $Catalyst::Exception::CATALYST_EXCEPTION_CLASS in
+ # MyApp.pm
+ require Catalyst::Exception;
Catalyst::Exception->throw(
message => qq/Couldn't create tmpdir '$tmpdir', "$@"/ );
}
Returns home directory for given class.
+=head2 dist_indicator_file_list
+
+Returns a list of files which can be tested to check if you're inside
+a CPAN distribution which is not yet installed.
+
+These are:
+
+=over
+
+=item Makefile.PL
+
+=item Build.PL
+
+=item dist.ini
+
+=back
+
=cut
+sub dist_indicator_file_list {
+ qw{Makefile.PL Build.PL dist.ini};
+}
+
sub home {
my $class = shift;
# pop off /lib and /blib if they're there
$home = $home->parent while $home =~ /b?lib$/;
- # only return the dir if it has a Makefile.PL or Build.PL
- if (-f $home->file("Makefile.PL") or -f $home->file("Build.PL")) {
-
+ # only return the dir if it has a Makefile.PL or Build.PL or dist.ini
+ if (grep { -f $home->file($_) } dist_indicator_file_list()) {
# clean up relative path:
# MyApp/script/.. -> MyApp
my ( $lefthash, $righthash ) = @_;
return $lefthash unless defined $righthash;
-
+
my %merged = %$lefthash;
for my $key ( keys %$righthash ) {
my $right_ref = ( ref $righthash->{ $key } || '' ) eq 'HASH';
$merged{ $key } = $righthash->{ $key };
}
}
-
+
return \%merged;
}
return;
}
+=head2 term_width
+
+Try to guess terminal width to use with formatting of debug output
+
+All you need to get this work, is:
+
+1) Install Term::Size::Any, or
+
+2) Export $COLUMNS from your shell.
+
+(Warning to bash users: 'echo $COLUMNS' may be showing you the bash
+variable, not $ENV{COLUMNS}. 'export COLUMNS=$COLUMNS' and you should see
+that 'env' now lists COLUMNS.)
+
+As last resort, default value of 80 chars will be used.
+
+=cut
+
+my $_term_width;
+
+sub term_width {
+ return $_term_width if $_term_width;
+
+ my $width = eval '
+ use Term::Size::Any;
+ my ($columns, $rows) = Term::Size::Any::chars;
+ return $columns;
+ ';
+
+ if ($@) {
+ $width = $ENV{COLUMNS}
+ if exists($ENV{COLUMNS})
+ && $ENV{COLUMNS} =~ m/^\d+$/;
+ }
+
+ $width = 80 unless ($width && $width >= 80);
+ return $_term_width = $width;
+}
+
+
+=head2 resolve_namespace
+
+Method which adds the namespace for plugins and actions.
+
+ __PACKAGE__->setup(qw(MyPlugin));
+
+ # will load Catalyst::Plugin::MyPlugin
+
+=cut
+
+
+sub resolve_namespace {
+ my $appnamespace = shift;
+ my $namespace = shift;
+ my @classes = @_;
+ return String::RewritePrefix->rewrite({
+ q[] => qq[${namespace}::],
+ q[+] => q[],
+ (defined $appnamespace
+ ? (q[~] => qq[${appnamespace}::])
+ : ()
+ ),
+ }, @classes);
+}
+
+
=head1 AUTHORS
Catalyst Contributors, see Catalyst.pm
=head1 COPYRIGHT
-This program is free software, you can redistribute it and/or modify it under
+This library is free software. You can redistribute it and/or modify it under
the same terms as Perl itself.
=cut