Fixed prereq bug
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Utils.pm
CommitLineData
f05af9ba 1package Catalyst::Utils;
2
3use strict;
4use attributes ();
a2f2cde9 5use Catalyst::Exception;
37a3ac5c 6use File::Spec;
d837e1a7 7use HTTP::Request;
812a28c9 8use Path::Class;
d837e1a7 9use URI;
f05af9ba 10
11=head1 NAME
12
13Catalyst::Utils - The Catalyst Utils
14
15=head1 SYNOPSIS
16
17See L<Catalyst>.
18
19=head1 DESCRIPTION
20
21=head1 METHODS
22
23=over 4
24
41ca9ba7 25=item appprefix($class)
26
27Returns the application prefix for the class
28
29=cut
30
31sub appprefix {
32 my $class = shift;
33 $class =~ s/\:\:/_/g;
34 $class = lc($class);
35 return $class;
36}
37
f05af9ba 38=item attrs($coderef)
39
40Returns attributes for coderef in a arrayref
41
42=cut
43
44sub attrs { attributes::get( $_[0] ) || [] }
45
84cf74e7 46=item class2appclass($class);
47
48Returns the appclass for class.
49
2d90477f 50 MyApp::C::Foo::Bar becomes MyApp
51 My::App::C::Foo::Bar becomes My::App
52
84cf74e7 53=cut
54
55sub class2appclass {
56 my $class = shift || '';
57 my $appname = '';
58 if ( $class =~ /^(.*)::([MVC]|Model|View|Controller)?::.*$/ ) {
59 $appname = $1;
60 }
61 return $appname;
62}
63
2930d610 64=item class2classprefix($class);
65
66Returns the classprefix for class.
67
2d90477f 68 MyApp::C::Foo::Bar becomes MyApp::C
69 My::App::C::Foo::Bar becomes My::App::C
70
2930d610 71=cut
72
73sub class2classprefix {
74 my $class = shift || '';
75 my $prefix;
76 if ( $class =~ /^(.*::[MVC]|Model|View|Controller)?::.*$/ ) {
77 $prefix = $1;
78 }
79 return $prefix;
80}
81
84cf74e7 82=item class2classsuffix($class);
83
84Returns the classsuffix for class.
85
2d90477f 86 MyApp::C::Foo::Bar becomes C::Foo::Bar
87
84cf74e7 88=cut
89
90sub class2classsuffix {
91 my $class = shift || '';
92 my $prefix = class2appclass($class) || '';
93 $class =~ s/$prefix\:\://;
94 return $class;
95}
96
3ad654e0 97=item class2env($class);
98
26e73131 99Returns the environment name for class.
3ad654e0 100
101 MyApp becomes MYAPP
102 My::App becomes MY_APP
103
104=cut
105
106sub class2env {
107 my $class = shift || '';
5d9a6d47 108 $class =~ s/\:\:/_/g;
3ad654e0 109 return uc($class);
110}
111
e494bd6b 112=item class2prefix( $class, $case );
f05af9ba 113
114Returns the prefix for class.
115
2d90477f 116 My::App::C::Foo::Bar becomes /foo/bar
117
f05af9ba 118=cut
119
120sub class2prefix {
121 my $class = shift || '';
e494bd6b 122 my $case = shift || 0;
f05af9ba 123 my $prefix;
124 if ( $class =~ /^.*::([MVC]|Model|View|Controller)?::(.*)$/ ) {
e494bd6b 125 $prefix = $case ? $2 : lc $2;
f05af9ba 126 $prefix =~ s/\:\:/\//g;
127 }
128 return $prefix;
129}
130
37a3ac5c 131=item class2tempdir( $class [, $create ] );
132
133Returns a tempdir for class. If create is true it will try to create the path.
134
135 My::App becomes /tmp/my/app
136 My::App::C::Foo::Bar becomes /tmp/my/app/c/foo/bar
137
138=cut
139
140sub class2tempdir {
141 my $class = shift || '';
142 my $create = shift || 0;
4be535b1 143 my @parts = split '::', lc $class;
37a3ac5c 144
145 my $tmpdir = dir( File::Spec->tmpdir, @parts )->cleanup;
146
4be535b1 147 if ( $create && !-e $tmpdir ) {
37a3ac5c 148
149 eval { $tmpdir->mkpath };
150
4be535b1 151 if ($@) {
37a3ac5c 152 Catalyst::Exception->throw(
4be535b1 153 message => qq/Couldn't create tmpdir '$tmpdir', "$@"/ );
37a3ac5c 154 }
155 }
156
157 return $tmpdir->stringify;
158}
159
812a28c9 160=item home($class)
161
162Returns home directory for given class.
163
164=cut
165
166sub home {
167 my $name = shift;
168 $name =~ s/\:\:/\//g;
169 my $home = 0;
170 if ( my $path = $INC{"$name.pm"} ) {
171 $home = file($path)->absolute->dir;
172 $name =~ /(\w+)$/;
173 my $append = $1;
174 my $subdir = dir($home)->subdir($append);
175 for ( split '/', $name ) { $home = dir($home)->parent }
176 if ( $home =~ /blib$/ ) { $home = dir($home)->parent }
51452916 177 elsif (!-f file( $home, 'Makefile.PL' )
178 && !-f file( $home, 'Build.PL' ) )
179 {
180 $home = $subdir;
181 }
4be535b1 182
62459712 183 # clean up relative path:
184 # MyApp/script/.. -> MyApp
185 my ($lastdir) = $home->dir_list( -1, 1 );
186 if ( $lastdir eq '..' ) {
187 $home = dir($home)->parent->parent;
188 }
812a28c9 189 }
190 return $home;
191}
192
193=item prefix($class, $name);
194
195Returns a prefixed action.
196
197 MyApp::C::Foo::Bar, yada becomes /foo/bar/yada
198
199=cut
200
201sub prefix {
202 my ( $class, $name ) = @_;
203 my $prefix = &class2prefix($class);
204 $name = "$prefix/$name" if $prefix;
205 return $name;
206}
207
208=item reflect_actions($class);
209
210Returns an arrayref containing all actions of a component class.
211
212=cut
213
214sub reflect_actions {
215 my $class = shift;
216 my $actions = [];
217 eval '$actions = $class->_action_cache';
4be535b1 218
219 if ($@) {
220 Catalyst::Exception->throw( message =>
221 qq/Couldn't reflect actions of component "$class", "$@"/ );
a2f2cde9 222 }
4be535b1 223
812a28c9 224 return $actions;
225}
226
4d60aa90 227=item request($request)
228
229Returns a HTTP::Request object.
230
231=cut
232
233sub request {
234 my $request = shift;
235 unless ( ref $request ) {
236 if ( $request =~ m/http/i ) {
237 $request = URI->new($request)->canonical;
238 }
239 else {
240 $request = URI->new( 'http://localhost' . $request )->canonical;
241 }
242 }
243 unless ( ref $request eq 'HTTP::Request' ) {
244 $request = HTTP::Request->new( 'GET', $request );
245 }
4d60aa90 246 return $request;
247}
248
d837e1a7 249=back
250
f05af9ba 251=head1 AUTHOR
252
253Sebastian Riedel, C<sri@cpan.org>
254
255=head1 COPYRIGHT
256
257This program is free software, you can redistribute it and/or modify it under
258the same terms as Perl itself.
259
260=cut
261
2621;