Acrux
view release on metacpan or search on metacpan
lib/Acme/Crux.pm view on Meta::CPAN
Default: /usr/share/<MONIKER>
=head2 spooldir
spooldir => '/var/spool/myapp'
Spool is the dir for project pool data
$app = $app->spooldir( "/path/to/spool/dir" );
my $spooldir = $app->spooldir;
Default: /var/spool/<MONIKER>
=head2 tempdir
tempdir => '/tmp/myapp'
Temp dir for project temporary files
$app = $app->tempdir( "/path/to/temp/dir" );
my $tempdir = $app->tempdir;
Default: /tmp/<MONIKER>
=head2 test
test => 1
test => 'on'
test => 'yes'
Test mode
Default: 0
=head2 verbose
verbose => 1
verbose => 'on'
verbose => 'yes'
Verbose mode
Default: 0
=head2 webdir
webdir => '/var/www/myapp'
Web dir for project web files (DocumentRoot)
$app = $app->webdir( "/path/to/webdoc/dir" );
my $webdirr = $app->webdir;
Default: /var/www/<MONIKER>
=head1 METHODS
This class implements the following methods
=head2 startup
This is your main hook into the application, it will be called at application startup.
Meant to be overloaded in a subclass.
This method is called immediately after creating the instance and returns it
B<NOTE:> Please use only in your subclasses!
sub startup {
my $self = shift;
. . .
return $self; # REQUIRED!
}
=head2 debugmode
$app->debugmode;
Returns debug flag. 1 - on, 0 - off
=head2 begin
my $timing_begin = $app->begin;
This method sets timestamp for L</elapsed>
my $timing_begin = $app->begin;
# ... long operations ...
my $elapsed = $app->elapsed( $timing_begin );
=head2 elapsed
my $elapsed = $app->elapsed;
my $timing_begin = [gettimeofday];
# ... long operations ...
my $elapsed = $app->elapsed( $timing_begin );
Return fractional amount of time in seconds since unnamed timstamp has been created while start application
my $elapsed = $app->elapsed;
$app->log->debug("Database stuff took $elapsed seconds");
For formatted output:
$app->log->debug(sprintf("%+.*f sec", 4, $app->elapsed));
=head2 error
my $error = $app->error;
Returns error string if occurred any errors while working with application
$app = $app->error( "error text" );
Sets new error message and returns object
=head2 exedir
my $exedir = $app->exedir;
Gets exedir value
=head2 handlers
my @names = $app->handlers;
Returns list of names of registered handlers
my @names_and_aliases = $app->handlers(1);
Returns list of aliases and names of registered handlers
=head2 lookup_handler
my $handler = $app->lookup_handler($name)
or die "Handler not found";
Lookup handler by name or aliase. Returns handler or undef while error
=head2 option, opt, getopt
my $value = $app->option("key");
Returns option value by key
my $options = $app->option;
Returns hash-ref structure to all options
See L</options>
=head2 orig
my $origin_args = $app->orig;
Returns hash-ref structure to all origin arguments
=head2 plugin
lib/Acme/Crux.pm view on Meta::CPAN
}
# Run dir
my $rundir = $self->{rundir};
unless (defined($rundir) && length($rundir)) {
$rundir = $self->{rundir} = File::Spec->catdir(RUNDIR, $moniker);
}
# Lock dir
my $lockdir = $self->{lockdir};
unless (defined($lockdir) && length($lockdir)) {
$self->{lockdir} = File::Spec->catdir(LOCKDIR, $moniker);
}
# Web dir
my $webdir = $self->{webdir};
unless (defined($webdir) && length($webdir)) {
$self->{webdir} = File::Spec->catdir(WEBDIR, $moniker);
}
# Config file
my $configfile = $self->{configfile};
unless (defined($configfile) && length($configfile)) {
$self->{configfile} = $configfile = File::Spec->catfile($root, sprintf("%s.conf", $moniker));
}
unless (File::Spec->file_name_is_absolute($configfile)) {
$self->{configfile} = $configfile = File::Spec->rel2abs($configfile);
}
# Log file
my $logfile = $self->{logfile};
unless (defined($logfile) && length($logfile)) {
$self->{logfile} = $logfile = File::Spec->catfile($logdir, sprintf("%s.log", $moniker));
}
unless (File::Spec->file_name_is_absolute($logfile)) {
$self->{logfile} = $logfile = File::Spec->rel2abs($logfile);
}
# PID file
my $pidfile = $self->{pidfile};
unless (defined($pidfile) && length($pidfile)) {
$self->{pidfile} = $pidfile = File::Spec->catfile($rundir, sprintf("%s.pid", $moniker));
}
unless (File::Spec->file_name_is_absolute($pidfile)) {
$self->{pidfile} = $pidfile = File::Spec->rel2abs($pidfile);
}
# Define plugins list to plugin map
$self->plugins(as_hash_ref($args->{plugins}));
# Preloading plugins
my $preload_plugins = $self->{preload_plugins};
$preload_plugins = [$preload_plugins] unless is_array_ref($preload_plugins);
my $pplgns = words(@$preload_plugins);
$self->plugin($_) for @$pplgns;
#foreach my $p (@$preload_plugins) {
# next unless defined($p) && is_value($p);
# $self->plugin($_) for split(/[\s;,]+/, $p);
#}
return $self->startup(%$args);
}
sub startup { shift }
# Attributes
sub options {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{options} = shift;
return $self;
}
return $self->{options};
}
sub project {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{project} = shift;
return $self;
}
return $self->{project};
}
sub moniker {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{moniker} = shift;
return $self;
}
return $self->{moniker};
}
# Files and directories
sub pwd { shift->{pwd} }
sub root {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{root} = shift;
return $self;
}
return $self->{root};
}
sub tempdir {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{tempdir} = shift;
return $self;
}
return $self->{tempdir};
}
sub datadir {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{datadir} = shift;
return $self;
}
return $self->{datadir};
}
sub logdir {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{logdir} = shift;
return $self;
}
return $self->{logdir};
lib/Acme/Crux.pm view on Meta::CPAN
return $self;
}
return $self->{lockdir};
}
sub webdir {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{webdir} = shift;
return $self;
}
return $self->{webdir};
}
sub configfile {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{configfile} = shift;
return $self;
}
return $self->{configfile};
}
sub logfile {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{logfile} = shift;
return $self;
}
return $self->{logfile};
}
sub pidfile {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{pidfile} = shift;
return $self;
}
return $self->{pidfile};
}
# Modes (methods)
sub testmode { !! shift->{testmode} }
sub debugmode { !! shift->{debugmode} }
sub verbosemode { !! shift->{verbosemode} }
sub silentmode { ! shift->{verbosemode} }
# Methods
sub error {
my $self = shift;
if (scalar(@_) >= 1) {
$self->{error} = shift;
return $self;
}
return $self->{error};
}
sub begin {
my $self = shift;
$self->{hitime} = [gettimeofday];
return $self->{hitime}
}
sub elapsed {
my $self = shift;
my $timing_begin = shift;
return undef unless my $started = $timing_begin || $self->{hitime};
return tv_interval($started, [gettimeofday]);
}
sub exedir { shift->{exedir} }
sub orig { shift->{orig} }
sub option {
my $self = shift;
my $key = shift;
my $opts = $self->{options};
return undef unless $opts;
return $opts unless defined $key;
return $opts->{$key};
}
sub opt { goto &option }
sub getopt { goto &option }
# Register method. See Mojo::Util::monkey_patch
sub register_method {
my $self = shift;
my $code = pop || sub { 1 }; # last param
my $method = pop;
my $namespace = pop || ref($self) || $self || __PACKAGE__;
croak qq{Can't register method: method name is missing} unless $method;
croak qq{Can't register method "$method": subroutine code is not defined}
unless is_code_ref($code);
my $ent = sprintf("%s::%s", $namespace, $method);
# Create new method
no strict 'refs';
no warnings 'redefine';
*{$ent} = set_subname($ent, $code);
### Old version from CTK::Plugin::register_method
### Check
##return if do { no strict 'refs'; defined &{$ff} };
### Create method!
##do {
## no strict 'refs';
## *{$ff} = \&$callback;
##};
return 1;
}
# Plugins
sub plugins {
my $self = shift;
return $self->{plugins} if scalar(@_) < 1;
my $args = @_ ? @_ > 1 ? {@_} : {%{$_[0]}} : {};
my $plugins = $self->{plugins};
foreach my $k (keys %$args) {
next if exists($plugins->{$k}) && $plugins->{$k}->{loaded}; # Skip loaded plugins
$plugins->{$k} = { class => $args->{$k}, loaded => 0 } if length($args->{$k} // '');
}
return $self;
}
sub plugin {
my $self = shift;
my $name = shift // ''; # Plugin name
my $class = shift // ''; # Plugin class
my @args = @_;
my $plugins = $self->{plugins}; # Get list of plugins
( run in 1.022 second using v1.01-cache-2.11-cpan-99c4e6809bf )