NAME
Acme::Crux - The CTK::App of the next generation
SYNOPSIS
use Acme::Crux;
DESCRIPTION
The CTK::App of the next generation
new
my $app = Acme::Crux->new(
project => 'MyApp',
moniker => 'myapp',
options => {foo => 'bar'},
plugins => { foo => 'MyApp::Foo', bar => 'MyApp::Bar' },
preload => 'Config, Log',
cachedir => '/var/cache/myapp',
configfile => '/etc/myapp/myapp.conf',
datadir => '/var/lib/myapp',
docdir => '/usr/share/doc/myapp',
lockdir => '/var/lock/myapp',
logdir => '/var/log/myapp',
logfile => '/var/log/myapp/myapp.log',
pidfile => '/var/run/myapp/myapp.pid',
root => '/etc/myapp',
rundir => '/var/run/myapp',
sharedir => '/usr/share/myapp',
spooldir => '/var/spool/myapp',
tempdir => '/tmp/myapp',
webdir => '/var/www/myapp',
debug => 0,
test => 0,
verbose => 0,
);
ATTRIBUTES
This class implements the following attributes
cachedir
cachedir => '/var/cache/myapp'
Cache dir for project cache files
$app = $app->cachedir( "/path/to/cache/dir" );
my $cachedir = $app->cachedir;
Default: /var/cache/<MONIKER>
configfile
configfile => '/etc/myapp/myapp.conf'
Path to the configuration file of your project
$app = $app->configfile( "/path/to/config/file.conf" );
my $configfile = $app->configfile;
Default: /etc/<MONIKER>/<MONIKER>.conf
datadir
datadir => '/var/lib/myapp'
Data dir of project
$app = $app->datadir( "/path/to/data/dir" );
my $datadir = $app->datadir;
Default: /var/lib/<MONIKER>
debug
debug => 1
debug => 'on'
debug => 'yes'
Debug mode
Default: 0
docdir
docdir => '/usr/share/doc/myapp'
Doc dir for project documentation
$app = $app->docdir( "/path/to/docs/dir" );
my $docdir = $app->docdir;
Default: /usr/share/doc/<MONIKER>
lockdir
lockdir => '/var/lock/myapp'
Lock dir for project lock files
$app = $app->lockdir( "/path/to/lock/dir" );
my $lockdir = $app->lockdir;
Default: /var/lock/<MONIKER>
logdir
logdir => '/var/log/myapp'
Log dir for project logging
$app = $app->logdir( "/path/to/log/dir" );
my $logdir = $app->logdir;
Default: /var/log/<MONIKER>
logfile
logfile => '/var/log/myapp/myapp.log'
Path to the log file
$app = $app->logfile( "/path/to/file.log" );
my $logfile = $app->logfile;
Default: /var/log/<MONIKER>/<MONIKER>.log
moniker
moniker => 'myapp'
This attribute sets moniker of project name.
Moniker SHOULD contains only symbols: a-z, 0-9, '_', '-', '.'
$app = $app->moniker( 'myapp' );
my $moniker = $app->moniker;
Default: decamelized version of the project
attribute
options
options => {foo => 'bar'}
Command-line options, or any hash-ref structure with options. See Getopt::Long
$app = $app->options({ foo => 'bar' });
my $options = $app->options;
Default: {}
pidfile
pidfile => '/var/run/myapp/myapp.pid'
Path to the pid file
$app = $app->pidfile( "/path/to/file.pid" );
my $pidfile = $app->pidfile;
Default: /var/run/<MONIKER>/<MONIKER>.pid
preload, preload_plugins
preload => [qw/foo bar baz/]
preload => "foo bar baz"
preload => "foo, bar, baz"
preload => "foo; bar; baz"
This attribute sets list of preloading plugins. Each specified plugin will be loaded and registered during application creation automatically
Default preloading plugins: Config
, Log
plugins
plugins => { foo => 'MyApp::Foo', bar => 'MyApp::Bar' }
This attribute defines specified plugins only. NOTE! This attribute NOT performs automatic loading and register specified plugins!
See the "plugin" method below if you want to load and register a plugin
$app = $app->plugins(
foo => 'MyApp::Foo',
bar => 'MyApp::Bar',
);
my $plugins = $app->plugins;
Default plugins:
Config Acme::Crux::Plugin::Config
Log Acme::Crux::Plugin::Log
project
project => 'MyApp'
Name of project
$app = $app->project( 'MyApp' );
my $project = $app->project;
Default: script name (without file extension) or invocant class
root
root => '/etc/myapp'
Root dir of project
$app = $app->root( "/etc/myapp" );
my $root = $app->root;
Default: /etc/<MONIKER>
rundir
rundir => '/var/run/myapp'
Run dir for project pid files
$app = $app->rundir( "/path/to/run/dir" );
my $rundir = $app->rundir;
Default: /var/run/<MONIKER>
sharedir
sharedir => '/usr/share/myapp'
Share dir for project
$app = $app->sharedir( "/path/to/share/dir" );
my $sharedir = $app->sharedir;
Default: /usr/share/<MONIKER>
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>
tempdir
tempdir => '/tmp/myapp'
Temp dir for project temporary files
$app = $app->tempdir( "/path/to/temp/dir" );
my $tempdir = $app->tempdir;
Default: /tmp/<MONIKER>
test
test => 1
test => 'on'
test => 'yes'
Test mode
Default: 0
verbose
verbose => 1
verbose => 'on'
verbose => 'yes'
Verbose mode
Default: 0
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>
METHODS
This class implements the following methods
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
NOTE: Please use only in your subclasses!
sub startup {
my $self = shift;
. . .
return $self; # REQUIRED!
}
debugmode
$app->debugmode;
Returns debug flag. 1 - on, 0 - off
begin
my $timing_begin = $app->begin;
This method sets timestamp for "elapsed"
my $timing_begin = $app->begin;
# ... long operations ...
my $elapsed = $app->elapsed( $timing_begin );
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));
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
exedir
my $exedir = $app->exedir;
Gets exedir value
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
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
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 "options"
orig
my $origin_args = $app->orig;
Returns hash-ref structure to all origin arguments
plugin
$app->plugin(foo => 'MyApp::Plugin::Foo');
$app->plugin(foo);
$app->plugin(foo => 'MyApp::Plugin::Foo', {bar => 123, baz => 'test'});
$app->plugin(foo => 'MyApp::Plugin::Foo', bar => 123, baz => 'test');
$app->plugin(foo, undef, {bar => 123, baz => 'test'});
Load a plugin by name or pair - name and class
pwd
my $pwd = $app->pwd;
This method returns current/working directory
register_handler
use parent qw/Acme::Crux/;
__PACKAGE__->register_handler(
handler => "foo",
aliases => "one, two",
description => "Foo handler",
params => {
param1 => "test",
param2 => 123,
},
code => sub {
### CODE:
my $self = shift; # App
my $meta = shift; # Meta data
my @args = @_; # Arguments
print Acrux::Util::dumper({
meta => $meta,
args => \@args,
});
return 1;
});
Method for register new handler
Example output while running:
$app->run('one', abc => 123, def => 456); # returns 1
{
"args" => ["abc", 123, "def", 456],
"meta" => {
"aliases" => ["one", "two"],
"description" => "Foo handler",
"name" => "foo",
"params" => {
"param1" => "test",
"param2" => 123
}
},
"name" => "foo"
}
This method supports the following options:
- aliases, alias
-
aliases => 'foo bar baz' aliases => 'foo, bar, baz' aliases => [qw/foo bar baz/] alias => 'foo'
Sets aliases list for handler lookup
- code
-
code => sub { my ($self, $meta, @args) = @_; # . . . }
Sets code oh handler
- description
-
description => 'Short description, abstract or synopsis'
- handler, name
-
handler => 'version' name => 'version'
Sets handler name. Default to 'default'
- params, parameters
-
params => { foo => 'bar' }
List of handler parameters. All handler parameters will passed to $meta
register_method
$app->register_method($namespace, $method, sub { 1 });
$app->register_method($method => sub { 1 });
__PACKAGE__->register_method($namespace, $method, sub { 1 });
This method performs register the new method in your namespace
By default use current application namespace
register_plugin
$app->register_plugin('foo', 'MyApp::Plugin::Foo');
$app->register_plugin('foo', 'MyApp::Plugin::Foo', {bar => 123});
$app->register_plugin('foo', 'MyApp::Plugin::Foo', bar => 123);
Load a plugin and run register
method, optional arguments are passed through
run
By default this method is alias for "run_handler" method.
This method meant to be overloaded in a subclass
run_handler
my $result = $app->run_handler("foo",
foo => "one",
bar => 1
) or die $app->error;
Runs handler by name and returns result of it handler running
silentmode
$app->silentmode;
Returns the verbose flag in the opposite value. 0 - verbose, 1 - silent.
See "verbosemode"
testmode
$app->testmode;
Returns test flag. 1 - on, 0 - off
verbosemode
$app->verbosemode;
Returns verbose flag. 1 - on, 0 - off
See "silentmode"
PLUGINS
The following plugins are included in the Acrux distribution
- Acme::Crux::Plugin::Config
-
Config => Acme::Crux::Plugin::Config
Acrux::Config configuration plugin
- Acme::Crux::Plugin::Log
-
Log => Acme::Crux::Plugin::Log
Acrux::Log logging plugin
TO DO
See TODO
file
SEE ALSO
AUTHOR
Serż Minus (Sergey Lepenkov) https://www.serzik.com <abalama@cpan.org>
COPYRIGHT
Copyright (C) 1998-2024 D&D Corporation. All Rights Reserved
LICENSE
This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
See LICENSE
file and https://dev.perl.org/licenses/