Version 1.39
[catagits/Catalyst-Devel.git] / lib / Catalyst / Helper.pm
CommitLineData
68ccb5e5 1package Catalyst::Helper;
957ccd4d 2use Moose;
68ccb5e5 3use Config;
4use File::Spec;
18b4b23e 5use File::Spec::Unix;
68ccb5e5 6use File::Path;
68ccb5e5 7use FindBin;
2415f774 8use IO::File;
9use POSIX 'strftime';
68ccb5e5 10use Template;
9ffb6b83 11use Catalyst::Devel;
68ccb5e5 12use Catalyst::Utils;
13use Catalyst::Exception;
afd739f1 14use Path::Class qw/dir file/;
15use File::ShareDir qw/dist_dir/;
51f3ab37 16use YAML::Tiny;
957ccd4d 17use namespace::autoclean;
68ccb5e5 18
dcc30470 19with 'MooseX::Emulate::Class::Accessor::Fast';
20
efc787e1 21# Change Catalyst/Devel.pm also
f4fdfd3e 22our $VERSION = '1.39';
efc787e1 23
68ccb5e5 24my %cache;
25
26=head1 NAME
27
28Catalyst::Helper - Bootstrap a Catalyst application
29
30=head1 SYNOPSIS
31
fab70e0a 32 catalyst.pl <myappname>
68ccb5e5 33
34=cut
35
afd739f1 36sub get_sharedir_file {
37 my ($self, @filename) = @_;
1ef88a06 38 my $dist_dir;
4c709311 39 if (exists $ENV{CATALYST_DEVEL_SHAREDIR}) {
1ef88a06 40 $dist_dir = $ENV{CATALYST_DEVEL_SHAREDIR};
4c709311 41 }
1ef88a06 42 elsif (-d "inc/.author" && -f "lib/Catalyst/Helper.pm"
d7ebca0f 43 ) { # Can't use sharedir if we're in a checkout
44 # this feels horrible, better ideas?
1ef88a06 45 $dist_dir = 'share';
76b106bc 46 }
47 else {
1ef88a06 48 $dist_dir = dist_dir('Catalyst-Devel');
76b106bc 49 }
1ef88a06 50 my $file = file( $dist_dir, @filename);
f8d3d4e0 51 Carp::confess("Cannot find $file") unless -r $file;
b728fa3c 52 my $contents = $file->slurp(iomode => "<:raw");
afd739f1 53 return $contents;
54}
55
faae88e5 56# Do not touch this method, *EVER*, it is needed for back compat.
68ccb5e5 57sub get_file {
03082a71 58 my ( $self, $class, $file ) = @_;
59 unless ( $cache{$class} ) {
60 local $/;
61 $cache{$class} = eval "package $class; <DATA>";
62 }
63 my $data = $cache{$class};
0acedf59 64 Carp::confess("Could not get data from __DATA__ segment for $class")
65 unless $data;
03082a71 66 my @files = split /^__(.+)__\r?\n/m, $data;
67 shift @files;
68 while (@files) {
69 my ( $name, $content ) = splice @files, 0, 2;
70 return $content if $name eq $file;
71 }
72 return 0;
68ccb5e5 73}
b4b7c206 74
a73b3971 75
68ccb5e5 76sub mk_app {
fdb9d1d9 77 my ( $self, $name ) = @_;
68ccb5e5 78
79 # Needs to be here for PAR
80 require Catalyst;
81
51f3ab37 82 if($name eq '.') {
83 if(!-e 'META.yml') {
84 system perl => 'Makefile.PL'
85 and Catalyst::Exception->throw(message => q(
86 Failed to run "perl Makefile.PL".
87 ));
88 }
89
90 $name = YAML::Tiny->read('META.yml')->[0]->{'name'};
91 $name =~ s/-/::/g;
92 $self->{dir} = '.';
93 }
94
fdb9d1d9 95 if ( $name =~ /[^\w:]/ || $name =~ /^\d/ || $name =~ /\b:\b|:{3,}/) {
96 warn "Error: Invalid application name.\n";
97 return 0;
98 }
51f3ab37 99
100
101 if(!defined $self->{'dir'}) {
102 $self->{dir} = $name;
103 $self->{dir} =~ s/\:\:/-/g;
104 }
105
fdb9d1d9 106 $self->{name } = $name;
fdb9d1d9 107 $self->{script } = dir( $self->{dir}, 'script' );
108 $self->{appprefix } = Catalyst::Utils::appprefix($name);
109 $self->{appenv } = Catalyst::Utils::class2env($name);
675fef06 110 $self->{startperl } = -r '/usr/bin/env'
111 ? '#!/usr/bin/env perl'
4dc075f9 112 : "#!$Config{perlpath}";
2ad36447 113 $self->{scriptgen } = $Catalyst::Devel::CATALYST_SCRIPT_GEN;
902763f2 114 $self->{catalyst_version} = $Catalyst::VERSION;
a39434ca 115 $self->{author } ||= $ENV{'AUTHOR'}
fdb9d1d9 116 || eval { @{ [ getpwuid($<) ] }[6] }
117 || 'Catalyst developer';
68ccb5e5 118
119 my $gen_scripts = ( $self->{makefile} ) ? 0 : 1;
120 my $gen_makefile = ( $self->{scripts} ) ? 0 : 1;
121 my $gen_app = ( $self->{scripts} || $self->{makefile} ) ? 0 : 1;
122
123 if ($gen_app) {
b769c101 124 for ( qw/ _mk_dirs _mk_config _mk_psgi _mk_appclass _mk_rootclass
125 _mk_readme _mk_changes _mk_apptest _mk_podtest _mk_podcoveragetest
da109dfb 126 _mk_images _mk_favicon/ ) {
fdb9d1d9 127 $self->$_;
420ad692 128 }
68ccb5e5 129 }
130 if ($gen_makefile) {
131 $self->_mk_makefile;
132 }
133 if ($gen_scripts) {
b769c101 134 for ( qw/ _mk_cgi _mk_fastcgi _mk_server
28d172c6 135 _mk_test _mk_create _mk_information
136 / ) {
fdb9d1d9 137 $self->$_;
28d172c6 138 }
68ccb5e5 139 }
fdb9d1d9 140 return $self->{dir};
68ccb5e5 141}
142
b769c101 143## not much of this can really be changed, mk_compclass must be left for
23f9f145 144## backcompat
68ccb5e5 145sub mk_component {
146 my $self = shift;
147 my $app = shift;
148 $self->{app} = $app;
fdb9d1d9 149 $self->{author} = $self->{author} = $ENV{'AUTHOR'}
150 || eval { @{ [ getpwuid($<) ] }[6] }
151 || 'A clever guy';
152 $self->{base} ||= dir( $FindBin::Bin, '..' );
68ccb5e5 153 unless ( $_[0] =~ /^(?:model|view|controller)$/i ) {
154 my $helper = shift;
155 my @args = @_;
156 my $class = "Catalyst::Helper::$helper";
157 eval "require $class";
158
159 if ($@) {
160 Catalyst::Exception->throw(
161 message => qq/Couldn't load helper "$class", "$@"/ );
162 }
163
164 if ( $class->can('mk_stuff') ) {
165 return 1 unless $class->mk_stuff( $self, @args );
166 }
167 }
168 else {
169 my $type = shift;
170 my $name = shift || "Missing name for model/view/controller";
171 my $helper = shift;
172 my @args = @_;
fab70e0a 173 return 0 if $name =~ /[^\w\:]/;
68ccb5e5 174 $type = lc $type;
175 $self->{long_type} = ucfirst $type;
176 $type = 'M' if $type =~ /model/i;
177 $type = 'V' if $type =~ /view/i;
178 $type = 'C' if $type =~ /controller/i;
068587bd 179 my $appdir = dir( split /\:\:/, $app );
68ccb5e5 180 my $test_path =
068587bd 181 dir( $self->{base}, 'lib', $appdir, 'C' );
68ccb5e5 182 $type = $self->{long_type} unless -d $test_path;
183 $self->{type} = $type;
184 $self->{name} = $name;
185 $self->{class} = "$app\::$type\::$name";
186
187 # Class
188 my $path =
068587bd 189 dir( $self->{base}, 'lib', $appdir, $type );
68ccb5e5 190 my $file = $name;
191 if ( $name =~ /\:/ ) {
192 my @path = split /\:\:/, $name;
193 $file = pop @path;
068587bd 194 $path = dir( $path, @path );
68ccb5e5 195 }
196 $self->mk_dir($path);
068587bd 197 $file = file( $path, "$file.pm" );
68ccb5e5 198 $self->{file} = $file;
199
200 # Test
068587bd 201 $self->{test_dir} = dir( $self->{base}, 't' );
68ccb5e5 202 $self->{test} = $self->next_test;
203
204 # Helper
205 if ($helper) {
206 my $comp = $self->{long_type};
207 my $class = "Catalyst::Helper::$comp\::$helper";
208 eval "require $class";
209
210 if ($@) {
211 Catalyst::Exception->throw(
212 message => qq/Couldn't load helper "$class", "$@"/ );
213 }
214
215 if ( $class->can('mk_compclass') ) {
216 return 1 unless $class->mk_compclass( $self, @args );
217 }
20755aa7 218 else {
219 return 1 unless $self->_mk_compclass
220 }
68ccb5e5 221
222 if ( $class->can('mk_comptest') ) {
223 $class->mk_comptest( $self, @args );
224 }
20755aa7 225 else {
226 $self->_mk_comptest
227 }
68ccb5e5 228 }
229
230 # Fallback
231 else {
232 return 1 unless $self->_mk_compclass;
233 $self->_mk_comptest;
234 }
235 }
236 return 1;
237}
238
68ccb5e5 239sub mk_dir {
240 my ( $self, $dir ) = @_;
241 if ( -d $dir ) {
242 print qq/ exists "$dir"\n/;
243 return 0;
244 }
245 if ( mkpath [$dir] ) {
246 print qq/created "$dir"\n/;
247 return 1;
248 }
249
250 Catalyst::Exception->throw( message => qq/Couldn't create "$dir", "$!"/ );
251}
252
68ccb5e5 253sub mk_file {
254 my ( $self, $file, $content ) = @_;
06f62452 255 if ( -e $file && -s _ ) {
68ccb5e5 256 print qq/ exists "$file"\n/;
257 return 0
258 unless ( $self->{'.newfiles'}
259 || $self->{scripts}
260 || $self->{makefile} );
261 if ( $self->{'.newfiles'} ) {
262 if ( my $f = IO::File->new("< $file") ) {
263 my $oldcontent = join( '', (<$f>) );
264 return 0 if $content eq $oldcontent;
265 }
266 $file .= '.new';
267 }
268 }
620dd287 269
68ccb5e5 270 if ( my $f = IO::File->new("> $file") ) {
271 binmode $f;
272 print $f $content;
273 print qq/created "$file"\n/;
b6d89690 274 return $file;
68ccb5e5 275 }
276
277 Catalyst::Exception->throw( message => qq/Couldn't create "$file", "$!"/ );
278}
279
68ccb5e5 280sub next_test {
281 my ( $self, $tname ) = @_;
282 if ($tname) { $tname = "$tname.t" }
283 else {
284 my $name = $self->{name};
285 my $prefix = $name;
286 $prefix =~ s/::/-/g;
287 $prefix = $prefix;
288 $tname = $prefix . '.t';
289 $self->{prefix} = $prefix;
290 $prefix = lc $prefix;
291 $prefix =~ s/-/\//g;
292 $self->{uri} = "/$prefix";
293 }
294 my $dir = $self->{test_dir};
295 my $type = lc $self->{type};
296 $self->mk_dir($dir);
068587bd 297 return file( $dir, "$type\_$tname" );
68ccb5e5 298}
299
faae88e5 300# Do not touch this method, *EVER*, it is needed for back compat.
7025ed89 301## addendum: we had to split this method so we could have backwards
19fecc42 302## compatability. otherwise, we'd have no way to pass stuff from __DATA__
faae88e5 303
68ccb5e5 304sub render_file {
b6d89690 305 my ( $self, $file, $path, $vars, $perms ) = @_;
7025ed89 306 my $template = $self->get_file( ( caller(0) )[0], $file );
b6d89690 307 $self->render_file_contents($template, $path, $vars, $perms);
7025ed89 308}
309
310sub render_sharedir_file {
b6d89690 311 my ( $self, $file, $path, $vars, $perms ) = @_;
7025ed89 312 my $template = $self->get_sharedir_file( $file );
f8d3d4e0 313 die("Cannot get template from $file for $self\n") unless $template;
b6d89690 314 $self->render_file_contents($template, $path, $vars, $perms);
7025ed89 315}
316
317sub render_file_contents {
b6d89690 318 my ( $self, $template, $path, $vars, $perms ) = @_;
68ccb5e5 319 $vars ||= {};
320 my $t = Template->new;
68ccb5e5 321 return 0 unless $template;
322 my $output;
323 $t->process( \$template, { %{$self}, %$vars }, \$output )
324 || Catalyst::Exception->throw(
7025ed89 325 message => qq/Couldn't process "$template", / . $t->error() );
b6d89690 326 my $file = $self->mk_file( $path, $output );
47f36ce5 327 chmod $perms, file($file) if defined $perms;
49d5395a 328 return $file;
68ccb5e5 329}
330
45d74601 331sub _mk_information {
332 my $self = shift;
333 print qq/Change to application directory and Run "perl Makefile.PL" to make sure your install is complete\n/;
334}
335
68ccb5e5 336sub _mk_dirs {
337 my $self = shift;
fdb9d1d9 338 $self->mk_dir( $self->{dir} );
339 $self->mk_dir( $self->{script} );
340 $self->{lib} = dir( $self->{dir}, 'lib' );
341 $self->mk_dir( $self->{lib} );
342 $self->{root} = dir( $self->{dir}, 'root' );
343 $self->mk_dir( $self->{root} );
344 $self->{static} = dir( $self->{root}, 'static' );
345 $self->mk_dir( $self->{static} );
346 $self->{images} = dir( $self->{static}, 'images' );
347 $self->mk_dir( $self->{images} );
348 $self->{t} = dir( $self->{dir}, 't' );
349 $self->mk_dir( $self->{t} );
350
351 $self->{class} = dir( split( /\:\:/, $self->{name} ) );
352 $self->{mod} = dir( $self->{lib}, $self->{class} );
353 $self->mk_dir( $self->{mod} );
354
355 if ( $self->{short} ) {
356 $self->{m} = dir( $self->{mod}, 'M' );
357 $self->mk_dir( $self->{m} );
358 $self->{v} = dir( $self->{mod}, 'V' );
359 $self->mk_dir( $self->{v} );
360 $self->{c} = dir( $self->{mod}, 'C' );
361 $self->mk_dir( $self->{c} );
362 }
363 else {
364 $self->{m} = dir( $self->{mod}, 'Model' );
365 $self->mk_dir( $self->{m} );
366 $self->{v} = dir( $self->{mod}, 'View' );
367 $self->mk_dir( $self->{v} );
368 $self->{c} = dir( $self->{mod}, 'Controller' );
369 $self->mk_dir( $self->{c} );
ec62787d 370 }
fdb9d1d9 371 my $name = $self->{name};
372 $self->{rootname} =
373 $self->{short} ? "$name\::C::Root" : "$name\::Controller::Root";
374 $self->{base} = dir( $self->{dir} )->absolute;
68ccb5e5 375}
376
377sub _mk_appclass {
378 my $self = shift;
fdb9d1d9 379 my $mod = $self->{mod};
068587bd 380 $self->render_sharedir_file( file('lib', 'MyApp.pm.tt'), "$mod.pm" );
68ccb5e5 381}
382
383sub _mk_rootclass {
384 my $self = shift;
068587bd 385 $self->render_sharedir_file( file('lib', 'MyApp', 'Controller', 'Root.pm.tt'),
fdb9d1d9 386 file( $self->{c}, "Root.pm" ) );
68ccb5e5 387}
388
389sub _mk_makefile {
390 my $self = shift;
f7cb00cb 391 $self->{path} = join('/', 'lib', split( '::', $self->{name} ) );
68ccb5e5 392 $self->{path} .= '.pm';
fdb9d1d9 393 my $dir = $self->{dir};
394 $self->render_sharedir_file( 'Makefile.PL.tt', file($dir, "Makefile.PL") );
68ccb5e5 395
396 if ( $self->{makefile} ) {
397
398 # deprecate the old Build.PL file when regenerating Makefile.PL
399 $self->_deprecate_file(
fdb9d1d9 400 file( $self->{dir}, 'Build.PL' ) );
68ccb5e5 401 }
402}
403
b769c101 404sub _mk_psgi {
405 my $self = shift;
406 my $dir = $self->{dir};
407 my $appprefix = $self->{appprefix};
408 $self->render_sharedir_file( 'myapp.psgi.tt',
409 file( $dir, "$appprefix.psgi" ) );
410}
411
68ccb5e5 412sub _mk_config {
413 my $self = shift;
fdb9d1d9 414 my $dir = $self->{dir};
415 my $appprefix = $self->{appprefix};
d5ff5c0f 416 $self->render_sharedir_file( 'myapp.conf.tt',
fdb9d1d9 417 file( $dir, "$appprefix.conf" ) );
68ccb5e5 418}
419
420sub _mk_readme {
421 my $self = shift;
fdb9d1d9 422 my $dir = $self->{dir};
423 $self->render_sharedir_file( 'README.tt', file($dir, "README") );
68ccb5e5 424}
425
426sub _mk_changes {
427 my $self = shift;
fdb9d1d9 428 my $dir = $self->{dir};
5b1ec88b 429 my $time = strftime('%Y-%m-%d %H:%M:%S', localtime time);
fdb9d1d9 430 $self->render_sharedir_file( 'Changes.tt', file($dir, "Changes"), { time => $time } );
68ccb5e5 431}
432
433sub _mk_apptest {
434 my $self = shift;
435 my $t = $self->{t};
068587bd 436 $self->render_sharedir_file( file('t', '01app.t.tt'), file($t, "01app.t") );
da109dfb 437}
438
439sub _mk_podtest {
440 my $self = shift;
441 my $t = $self->{t};
068587bd 442 $self->render_sharedir_file( file('t', '02pod.t.tt'), file($t, "02pod.t") );
da109dfb 443}
444
445sub _mk_podcoveragetest {
446 my $self = shift;
447 my $t = $self->{t};
068587bd 448 $self->render_sharedir_file( file('t', '03podcoverage.t.tt'), file($t, "03podcoverage.t") );
68ccb5e5 449}
450
451sub _mk_cgi {
452 my $self = shift;
fdb9d1d9 453 my $script = $self->{script};
454 my $appprefix = $self->{appprefix};
b6d89690 455 $self->render_sharedir_file( file('script', 'myapp_cgi.pl.tt'),
8b0107a5 456 file($script,"$appprefix\_cgi.pl"), undef, 0755 );
68ccb5e5 457}
458
459sub _mk_fastcgi {
460 my $self = shift;
fdb9d1d9 461 my $script = $self->{script};
462 my $appprefix = $self->{appprefix};
b6d89690 463 $self->render_sharedir_file( file('script', 'myapp_fastcgi.pl.tt'),
8b0107a5 464 file($script, "$appprefix\_fastcgi.pl"), undef, 0755 );
68ccb5e5 465}
466
467sub _mk_server {
468 my $self = shift;
fdb9d1d9 469 my $script = $self->{script};
470 my $appprefix = $self->{appprefix};
b6d89690 471 $self->render_sharedir_file( file('script', 'myapp_server.pl.tt'),
8b0107a5 472 file($script, "$appprefix\_server.pl"), undef, 0755 );
68ccb5e5 473}
474
475sub _mk_test {
476 my $self = shift;
fdb9d1d9 477 my $script = $self->{script};
478 my $appprefix = $self->{appprefix};
b6d89690 479 $self->render_sharedir_file( file('script', 'myapp_test.pl.tt'),
8b0107a5 480 file($script, "$appprefix\_test.pl"), undef, 0755 );
68ccb5e5 481}
482
483sub _mk_create {
484 my $self = shift;
fdb9d1d9 485 my $script = $self->{script};
486 my $appprefix = $self->{appprefix};
b6d89690 487 $self->render_sharedir_file( file('script', 'myapp_create.pl.tt'),
8b0107a5 488 file($script, "$appprefix\_create.pl"), undef, 0755 );
68ccb5e5 489}
490
491sub _mk_compclass {
492 my $self = shift;
493 my $file = $self->{file};
068587bd 494 return $self->render_sharedir_file( file('lib', 'Helper', 'compclass.pm.tt'), $file );
68ccb5e5 495}
496
497sub _mk_comptest {
498 my $self = shift;
499 my $test = $self->{test};
068587bd 500 $self->render_sharedir_file( file('t', 'comptest.tt'), $test ); ## wtf do i rename this to?
68ccb5e5 501}
502
503sub _mk_images {
504 my $self = shift;
505 my $images = $self->{images};
506 my @images =
507 qw/catalyst_logo btn_120x50_built btn_120x50_built_shadow
508 btn_120x50_powered btn_120x50_powered_shadow btn_88x31_built
509 btn_88x31_built_shadow btn_88x31_powered btn_88x31_powered_shadow/;
510 for my $name (@images) {
3f2f19ec 511 my $image = $self->get_sharedir_file("root", "static", "images", "$name.png.bin");
068587bd 512 $self->mk_file( file( $images, "$name.png" ), $image );
68ccb5e5 513 }
514}
515
516sub _mk_favicon {
517 my $self = shift;
518 my $root = $self->{root};
f023d4a1 519 my $favicon = $self->get_sharedir_file( 'root', 'favicon.ico.bin' );
068587bd 520 my $dest = dir( $root, "favicon.ico" );
afd739f1 521 $self->mk_file( $dest, $favicon );
68ccb5e5 522
523}
524
525sub _deprecate_file {
526 my ( $self, $file ) = @_;
527 if ( -e $file ) {
28d172c6 528 my ($f, $oldcontent);
529 if ( $f = IO::File->new("< $file") ) {
68ccb5e5 530 $oldcontent = join( '', (<$f>) );
531 }
532 my $newfile = $file . '.deprecated';
28d172c6 533 if ( $f = IO::File->new("> $newfile") ) {
68ccb5e5 534 binmode $f;
535 print $f $oldcontent;
536 print qq/created "$newfile"\n/;
537 unlink $file;
538 print qq/removed "$file"\n/;
539 return 1;
540 }
541 Catalyst::Exception->throw(
542 message => qq/Couldn't create "$file", "$!"/ );
543 }
544}
545
fab70e0a 546=head1 DESCRIPTION
547
548This module is used by B<catalyst.pl> to create a set of scripts for a
549new catalyst application. The scripts each contain documentation and
550will output help on how to use them if called incorrectly or in some
551cases, with no arguments.
552
553It also provides some useful methods for a Helper module to call when
554creating a component. See L</METHODS>.
555
556=head1 SCRIPTS
557
558=head2 _create.pl
559
560Used to create new components for a catalyst application at the
561development stage.
562
563=head2 _server.pl
564
565The catalyst test server, starts an HTTPD which outputs debugging to
566the terminal.
567
568=head2 _test.pl
569
570A script for running tests from the command-line.
571
572=head2 _cgi.pl
573
574Run your application as a CGI.
575
576=head2 _fastcgi.pl
577
578Run the application as a fastcgi app. Either by hand, or call this
579from FastCgiServer in your http server config.
580
68ccb5e5 581=head1 HELPERS
582
fab70e0a 583The L</_create.pl> script creates application components using Helper
584modules. The Catalyst team provides a good number of Helper modules
585for you to use. You can also add your own.
586
68ccb5e5 587Helpers are classes that provide two methods.
588
589 * mk_compclass - creates the Component class
590 * mk_comptest - creates the Component test
591
fab70e0a 592So when you call C<scripts/myapp_create.pl view MyView TT>, create
593will try to execute Catalyst::Helper::View::TT->mk_compclass and
68ccb5e5 594Catalyst::Helper::View::TT->mk_comptest.
595
c4c50c2d 596See L<Catalyst::Helper::View::TT> and
597L<Catalyst::Helper::Model::DBIC::Schema> for examples.
68ccb5e5 598
599All helper classes should be under one of the following namespaces.
600
601 Catalyst::Helper::Model::
602 Catalyst::Helper::View::
603 Catalyst::Helper::Controller::
604
675fef06 605=head2 COMMON HELPERS
bc8d7994 606
607=over
608
609=item *
610
611L<Catalyst::Helper::Model::DBIC::Schema> - DBIx::Class models
612
613=item *
614
615L<Catalyst::Helper::View::TT> - Template Toolkit view
616
617=item *
618
619L<Catalyst::Helper::Model::LDAP>
620
621=item *
622
623L<Catalyst::Helper::Model::Adaptor> - wrap any class into a Catalyst model
624
625=back
626
627=head3 NOTE
628
acde1869 629The helpers will read author name from /etc/passwd by default.
630To override, please export the AUTHOR variable.
bc8d7994 631
632=head1 METHODS
633
fab70e0a 634=head2 mk_compclass
635
636This method in your Helper module is called with C<$helper>
637which is a L<Catalyst::Helper> object, and whichever other arguments
638the user added to the command-line. You can use the $helper to call methods
639described below.
640
641If the Helper module does not contain a C<mk_compclass> method, it
642will fall back to calling L</render_file>, with an argument of
643C<compclass>.
644
645=head2 mk_comptest
646
647This method in your Helper module is called with C<$helper>
648which is a L<Catalyst::Helper> object, and whichever other arguments
649the user added to the command-line. You can use the $helper to call methods
650described below.
651
652If the Helper module does not contain a C<mk_compclass> method, it
653will fall back to calling L</render_file>, with an argument of
654C<comptest>.
655
656=head2 mk_stuff
657
658This method is called if the user does not supply any of the usual
659component types C<view>, C<controller>, C<model>. It is passed the
660C<$helper> object (an instance of L<Catalyst::Helper>), and any other
661arguments the user typed.
662
663There is no fallback for this method.
664
bc8d7994 665=head1 INTERNAL METHODS
fab70e0a 666
667These are the methods that the Helper classes can call on the
668<$helper> object passed to them.
669
b6d89690 670=head2 render_file ($file, $path, $vars, $perms)
fab70e0a 671
28eb1300 672Render and create a file from a template in DATA using Template
673Toolkit. $file is the relevent chunk of the __DATA__ section, $path is
b6d89690 674the path to the file, $vars is the hashref as expected by
675L<Template Toolkit|Template> and $perms are desired permissions (or system
676defaults if not set).
fab70e0a 677
28eb1300 678=head2 get_file ($class, $file)
fab70e0a 679
680Fetch file contents from the DATA section. This is used internally by
28eb1300 681L</render_file>. $class is the name of the class to get the DATA
682section from. __PACKAGE__ or ( caller(0) )[0] might be sensible
683values for this.
fab70e0a 684
685=head2 mk_app
686
687Create the main application skeleton. This is called by L<catalyst.pl>.
688
28eb1300 689=head2 mk_component ($app)
fab70e0a 690
691This method is called by L<create.pl> to make new components
692for your application.
693
608f6b92 694=head2 mk_dir ($path)
fab70e0a 695
696Surprisingly, this function makes a directory.
697
28eb1300 698=head2 mk_file ($file, $content)
fab70e0a 699
700Writes content to a file. Called by L</render_file>.
701
28eb1300 702=head2 next_test ($test_name)
fab70e0a 703
704Calculates the name of the next numbered test file and returns it.
28eb1300 705Don't give the number or the .t suffix for the test name.
fab70e0a 706
c6dbb300 707=cut
708
709=head2 get_sharedir_file
710
711Method for getting a file out of share/
712
713=cut
714
715=head2 render_file_contents
716
717Process a L<Template::Toolkit> template.
718
719=cut
720
721=head2 render_sharedir_file
722
723Render a template/image file from our share directory
724
725=cut
726
68ccb5e5 727=head1 NOTE
728
729The helpers will read author name from /etc/passwd by default.
730To override, please export the AUTHOR variable.
731
732=head1 SEE ALSO
733
734L<Catalyst::Manual>, L<Catalyst::Test>, L<Catalyst::Request>,
735L<Catalyst::Response>, L<Catalyst>
736
f64c718c 737=head1 AUTHORS
68ccb5e5 738
f64c718c 739Catalyst Contributors, see Catalyst.pm
68ccb5e5 740
741=head1 LICENSE
742
7cd3b67e 743This library is free software. You can redistribute it and/or modify
68ccb5e5 744it under the same terms as Perl itself.
745
746=cut
747
7481;
68ccb5e5 749