4341b4fbf1101d18f0dcb9bba818b7a1ce962d5f
[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 Dir AppEnv/];
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     # these die, horribly, today.
103     if ($gen_app) {
104         $self->_mk_dirs;
105         $self->_mk_config;
106         $self->_mk_appclass;
107         $self->_mk_rootclass;
108         $self->_mk_readme;
109         $self->_mk_changes;
110         $self->_mk_apptest;
111         $self->_mk_images;
112         $self->_mk_favicon;
113     }
114     
115     # and this
116     if ($gen_makefile) {
117         $self->_mk_makefile;
118     }
119     
120     # and this
121     if ($gen_scripts) {
122         $self->_mk_cgi;
123         $self->_mk_fastcgi;
124         $self->_mk_server;
125         $self->_mk_test;
126         $self->_mk_create;
127         $self->_mk_information;
128     }
129     return $self->{dir};
130 }
131
132
133
134 1;