Jifty
view release on metacpan or search on metacpan
lib/Jifty/Util.pm view on Meta::CPAN
application's root directory, as defined by L</app_root>.
=cut
sub default_app_name {
my $self = shift;
my @root = File::Spec->splitdir( Jifty::Util->app_root);
my $name = pop @root;
# Jifty-0.10211 should become Jifty
$name = $1 if $name =~ /^(.*?)-(.*\..*)$/;
# But don't actually allow "Jifty" as the name
$name = "JiftyApp" if lc $name eq "jifty";
return $name;
}
=head2 make_path PATH
When handed a directory, creates that directory, starting as far up the
chain as necessary. (This is what 'mkdir -p' does in your shell).
=cut
sub make_path {
my $self = shift;
my $whole_path = shift;
return 1 if (-d $whole_path);
Jifty::Util->require('File::Path');
local $@;
eval { File::Path::mkpath([$whole_path]) };
if ($@) {
Jifty->log->fatal("Unable to make path: $whole_path: $@")
}
}
=head2 require PATH
Uses L<UNIVERSAL::require> to require the provided C<PATH>.
Additionally, logs any failures at the C<error> log level.
=cut
sub require {
my $self = shift;
my $module = shift;
$self->_require( module => $module, quiet => 0);
}
sub _require {
my $self = shift;
my %args = ( module => undef, quiet => undef, @_);
my $class = $args{'module'};
# Quick hack to silence warnings.
# Maybe some dependencies were lost.
unless ($class) {
Jifty->log->error(sprintf("no class was given at %s line %d\n", (caller)[1,2]));
return 0;
}
return 1 if $self->already_required($class);
# .pm might already be there in a weird interaction in Module::Pluggable
my $file = $class;
$file .= ".pm"
unless $file =~ /\.pm$/;
$file =~ s/::/\//g;
my $retval = eval {CORE::require "$file"} ;
my $error = $@;
if (my $message = $error) {
$message =~ s/ at .*?\n$//;
if ($args{'quiet'} and $message =~ /^Can't locate $file/) {
return 0;
}
elsif ( $error !~ /^Can't locate $file/) {
die $error;
} else {
Jifty->log->error(sprintf("$message at %s line %d\n", (caller(1))[1,2]));
return 0;
}
}
# If people forget the '1;' line in the dispatcher, don't eit them
if ($class =~ /::Dispatcher$/ and ref $retval eq "ARRAY") {
Jifty->log->error("$class did not return a true value; assuming it was a dispatcher rule");
Jifty::Dispatcher::_push_rule($class, $_) for @{$retval};
}
return 1;
}
=head2 try_to_require Module
This method works just like L</require>, except that it suppresses the error message
in cases where the module isn't found.
=cut
sub try_to_require {
my $self = shift;
my $module = shift;
$self->_require( module => $module, quiet => 1);
}
=head2 already_required class
Helper function to test whether a given class has already been loaded.
=cut
sub already_required {
my ($self, $class) = @_;
$class =~ s{::}{/}g;
return ( $INC{"$class.pm"} ? 1 : 0);
( run in 3.531 seconds using v1.01-cache-2.11-cpan-364913b4093 )