committing progress
[catagits/Catalyst-Devel.git] / lib / Catalyst / Helper / AppGen.pm
1 package Catalyst::Helper::AppGen;
2
3 use Moose;
4 use namespace::autoclean;
5 use Moose::Util::TypeConstraints;
6 use MooseX::Types -declare [qw/ ValidAppName ValidAppComponent /];
7 use namespace::autoclean;
8
9 extends { 'Catalyst::Helper' };
10
11 my $appname_re = qr/[\w:]+/;
12 my $regex = qr/$appname_re::(M|V|C|Model|View|Controller)::.*/;
13
14 subtype ValidAppName, 
15    as Str,
16    where { /^$appname_re$/ && ! /$regex/ };
17
18 subtype ValidAppComponent,
19    as Str,
20    where { /^$regex$/ };
21    
22 subtype Dir,
23    as Str,
24    where { s/\:\:/-/g };
25
26 subtype AppEnv,
27    as Str,
28    where { /\w/ };
29    
30 coerce ValidAppName,
31    from ValidAppComponent,
32    via { Catalyst::Utils::class2appclass($_); },
33
34 coerce AppEnv,
35    from Str,
36    via { Catalyst::Utils::class2env($_) };   
37
38 has name => ( 
39     is => 'ro', 
40     isa => 'ValidAppName',
41     traits => [qw(Getopt)],
42     cmd_aliases => 'n',
43 );
44
45 has dir  => ( 
46     is => 'ro', 
47     isa => 'Dir',
48     traits => [qw(Getopt)],
49     cmd_aliases => 'dir', 
50
51 ); 
52
53 has script  => ( 
54     is => 'ro', 
55     isa => Str,
56     traits => [qw(NoGetopt)],
57 );
58
59 has app_prefix => (
60     is => 'ro',
61     isa => Str,
62     traits => [qw(NoGetopt)],
63 );
64
65 has app_env => (
66     is => 'ro',
67     isa => 'ValidAppEnv',
68     traits => [qw(NoGetopt)],
69 );
70
71
72
73 sub mk_app {
74     my ( $self, $name ) = @_;
75
76     # Needs to be here for PAR
77     require Catalyst;
78
79     if ( $name =~ /[^\w:]/ || $name =~ /^\d/ || $name =~ /\b:\b|:{3,}/) {
80         warn "Error: Invalid application name.\n";
81         return 0;
82     }
83     $self->{name            } = $name;
84     $self->{dir             } = $name;
85     $self->{dir             } =~ s/\:\:/-/g;
86     $self->{script          } = File::Spec->catdir( $self->{dir}, 'script' );
87     $self->{appprefix       } = Catalyst::Utils::appprefix($name);
88     $self->{appenv          } = Catalyst::Utils::class2env($name);
89     $self->{startperl       } = -r '/usr/bin/env'
90                                 ? '#!/usr/bin/env perl'
91                                 : "#!$Config{perlpath} -w";
92     $self->{scriptgen       } = $Catalyst::Devel::CATALYST_SCRIPT_GEN || 4;
93     $self->{catalyst_version} = $Catalyst::VERSION;
94     $self->{author          } = $self->{author} = $ENV{'AUTHOR'}
95       || eval { @{ [ getpwuid($<) ] }[6] }
96       || 'Catalyst developer';
97
98     my $gen_scripts  = ( $self->{makefile} ) ? 0 : 1;
99     my $gen_makefile = ( $self->{scripts} )  ? 0 : 1;
100     my $gen_app = ( $self->{scripts} || $self->{makefile} ) ? 0 : 1;
101
102     if ($gen_app) {
103         $self->_mk_dirs;
104         $self->_mk_config;
105         $self->_mk_appclass;
106         $self->_mk_rootclass;
107         $self->_mk_readme;
108         $self->_mk_changes;
109         $self->_mk_apptest;
110         $self->_mk_images;
111         $self->_mk_favicon;
112     }
113     if ($gen_makefile) {
114         $self->_mk_makefile;
115     }
116     if ($gen_scripts) {
117         $self->_mk_cgi;
118         $self->_mk_fastcgi;
119         $self->_mk_server;
120         $self->_mk_test;
121         $self->_mk_create;
122         $self->_mk_information;
123     }
124     return $self->{dir};
125 }
126
127
128
129 1;