use strict;
use base 'Class::Accessor::Fast';
-use Config;
use File::Spec;
use File::Path;
use IO::File;
use FindBin;
use Template;
-use Catalyst;
use Catalyst::Utils;
use Catalyst::Exception;
sub mk_app {
my ( $self, $name ) = @_;
- return 0 if $name =~ /[^\w\:]/;
+
+ # Needs to be here for PAR
+ require Catalyst;
+
+ if ( $name =~ /[^\w\:]/ ) {
+ warn "Error: Invalid application name.\n";
+ return 0;
+ }
$self->{name} = $name;
$self->{dir} = $name;
$self->{dir} =~ s/\:\:/-/g;
+ $self->{script} = File::Spec->catdir( $self->{dir}, 'script' );
$self->{appprefix} = Catalyst::Utils::appprefix($name);
- $self->{startperl} = $Config{startperl};
+ $self->{startperl} = '#!/usr/bin/perl -w';
$self->{scriptgen} = $Catalyst::CATALYST_SCRIPT_GEN || 4;
$self->{author} = $self->{author} = $ENV{'AUTHOR'}
|| eval { @{ [ getpwuid($<) ] }[6] }
|| 'Catalyst developer';
- $self->_mk_dirs;
- $self->_mk_appclass;
- $self->_mk_build;
- $self->_mk_makefile;
- $self->_mk_readme;
- $self->_mk_changes;
- $self->_mk_apptest;
+
+ unless ( $self->{scripts} ) {
+ $self->_mk_dirs;
+ $self->_mk_appclass;
+ $self->_mk_build;
+ $self->_mk_makefile;
+ $self->_mk_readme;
+ $self->_mk_changes;
+ $self->_mk_apptest;
+ $self->_mk_images;
+ $self->_mk_favicon;
+ $self->_mk_package;
+ }
$self->_mk_cgi;
$self->_mk_fastcgi;
$self->_mk_server;
$self->_mk_test;
$self->_mk_create;
- $self->_mk_images;
- $self->_mk_favicon;
return 1;
}
# Helper
if ($helper) {
- my $comp = 'Model';
- $comp = 'View' if $type eq 'V';
- $comp = 'Controller' if $type eq 'C';
+ my $comp = $self->{long_type};
my $class = "Catalyst::Helper::$comp\::$helper";
eval "require $class";
my ( $self, $file, $content ) = @_;
if ( -e $file ) {
print qq/ exists "$file"\n/;
- return 0 unless $self->{'.newfiles'};
- if ( my $f = IO::File->new("< $file") ) {
- my $oldcontent = join( '', (<$f>) );
- return 0 if $content eq $oldcontent;
+ return 0 unless ( $self->{'.newfiles'} || $self->{scripts} );
+ if ( $self->{'.newfiles'} ) {
+ if ( my $f = IO::File->new("< $file") ) {
+ my $oldcontent = join( '', (<$f>) );
+ return 0 if $content eq $oldcontent;
+ }
+ $file .= '.new';
}
- $file .= '.new';
}
if ( my $f = IO::File->new("> $file") ) {
binmode $f;
sub _mk_dirs {
my $self = shift;
$self->mk_dir( $self->{dir} );
- $self->{script} = File::Spec->catdir( $self->{dir}, 'script' );
$self->mk_dir( $self->{script} );
$self->{lib} = File::Spec->catdir( $self->{dir}, 'lib' );
$self->mk_dir( $self->{lib} );
}
+sub _mk_package {
+ my $self = shift;
+ my $script = $self->{script};
+ my $appprefix = $self->{appprefix};
+ $self->render_file( 'package', "$script\/$appprefix\_package.pl" );
+ chmod 0700, "$script/$appprefix\_package.pl";
+}
+
=head1 HELPERS
Helpers are classes that provide two methods.
use strict;
use warnings;
-# -Debug activates the debug mode for very useful log messages
-# Static::Simple will serve static files from the root directory
+#
+# Set flags and add plugins for the application
+#
+# -Debug: activates the debug mode for very useful log messages
+# Static::Simple: will serve static files from the applications root directory
+#
use Catalyst qw/-Debug Static::Simple/;
our $VERSION = '0.01';
+#
# Configure the application
+#
__PACKAGE__->config( name => '[% name %]' );
+#
# Start the application
+#
__PACKAGE__->setup;
=head1 NAME
=head1 METHODS
-=over 4
-
-=item default
+=head2 default
=cut
+#
# Output a friendly welcome message
+#
sub default : Private {
my ( $self, $c ) = @_;
$c->response->body( $c->welcome_message );
}
-# Uncomment and modify this end action after adding a View class
-#=item end
+#
+# Uncomment and modify this end action after adding a View component
+#
+#=head2 end
#
#=cut
#
# my ( $self, $c ) = @_;
#
# # Forward to View unless response body is already defined
-# $c->forward('MyApp::V::') unless $c->response->body;
+# $c->forward('View::') unless $c->response->body;
#}
-=back
-
=head1 AUTHOR
[% author %]
use Catalyst::Build;
my $build = Catalyst::Build->new(
- create_makefile_pl => 'passthrough',
license => 'perl',
module_name => '[% name %]',
- requires => { Catalyst => '5.10' },
+ requires => { Catalyst => '5.49' },
create_makefile_pl => 'passthrough',
script_files => [ glob('script/*') ],
test_files => [ glob('t/*.t'), glob('t/*/*.t') ]
all_pod_coverage_ok();
__cgi__
-[% startperl %] -w
+[% startperl %]
BEGIN { $ENV{CATALYST_ENGINE} ||= 'CGI' }
=cut
__fastcgi__
-[% startperl %] -w
+[% startperl %]
BEGIN { $ENV{CATALYST_ENGINE} ||= 'FastCGI' }
use [% name %];
my $help = 0;
-my ( $listen, $nproc );
+my ( $listen, $nproc, $pidfile, $manager, $detach );
GetOptions(
- 'help|?' => \$help,
- 'listen|l=s' => \$listen,
- 'nproc|n=i' => \$nproc,
+ 'help|?' => \$help,
+ 'listen|l=s' => \$listen,
+ 'nproc|n=i' => \$nproc,
+ 'pidfile|p=s' => \$pidfile,
+ 'manager|M=s' => \$manager,
+ 'daemon|d' => \$detach,
);
pod2usage(1) if $help;
-[% name %]->run( $listen, { nproc => $nproc } );
+[% name %]->run(
+ $listen,
+ { nproc => $nproc,
+ pidfile => $pidfile,
+ manager => $manager,
+ detach => $detach,
+ }
+);
1;
can be HOST:PORT, :PORT or a
filesystem path
-n -nproc specify number of processes to keep
- to serve requests (defaults to 1)
+ to serve requests (defaults to 1,
+ requires -listen)
+ -p -pidfile specify filename for pid file
+ (requires -listen)
+ -d -daemon daemonize (requires -listen)
+ -M -manager specify alternate process manager
+ (FCGI::ProcessManager sub-class)
+ or empty string to disable
=head1 DESCRIPTION
=cut
__server__
-[% startperl %] -w
+[% startperl %]
BEGIN {
$ENV{CATALYST_ENGINE} ||= 'HTTP';
use Pod::Usage;
use FindBin;
use lib "$FindBin::Bin/../lib";
-use [% name %];
+my $debug = 0;
my $fork = 0;
my $help = 0;
my $host = undef;
my $port = 3000;
+my $keepalive = 0;
my $restart = 0;
my $restart_delay = 1;
my $restart_regex = '\.yml$|\.yaml$|\.pm$';
my @argv = @ARGV;
GetOptions(
+ 'debug|d' => \$debug,
'fork' => \$fork,
'help|?' => \$help,
'host=s' => \$host,
'port=s' => \$port,
+ 'keepalive|k' => \$keepalive,
'restart|r' => \$restart,
'restartdelay|rd=s' => \$restart_delay,
'restartregex|rr=s' => \$restart_regex
pod2usage(1) if $help;
+if ( $restart ) {
+ $ENV{CATALYST_ENGINE} = 'HTTP::Restarter';
+}
+if ( $debug ) {
+ $ENV{CATALYST_DEBUG} = 1;
+}
+
+require [% name %];
+
[% name %]->run( $port, $host, {
- argv => \@argv,
- 'fork' => $fork,
- restart => $restart,
+ argv => \@argv,
+ 'fork' => $fork,
+ keepalive => $keepalive,
+ restart => $restart,
restart_delay => $restart_delay,
restart_regex => qr/$restart_regex/
} );
[% appprefix %]_server.pl [options]
Options:
+ -d -debug force debug mode
-f -fork handle each request in a new process
(defaults to false)
-? -help display this help and exits
-host host (defaults to all)
-p -port port (defaults to 3000)
+ -k -keepalive enable keep-alive connections
-r -restart restart when files got modified
(defaults to false)
-rd -restartdelay delay between file checks
=cut
__test__
-[% startperl %] -w
-
-BEGIN { $ENV{CATALYST_ENGINE} ||= 'Test' }
+[% startperl %]
use strict;
use Getopt::Long;
use Pod::Usage;
use FindBin;
use lib "$FindBin::Bin/../lib";
-use [% name %];
+use Catalyst::Test '[% name %]';
my $help = 0;
pod2usage(1) if ( $help || !$ARGV[0] );
-print [% name %]->run($ARGV[0])->content . "\n";
+print request($ARGV[0])->content . "\n";
1;
=cut
__create__
-[% startperl %] -w
+[% startperl %]
use strict;
use Getopt::Long;
use Pod::Usage;
use Catalyst::Helper;
-my $help = 0;
-my $nonew = 0;
+my $force = 0;
+my $help = 0;
my $short = 0;
GetOptions(
- 'help|?' => \$help,
- 'nonew' => \$nonew,
- 'short' => \$short
+ 'nonew|force' => \$force,
+ 'help|?' => \$help,
+ 'short' => \$short
);
pod2usage(1) if ( $help || !$ARGV[0] );
my $helper =
- Catalyst::Helper->new( { '.newfiles' => !$nonew, short => $short } );
+ Catalyst::Helper->new( { '.newfiles' => !$force, short => $short } );
pod2usage(1) unless $helper->mk_component( '[% name %]', @ARGV );
[% appprefix %]_create.pl [options] model|view|controller name [helper] [options]
Options:
+ -force don't create a .new file where a file to be created exists
-help display this help and exits
- -nonew don't create a .new file where a file to be created exists
-short use short types, like C instead of Controller...
Examples:
Existing component files are not overwritten. If any of the component files
to be created already exist the file will be written with a '.new' suffix.
-This behavior can be suppressed with the C<-nonew> option.
+This behavior can be suppressed with the C<-force> option.
=head1 AUTHOR
-Sebastian Riedel, C<sri\@oook.de>
+Sebastian Riedel, C<sri@oook.de>
+
+=head1 COPYRIGHT
+
+Copyright 2004 Sebastian Riedel. All rights reserved.
+
+This library is free software, you can redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+__package__
+[% startperl %]
+
+use strict;
+use Getopt::Long;
+use Pod::Usage;
+use Catalyst::PAR;
+
+my $core = 0;
+my $classes = '';
+my $engine = 'CGI';
+my $help = 0;
+my $multiarch = 0;
+my $output = '[% appprefix %].par';
+
+GetOptions(
+ 'classes=s' => \$classes,
+ 'core' => \$core,
+ 'engine=s' => \$engine,
+ 'help|?' => \$help,
+ 'multiarch' => \$multiarch,
+ 'output=s' => \$output
+);
+
+pod2usage(1) if $help;
+
+Catalyst::PAR->new->package( {
+ classes => $classes,
+ core => $core,
+ engine => $engine,
+ multiarch => $multiarch,
+ output => $output,
+ class => '[% name %]'
+} );
+
+1;
+
+=head1 NAME
+
+[% appprefix %]_package.pl - Package Catalyst Applications
+
+=head1 SYNOPSIS
+
+[% appprefix %]_package.pl
+
+ Options:
+ -classes comma separated list of additional classes to
+ include in package
+ -core also include modules bundled with Perl (defaults to false)
+ -engine engine to use for dependency detection (defaults to CGI)
+ -help display this help and exits
+ -multiarch enable multiarch support (defaults to false)
+ -output name for the par archive (defaults to [% appprefix %].par)
+
+ Examples:
+ [% appprefix %]_package.pl -engine FastCGI
+ [% appprefix %]_package.pl -o foo_linux_i386_apache2.par -engine Apache2
+ [% appprefix %]_package.pl -classes Test::More,Foo::Bar -o foo.par
+
+ See also:
+ perldoc Catalyst::Manual
+ perldoc Catalyst::Manual::Intro
+ perldoc pp
+
+=head1 DESCRIPTION
+
+Package Catalyst Applications with L<PAR>.
+
+=head1 AUTHOR
+
+Sebastian Riedel, C<sri@oook.de>
=head1 COPYRIGHT
[% IF long_type == 'Controller' %]
=head1 METHODS
-=over 4
-
-# Uncomment, modify and add new actions to fit your needs
-#=item default
+#
+# Uncomment and modify this or add new actions to fit your needs
+#
+#=head2 default
#
#=cut
#
# $c->response->body('[% class %] is on Catalyst!');
#}
-=back
-
[% END %]
=head1 AUTHOR