X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FHelper.pm;h=508e7788ab85e32e38739a9ccb67336a516eb1f3;hb=3c24e97e23801a20139ce3c2153f20034a1b5dbe;hp=97c0f56d58794e3deee1a28d4d9ba16b6fd025bb;hpb=11d090846da613b5f4fdc5efee5b8cae806cc0dd;p=catagits%2FCatalyst-Devel.git diff --git a/lib/Catalyst/Helper.pm b/lib/Catalyst/Helper.pm index 97c0f56..508e778 100644 --- a/lib/Catalyst/Helper.pm +++ b/lib/Catalyst/Helper.pm @@ -13,6 +13,8 @@ use Template; use Catalyst::Devel; use Catalyst::Utils; use Catalyst::Exception; +use Path::Class qw/dir file/; +use File::ShareDir qw/dist_dir/; my %cache; @@ -26,20 +28,18 @@ Catalyst::Helper - Bootstrap a Catalyst application =cut +sub get_sharedir_file { + my ($self, @filename) = @_; + my $file = file( dist_dir('Catalyst-Devel'), @filename); + warn $file; + my $contents = $file->slurp; + return $contents; +} + sub get_file { - my ( $self, $class, $file ) = @_; - unless ( $cache{$class} ) { - local $/; - $cache{$class} = eval "package $class; "; - } - my $data = $cache{$class}; - my @files = split /^__(.+)__\r?\n/m, $data; - shift @files; - while (@files) { - my ( $name, $content ) = splice @files, 0, 2; - return $content if $name eq $file; - } - return 0; + my ( $self, $file ) = @_; + + return $self->get_sharedir_file($file); } sub mk_app { @@ -48,7 +48,7 @@ sub mk_app { # Needs to be here for PAR require Catalyst; - if ( $name =~ /[^\w\:]/ ) { + if ( $name =~ /[^\w:]/ || $name =~ /^\d/ || $name =~ /\b:\b|:{3,}/) { warn "Error: Invalid application name.\n"; return 0; } @@ -58,7 +58,9 @@ sub mk_app { $self->{script } = File::Spec->catdir( $self->{dir}, 'script' ); $self->{appprefix } = Catalyst::Utils::appprefix($name); $self->{appenv } = Catalyst::Utils::class2env($name); - $self->{startperl } = "#!$Config{perlpath} -w"; + $self->{startperl } = -r '/usr/bin/env' + ? '#!/usr/bin/env perl' + : "#!$Config{perlpath} -w"; $self->{scriptgen } = $Catalyst::Devel::CATALYST_SCRIPT_GEN || 4; $self->{catalyst_version} = $Catalyst::VERSION; $self->{author } = $self->{author} = $ENV{'AUTHOR'} @@ -89,6 +91,7 @@ sub mk_app { $self->_mk_server; $self->_mk_test; $self->_mk_create; + $self->_mk_information; } return $self->{dir}; } @@ -247,7 +250,7 @@ sub render_file { my ( $self, $file, $path, $vars ) = @_; $vars ||= {}; my $t = Template->new; - my $template = $self->get_file( ( caller(0) )[0], $file ); + my $template = $self->get_sharedir_file( 'root', $file ); return 0 unless $template; my $output; $t->process( \$template, { %{$self}, %$vars }, \$output ) @@ -256,6 +259,11 @@ sub render_file { $self->mk_file( $path, $output ); } +sub _mk_information { + my $self = shift; + print qq/Change to application directory and Run "perl Makefile.PL" to make sure your install is complete\n/; +} + sub _mk_dirs { my $self = shift; $self->mk_dir( $self->{dir} ); @@ -300,12 +308,12 @@ sub _mk_dirs { sub _mk_appclass { my $self = shift; my $mod = $self->{mod}; - $self->render_file( 'appclass', "$mod.pm" ); + $self->render_file( 'appclass.tt', "$mod.pm" ); } sub _mk_rootclass { my $self = shift; - $self->render_file( 'rootclass', + $self->render_file( 'rootclass.tt', File::Spec->catfile( $self->{c}, "Root.pm" ) ); } @@ -314,7 +322,7 @@ sub _mk_makefile { $self->{path} = File::Spec->catfile( 'lib', split( '::', $self->{name} ) ); $self->{path} .= '.pm'; my $dir = $self->{dir}; - $self->render_file( 'makefile', "$dir\/Makefile.PL" ); + $self->render_file( 'makefile.tt', "$dir\/Makefile.PL" ); if ( $self->{makefile} ) { @@ -328,36 +336,36 @@ sub _mk_config { my $self = shift; my $dir = $self->{dir}; my $appprefix = $self->{appprefix}; - $self->render_file( 'config', + $self->render_file( 'config.tt', File::Spec->catfile( $dir, "$appprefix.conf" ) ); } sub _mk_readme { my $self = shift; my $dir = $self->{dir}; - $self->render_file( 'readme', "$dir\/README" ); + $self->render_file( 'readme.tt', "$dir\/README" ); } sub _mk_changes { my $self = shift; my $dir = $self->{dir}; my $time = strftime('%Y-%m-%d %H:%M:%S', localtime time); - $self->render_file( 'changes', "$dir\/Changes", { time => $time } ); + $self->render_file( 'changes.tt', "$dir\/Changes", { time => $time } ); } sub _mk_apptest { my $self = shift; my $t = $self->{t}; - $self->render_file( 'apptest', "$t\/01app.t" ); - $self->render_file( 'podtest', "$t\/02pod.t" ); - $self->render_file( 'podcoveragetest', "$t\/03podcoverage.t" ); + $self->render_file( 'apptest.tt', "$t\/01app.t" ); + $self->render_file( 'podtest.tt', "$t\/02pod.t" ); + $self->render_file( 'podcoveragetest.tt', "$t\/03podcoverage.t" ); } sub _mk_cgi { my $self = shift; my $script = $self->{script}; my $appprefix = $self->{appprefix}; - $self->render_file( 'cgi', "$script\/$appprefix\_cgi.pl" ); + $self->render_file( 'cgi.tt', "$script\/$appprefix\_cgi.pl" ); chmod 0700, "$script/$appprefix\_cgi.pl"; } @@ -365,7 +373,7 @@ sub _mk_fastcgi { my $self = shift; my $script = $self->{script}; my $appprefix = $self->{appprefix}; - $self->render_file( 'fastcgi', "$script\/$appprefix\_fastcgi.pl" ); + $self->render_file( 'fastcgi.tt', "$script\/$appprefix\_fastcgi.pl" ); chmod 0700, "$script/$appprefix\_fastcgi.pl"; } @@ -373,7 +381,7 @@ sub _mk_server { my $self = shift; my $script = $self->{script}; my $appprefix = $self->{appprefix}; - $self->render_file( 'server', "$script\/$appprefix\_server.pl" ); + $self->render_file( 'server.tt', "$script\/$appprefix\_server.pl" ); chmod 0700, "$script/$appprefix\_server.pl"; } @@ -381,7 +389,7 @@ sub _mk_test { my $self = shift; my $script = $self->{script}; my $appprefix = $self->{appprefix}; - $self->render_file( 'test', "$script/$appprefix\_test.pl" ); + $self->render_file( 'test.tt', "$script/$appprefix\_test.pl" ); chmod 0700, "$script/$appprefix\_test.pl"; } @@ -389,20 +397,20 @@ sub _mk_create { my $self = shift; my $script = $self->{script}; my $appprefix = $self->{appprefix}; - $self->render_file( 'create', "$script\/$appprefix\_create.pl" ); + $self->render_file( 'create.tt', "$script\/$appprefix\_create.pl" ); chmod 0700, "$script/$appprefix\_create.pl"; } sub _mk_compclass { my $self = shift; my $file = $self->{file}; - return $self->render_file( 'compclass', "$file" ); + return $self->render_file( 'compclass.tt', "$file" ); } sub _mk_comptest { my $self = shift; my $test = $self->{test}; - $self->render_file( 'comptest', "$test" ); + $self->render_file( 'comptest.tt', "$test" ); } sub _mk_images { @@ -413,8 +421,7 @@ sub _mk_images { btn_120x50_powered btn_120x50_powered_shadow btn_88x31_built btn_88x31_built_shadow btn_88x31_powered btn_88x31_powered_shadow/; for my $name (@images) { - my $hex = $self->get_file( ( caller(0) )[0], $name ); - my $image = pack "H*", $hex; + my $image = $self->get_file("$name.png"); $self->mk_file( File::Spec->catfile( $images, "$name.png" ), $image ); } } @@ -422,9 +429,9 @@ sub _mk_images { sub _mk_favicon { my $self = shift; my $root = $self->{root}; - my $hex = $self->get_file( ( caller(0) )[0], 'favicon' ); - my $favicon = pack "H*", $hex; - $self->mk_file( File::Spec->catfile( $root, "favicon.ico" ), $favicon ); + my $favicon = $self->get_sharedir_file( 'root', 'favicon.ico' ); + my $dest = File::Spec->catfile( $root, "favicon.ico" ); + $self->mk_file( $dest, $favicon ); } @@ -499,8 +506,8 @@ So when you call C, create will try to execute Catalyst::Helper::View::TT->mk_compclass and Catalyst::Helper::View::TT->mk_comptest. -See L and L for -examples. +See L and +L for examples. All helper classes should be under one of the following namespaces. @@ -508,6 +515,34 @@ All helper classes should be under one of the following namespaces. Catalyst::Helper::View:: Catalyst::Helper::Controller:: +=head2 COMMON HELPERS + +=over + +=item * + +L - DBIx::Class models + +=item * + +L - Template Toolkit view + +=item * + +L + +=item * + +L - wrap any class into a Catalyst model + +=back + +=head3 NOTE + +The helpers will read author name from /etc/passwd by default. + To override, please export the AUTHOR variable. + +=head1 METHODS + =head2 mk_compclass This method in your Helper module is called with C<$helper> @@ -539,41 +574,46 @@ arguments the user typed. There is no fallback for this method. -=head1 METHODS +=head1 INTERNAL METHODS These are the methods that the Helper classes can call on the <$helper> object passed to them. -=head2 render_file +=head2 render_file ($file, $path, $vars) -Render and create a file from a template in DATA using -Template Toolkit. +Render and create a file from a template in DATA using Template +Toolkit. $file is the relevent chunk of the __DATA__ section, $path is +the path to the file and $vars is the hashref as expected by +L