Fixed Catalyst::Utils::request
[catagits/Catalyst-Runtime.git] / lib / Module / Install / Catalyst.pm
CommitLineData
a2e038a1 1package Module::Install::Catalyst;
2
3use strict;
4use base 'Module::Install::Base';
5use File::Find;
6use FindBin;
7use File::Copy::Recursive 'rcopy';
8use File::Spec ();
9
10our @IGNORE =
11 qw/Build Build.PL Changes MANIFEST META.yml Makefile.PL Makefile README
12 _build blib lib script t inc/;
0427c6c0 13our @CLASSES = ();
a2e038a1 14our $ENGINE = 'CGI';
15our $CORE = 0;
16our $MULTIARCH = 0;
17
18=head1 NAME
19
20Module::Install::Catalyst - Module::Install extension for Catalyst
21
22=head1 SYNOPSIS
23
24See L<Catalyst>
25
26=head1 DESCRIPTION
27
28L<Module::Install> extension for Catalyst.
29
30=head1 METHODS
31
32=head2 catalyst_files
33
34=cut
35
36sub catalyst_files {
37 my $self = shift;
38
39 chdir $FindBin::Bin;
40
41 my @files;
42 opendir CATDIR, '.';
43 CATFILES: for my $name ( readdir CATDIR ) {
44 for my $ignore (@IGNORE) {
45 next CATFILES if $name =~ /^$ignore$/;
46 next CATFILES if $name !~ /\w/;
47 }
48 push @files, $name;
49 }
50 closedir CATDIR;
51 my @path = split '::', $self->name;
52 for my $orig (@files) {
53 my $path = File::Spec->catdir( 'blib', 'lib', @path, $orig );
54 rcopy( $orig, $path );
55 }
56}
57
58=head2 catalyst_ignore_all(\@ignore)
59
60=cut
61
62sub catalyst_ignore_all {
63 my ( $self, $ignore ) = @_;
64 @IGNORE = @$ignore;
65}
66
67=head2 catalyst_ignore(\@ignore)
68
69=cut
70
71sub catalyst_ignore {
72 my ( $self, @ignore ) = @_;
73 push @IGNORE, @ignore;
74}
75
76=head2 catalyst_par($name)
77
78=cut
79
f221c65f 80# Workaround for a namespace conflict
81sub catalyst_par { Catalyst::Module::Install::_catalyst_par(@_) }
82
83=head2 catalyst_par_core($core)
84
85=cut
86
87sub catalyst_par_core {
88 my ( $self, $core ) = @_;
89 $CORE = $core;
90}
91
0427c6c0 92=head2 catalyst_par_classes(@clases)
93
94=cut
95
96sub catalyst_par_classes {
97 my ( $self, @classes ) = @_;
98 push @CLASSES, @classes;
99}
100
f221c65f 101=head2 catalyst_par_engine($engine)
102
103=cut
104
105sub catalyst_par_engine {
106 my ( $self, $engine ) = @_;
107 $ENGINE = $engine;
108}
109
110=head2 catalyst_par_multiarch($multiarch)
111
112=cut
113
114sub catalyst_par_multiarch {
115 my ( $self, $multiarch ) = @_;
116 $MULTIARCH = $multiarch;
117}
118
119package Catalyst::Module::Install;
120
121use strict;
122use FindBin;
123use File::Copy::Recursive 'rmove';
124use File::Spec ();
125
126sub _catalyst_par {
a2e038a1 127 my ( $self, $par ) = @_;
128
f221c65f 129 my $name = $self->name;
130 $name =~ s/::/_/g;
131 $name = lc $name;
132 $par ||= "$name.par";
07ab88a9 133 my $engine = $Module::Install::Catalyst::ENGINE || 'CGI';
a2e038a1 134
135 # Check for PAR
136 eval "use PAR ()";
137 die "Please install PAR" if $@;
138 eval "use PAR::Packer ()";
139 die "Please install PAR::Packer" if $@;
140 eval "use App::Packer::PAR ()";
141 die "Please install App::Packer::PAR" if $@;
142 eval "use Module::ScanDeps ()";
143 die "Please install Module::ScanDeps" if $@;
144
145 my $root = $FindBin::Bin;
f221c65f 146 my $path = File::Spec->catfile( 'blib', 'lib', split( '::', $self->name ) );
147 $path .= '.pm';
07ab88a9 148 unless ( -f $path ) {
149 print qq/Not writing PAR, "$path" doesn't exist\n/;
150 return 0;
151 }
152 print qq/Writing PAR "$par"\n/;
a2e038a1 153 chdir File::Spec->catdir( $root, 'blib' );
154
155 my $par_pl = 'par.pl';
156 unlink $par_pl;
157
158 my $version = $Catalyst::VERSION;
159 my $class = $self->name;
160
0427c6c0 161 my $classes = '';
162 $classes .= "require $_;\n" for @Catalyst::Module::Install::CLASSES;
07ab88a9 163 my $tmp_file = IO::File->new(" > $par_pl ");
a2e038a1 164 print $tmp_file <<"EOF";
165die "$class on Catalyst $version\n" if \$0 !~ /par.pl\.\\w+\$/;
166BEGIN { \$ENV{CATALYST_ENGINE} = '$engine' };
f221c65f 167use lib "lib";
a2e038a1 168require $class;
169import $class;
170require Catalyst::Helper;
a2e038a1 171require Catalyst::Test;
172require Catalyst::Engine::HTTP;
173require Catalyst::Engine::CGI;
174require Catalyst::Controller;
175require Catalyst::Model;
176require Catalyst::View;
0427c6c0 177$classes
a2e038a1 178EOF
179 $tmp_file->close;
180
181 # Create package
182 local $SIG{__WARN__} = sub { };
183 open my $olderr, '>&STDERR';
184 open STDERR, '>', File::Spec->devnull;
185 my %opt = (
186 'x' => 1,
187 'n' => 0,
188 'o' => $par,
189 'a' => [ grep( !/par.pl/, glob '.' ) ],
190 'p' => 1,
07ab88a9 191 'B' => $Module::Install::Catalyst::CORE,
192 'm' => $Module::Install::Catalyst::MULTIARCH
a2e038a1 193 );
194 App::Packer::PAR->new(
195 frontend => 'Module::ScanDeps',
196 backend => 'PAR::Packer',
197 frontopts => \%opt,
198 backopts => \%opt,
199 args => ['par.pl'],
200 )->go;
f221c65f 201
a2e038a1 202 open STDERR, '>&', $olderr;
203
204 unlink $par_pl;
205 chdir $root;
f221c65f 206 rmove( File::Spec->catfile( 'blib', $par ), $par );
07ab88a9 207 return 1;
a2e038a1 208}
209
210=head1 AUTHOR
211
212Sebastian Riedel, C<sri@oook.de>
213
214=head1 LICENSE
215
216This library is free software, you can redistribute it and/or modify it under
217the same terms as Perl itself.
218
219=cut
220
2211;