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} = "#!$Config{perlpath} -w";
$self->{scriptgen} = $Catalyst::CATALYST_SCRIPT_GEN || 4;
$self->{author} = $self->{author} = $ENV{'AUTHOR'}
|| eval { @{ [ getpwuid($<) ] }[6] }
|| 'Catalyst developer';
- unless ( $self->{scripts} ) {
+ my $gen_scripts = ( $self->{makefile} ) ? 0 : 1;
+ my $gen_makefile = ( $self->{scripts} ) ? 0 : 1;
+ my $gen_app = ( $self->{scripts} || $self->{makefile} ) ? 0 : 1;
+
+ if ($gen_app) {
$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_cgi;
- $self->_mk_fastcgi;
- $self->_mk_server;
- $self->_mk_test;
- $self->_mk_create;
- return 1;
+ if ($gen_makefile) {
+ $self->_mk_makefile;
+ }
+ if ($gen_scripts) {
+ $self->_mk_cgi;
+ $self->_mk_fastcgi;
+ $self->_mk_server;
+ $self->_mk_test;
+ $self->_mk_create;
+ }
+ return $self->{dir};
}
=head3 mk_component
$self->{author} = $self->{author} = $ENV{'AUTHOR'}
|| eval { @{ [ getpwuid($<) ] }[6] }
|| 'A clever guy';
- $self->{base} = File::Spec->catdir( $FindBin::Bin, '..' );
+ $self->{base} ||= File::Spec->catdir( $FindBin::Bin, '..' );
unless ( $_[0] =~ /^(?:model|view|controller)$/i ) {
my $helper = shift;
my @args = @_;
$type = 'M' if $type =~ /model/i;
$type = 'V' if $type =~ /view/i;
$type = 'C' if $type =~ /controller/i;
- $type = $self->{long_type} unless $self->{short};
- $self->{type} = $type;
- $self->{name} = $name;
- $self->{class} = "$app\::$type\::$name";
+ my $appdir = File::Spec->catdir( split /\:\:/, $app );
+ my $test_path =
+ File::Spec->catdir( $FindBin::Bin, '..', 'lib', $appdir, 'C' );
+ $type = $self->{long_type} unless -d $test_path;
+ $self->{type} = $type;
+ $self->{name} = $name;
+ $self->{class} = "$app\::$type\::$name";
# Class
- my $appdir = File::Spec->catdir( split /\:\:/, $app );
my $path =
File::Spec->catdir( $FindBin::Bin, '..', 'lib', $appdir, $type );
my $file = $name;
my ( $self, $file, $content ) = @_;
if ( -e $file ) {
print qq/ exists "$file"\n/;
- return 0 unless ( $self->{'.newfiles'} || $self->{scripts} );
+ return 0
+ unless ( $self->{'.newfiles'}
+ || $self->{scripts}
+ || $self->{makefile} );
if ( $self->{'.newfiles'} ) {
if ( my $f = IO::File->new("< $file") ) {
my $oldcontent = join( '', (<$f>) );
$self->{uri} = $prefix;
}
my $dir = $self->{test_dir};
- my $type = $self->{type};
- $dir = File::Spec->catdir( $dir, $type );
+ my $type = lc $self->{type};
$self->mk_dir($dir);
- return File::Spec->catfile( $dir, $tname );
+ return File::Spec->catfile( $dir, "$type\_$tname" );
}
=head3 render_file
$self->{t} = File::Spec->catdir( $self->{dir}, 't' );
$self->mk_dir( $self->{t} );
- if ( $self->{short} ) {
- $self->mk_dir( File::Spec->catdir( $self->{t}, 'M' ) );
- $self->mk_dir( File::Spec->catdir( $self->{t}, 'V' ) );
- $self->mk_dir( File::Spec->catdir( $self->{t}, 'C' ) );
- }
- else {
- $self->mk_dir( File::Spec->catdir( $self->{t}, 'Model' ) );
- $self->mk_dir( File::Spec->catdir( $self->{t}, 'View' ) );
- $self->mk_dir( File::Spec->catdir( $self->{t}, 'Controller' ) );
- }
-
$self->{class} = File::Spec->catdir( split( /\:\:/, $self->{name} ) );
$self->{mod} = File::Spec->catdir( $self->{lib}, $self->{class} );
$self->mk_dir( $self->{mod} );
$self->render_file( 'appclass', "$mod.pm" );
}
-sub _mk_build {
- my $self = shift;
- my $dir = $self->{dir};
- $self->render_file( 'build', "$dir\/Build.PL" );
-}
-
sub _mk_makefile {
my $self = shift;
- my $dir = $self->{dir};
+ $self->{path} = File::Spec->catfile( 'lib', split( '::', $self->{name} ) );
+ $self->{path} .= '.pm';
+ my $dir = $self->{dir};
$self->render_file( 'makefile', "$dir\/Makefile.PL" );
+
+ if ( $self->{makefile} ) {
+
+ # deprecate the old Build.PL file when regenerating Makefile.PL
+ $self->_deprecate_file(
+ File::Spec->catdir( $self->{dir}, 'Build.PL' ) );
+ }
}
sub _mk_readme {
}
+sub _deprecate_file {
+ my ( $self, $file ) = @_;
+ if ( -e $file ) {
+ my $oldcontent;
+ if ( my $f = IO::File->new("< $file") ) {
+ $oldcontent = join( '', (<$f>) );
+ }
+ my $newfile = $file . '.deprecated';
+ if ( my $f = IO::File->new("> $newfile") ) {
+ binmode $f;
+ print $f $oldcontent;
+ print qq/created "$newfile"\n/;
+ unlink $file;
+ print qq/removed "$file"\n/;
+ return 1;
+ }
+ Catalyst::Exception->throw(
+ message => qq/Couldn't create "$file", "$!"/ );
+ }
+}
+
=head1 HELPERS
Helpers are classes that provide two methods.
=head1 METHODS
-=over 4
-
-=item default
+=head2 default
=cut
#
# Uncomment and modify this end action after adding a View component
#
-#=item end
+#=head2 end
#
#=cut
#
# my ( $self, $c ) = @_;
#
# # Forward to View unless response body is already defined
-# $c->forward('View::') unless $c->response->body;
+# $c->forward( $c->view('') ) unless $c->response->body;
#}
-=back
-
=head1 AUTHOR
[% author %]
1;
__makefile__
- unless ( eval "use Module::Build::Compat 0.02; 1" ) {
- print "This module requires Module::Build to install itself.\n";
+use inc::Module::Install;
- require ExtUtils::MakeMaker;
- my $yn =
- ExtUtils::MakeMaker::prompt( ' Install Module::Build now from CPAN?', 'y' );
+name('[% dir %]');
+abstract('Catalyst Application');
+author('[% author %]');
+version_from('[% path %]');
+license('perl');
- unless ( $yn =~ /^y/i ) {
- die " *** Cannot install without Module::Build. Exiting ...\n";
- }
-
- require Cwd;
- require File::Spec;
- require CPAN;
+include('ExtUtils::AutoInstall');
- # Save this 'cause CPAN will chdir all over the place.
- my $cwd = Cwd::cwd();
- my $makefile = File::Spec->rel2abs($0);
+requires( Catalyst => '5.60' );
- CPAN::Shell->install('Module::Build::Compat')
- or die " *** Cannot install without Module::Build. Exiting ...\n";
+catalyst_files();
- chdir $cwd or die "Cannot chdir() back to $cwd: $!";
- }
- eval "use Module::Build::Compat 0.02; 1" or die $@;
- use lib '_build/lib';
- Module::Build::Compat->run_build_pl( args => \@ARGV );
- require Module::Build;
- Module::Build::Compat->write_makefile( build_class => 'Module::Build' );
-__build__
-use strict;
-use Catalyst::Build;
-
-my $build = Catalyst::Build->new(
- license => 'perl',
- module_name => '[% name %]',
- requires => { Catalyst => '5.49' },
- create_makefile_pl => 'passthrough',
- script_files => [ glob('script/*') ],
- test_files => [ glob('t/*.t'), glob('t/*/*.t') ]
-);
-$build->create_build_script;
+install_script( glob('script/*.pl') );
+auto_install();
+&WriteAll;
__readme__
Run script/[% appprefix %]_server.pl to test the application.
__changes__
This file documents the revision history for Perl extension [% name %].
+
0.01 [% time %]
- initial revision, generated by Catalyst
__apptest__
use Test::More tests => 2;
-use_ok( Catalyst::Test, '[% name %]' );
+BEGIN { use_ok( Catalyst::Test, '[% name %]' ); }
ok( request('/')->is_success );
__podtest__
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, $pidfile );
+my ( $listen, $nproc, $pidfile, $manager, $detach );
GetOptions(
'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;
$listen,
{ nproc => $nproc,
pidfile => $pidfile,
+ manager => $manager,
+ detach => $detach,
}
);
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';
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$';
'help|?' => \$help,
'host=s' => \$host,
'port=s' => \$port,
+ 'keepalive|k' => \$keepalive,
'restart|r' => \$restart,
'restartdelay|rd=s' => \$restart_delay,
'restartregex|rr=s' => \$restart_regex
$ENV{CATALYST_DEBUG} = 1;
}
+# This is require instead of use so that the above environment
+# variables can be set at runtime.
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/
} );
-? -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
+[% startperl %]
use strict;
use Getopt::Long;
=cut
__create__
-[% startperl %] -w
+[% startperl %]
use strict;
use Getopt::Long;
use Pod::Usage;
use Catalyst::Helper;
-my $help = 0;
-my $nonew = 0;
-my $short = 0;
+my $force = 0;
+my $help = 0;
GetOptions(
- 'help|?' => \$help,
- 'nonew' => \$nonew,
- 'short' => \$short
+ 'nonew|force' => \$force,
+ 'help|?' => \$help
);
pod2usage(1) if ( $help || !$ARGV[0] );
-my $helper =
- Catalyst::Helper->new( { '.newfiles' => !$nonew, short => $short } );
+my $helper = Catalyst::Helper->new( { '.newfiles' => !$force } );
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:
[% appprefix %]_create.pl controller My::Controller
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
[% IF long_type == 'Controller' %]
=head1 METHODS
-=over 4
+=cut
#
# Uncomment and modify this or add new actions to fit your needs
#
-#=item default
+#=head2 default
#
#=cut
#
# $c->response->body('[% class %] is on Catalyst!');
#}
-=back
-
[% END %]
=head1 AUTHOR