X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FHelper.pm;h=a37c0c4f6f92afc6d17bf6881268b8549c20c734;hb=a73b39712fa4f12f8a2608b5f851f08c6a4ef47c;hp=d2867ba08316fb95b3a5741421c5e09a87341119;hpb=ec62787d5182e4619f3795742dfdc1694fe44d79;p=catagits%2FCatalyst-Devel.git diff --git a/lib/Catalyst/Helper.pm b/lib/Catalyst/Helper.pm index d2867ba..a37c0c4 100644 --- a/lib/Catalyst/Helper.pm +++ b/lib/Catalyst/Helper.pm @@ -63,25 +63,72 @@ sub get_file { } return 0; } - my $appname = subtype 'Str', - where { /[^\w:]/ or /^\d/ or /\b:\b|:{3,}/ }, - message { "Error: Invalid application name." }; + where { not (/[^\w:]/ or /^\d/ or /\b:\b|:{3,}/) }, + message { "Error: Invalid application name '$_'." }; -has name => ( is => 'ro', isa => $appname, required => 1 ); +has name => ( is => 'ro', isa => $appname, writer => '_set_name', lazy => 1, isa => 'Str', default => sub { confess("no name") } ); -foreach my $name (qw/ dir script appprefix author /) { +my @lazy_strs = qw/ dir appprefix author rootname /; +foreach my $name (@lazy_strs) { has $name => ( is => 'ro', isa => 'Str', init_arg => undef, lazy => 1, builder => "_build_$name" ); } +class_type 'Path::Class::Dir'; +my $coerced_dir = subtype 'Str', where { 1 }; +coerce $coerced_dir, from 'Path::Class::Dir', via { '' . $_ }; + +my @lazy_dirs = qw/ class base script /; +foreach my $name (@lazy_dirs) { + has $name => ( is => 'ro', isa => $coerced_dir, coerce => 1, init_arg => undef, lazy => 1, builder => "_build_$name" ); +} + +foreach my $wrap (qw/mk_app/) { + before $wrap => sub { + my $self = shift; + $self->$_ for @lazy_strs, @lazy_dirs; + }; +} + +sub _build_dir_locations { + my $self = shift; + my ($script, $lib, $root, $static, $mod); + return ( + script => do { $script = dir( $self->dir, 'script' ) }, + lib => do { $lib = dir( $self->dir, 'lib' ) }, + root => do { $root = dir( $self->dir, 'root' ) }, + static => do {$static = dir( $root, 'static' ) }, + images => dir( $static, 'images' ), + t => dir( $self->dir, 't' ), + mod => do { $mod = dir( $self->lib, $self->class ) }, + m => dir( $mod, 'Model' ), + v => dir( $mod, 'View' ), + c => dir( $mod, 'Controller' ), + ); +} + +sub _build_class { dir( split( /\:\:/, shift->name ) ) } + + + +sub _build_base { dir( shift->dir )->absolute } sub _build_dir { my $dir = shift->name; $dir =~ s/\:\:/-/g; return $dir; } -sub _build_script { dir( shift->dir, 'script' ) } sub _build_appprefix { Catalyst::Utils::appprefix(shift->name) } sub _build_author { - ENV{'AUTHOR'} + $ENV{'AUTHOR'} || eval { @{ [ getpwuid($<) ] }[6] } || 'Catalyst developer'; } +sub _build_rootname { shift->name . '::Controller::Root' } + +has _app_template_data => ( isa => 'HashRef', is => 'ro', lazy => 1, builder => '_build_app_template_data' ); +sub _build_app_template_data { + my $self = shift; + my %data = ( + $self->_build_dir_locations, + ); + return \%data; +} sub mk_app { my ( $self ) = @_; @@ -103,7 +150,7 @@ sub mk_app { for ( qw/ _mk_dirs _mk_config _mk_appclass _mk_rootclass _mk_readme _mk_changes _mk_apptest _mk_images _mk_favicon/ ) { - $self->$_; + $self->$_($self->_app_template_data); } } if ($gen_makefile) { @@ -113,7 +160,7 @@ sub mk_app { for ( qw/ _mk_cgi _mk_fastcgi _mk_server _mk_test _mk_create _mk_information / ) { - $self->$_; + $self->$_($self->_app_template_data); } } return $self->dir; @@ -228,6 +275,7 @@ sub mk_dir { sub mk_file { my ( $self, $file, $content ) = @_; + Carp::confess("No file") unless $file; if ( -e $file && -s _ ) { print qq/ exists "$file"\n/; return 0 @@ -307,40 +355,24 @@ sub _mk_information { print qq/Change to application directory and Run "perl Makefile.PL" to make sure your install is complete\n/; } -foreach my $name (qw/ lib root static images t class mod m v c rootname base /) { - has $name => ( is => 'ro', isa => 'Str', init_arg => undef, lazy => 1, builder => "_build_$name" ); -} - -sub _build_lib { dir( shift->dir, 'lib' ) } -sub _build_root { dir( shift->dir, 'lib' ) } -sub _build_static { dir( shift->dir, 'lib' ) } -sub _build_images { dir( shift->dir, 'lib' ) } -sub _build_t { dir( shift->dir, 'lib' ) } -sub _build_class { dir( split( /\:\:/, shift->name ) ) } -sub _build_mod { my $self = shift; dir( $self->lib, $self->class ) } -sub _build_m { dir( shift->mod, 'Model' ) } -sub _build_v { dir( shift->mod, 'View' ) } -sub _build_c { dir( shift->mod, 'Controller' ) } -sub _build_rootname { shift->name . '::Controller::Root' } -sub _build_base { dir( shift->dir )->absolute } - sub _mk_dirs { my $self = shift; - foreach my $name ( qw/ dir script lib root static images t mod m v c /) { - $self->mk_dir( $self->$name() ); + my @dirs = $self->_build_dir_locations; + while (my ($name, $location) = (shift(@dirs), shift(@dirs))) { + $self->mk_dir( $location ); } } sub _mk_appclass { my $self = shift; - my $mod = $self->{mod}; + my $mod = $self->mod; $self->render_sharedir_file( file('lib', 'MyApp.pm.tt'), "$mod.pm" ); } sub _mk_rootclass { my $self = shift; $self->render_sharedir_file( file('lib', 'MyApp', 'Controller', 'Root.pm.tt'), - file( $self->{c}, "Root.pm" ) ); + file( $self->c, "Root.pm" ) ); } sub _mk_makefile { @@ -385,7 +417,7 @@ sub _mk_apptest { sub _mk_cgi { my $self = shift; my $fn = file($self->script, $self->appprefix . "_cgi.pl"); - $self->render_sharedir_file( file('script', 'myapp_cgi.pl.tt') ); + $self->render_sharedir_file( file('script', 'myapp_cgi.pl.tt'), $fn ); chmod 0700, $fn; }