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