Updated utils
[catagits/Catalyst-Runtime.git] / lib / Catalyst / Utils.pm
CommitLineData
f05af9ba 1package Catalyst::Utils;
2
3use strict;
4use attributes ();
812a28c9 5use Path::Class;
f05af9ba 6
7=head1 NAME
8
9Catalyst::Utils - The Catalyst Utils
10
11=head1 SYNOPSIS
12
13See L<Catalyst>.
14
15=head1 DESCRIPTION
16
17=head1 METHODS
18
19=over 4
20
21=item attrs($coderef)
22
23Returns attributes for coderef in a arrayref
24
25=cut
26
27sub attrs { attributes::get( $_[0] ) || [] }
28
84cf74e7 29=item class2appclass($class);
30
31Returns the appclass for class.
32
2d90477f 33 MyApp::C::Foo::Bar becomes MyApp
34 My::App::C::Foo::Bar becomes My::App
35
84cf74e7 36=cut
37
38sub class2appclass {
39 my $class = shift || '';
40 my $appname = '';
41 if ( $class =~ /^(.*)::([MVC]|Model|View|Controller)?::.*$/ ) {
42 $appname = $1;
43 }
44 return $appname;
45}
46
2930d610 47=item class2classprefix($class);
48
49Returns the classprefix for class.
50
2d90477f 51 MyApp::C::Foo::Bar becomes MyApp::C
52 My::App::C::Foo::Bar becomes My::App::C
53
2930d610 54=cut
55
56sub class2classprefix {
57 my $class = shift || '';
58 my $prefix;
59 if ( $class =~ /^(.*::[MVC]|Model|View|Controller)?::.*$/ ) {
60 $prefix = $1;
61 }
62 return $prefix;
63}
64
84cf74e7 65=item class2classsuffix($class);
66
67Returns the classsuffix for class.
68
2d90477f 69 MyApp::C::Foo::Bar becomes C::Foo::Bar
70
84cf74e7 71=cut
72
73sub class2classsuffix {
74 my $class = shift || '';
75 my $prefix = class2appclass($class) || '';
76 $class =~ s/$prefix\:\://;
77 return $class;
78}
79
f05af9ba 80=item class2prefix($class);
81
82Returns the prefix for class.
83
2d90477f 84 My::App::C::Foo::Bar becomes /foo/bar
85
f05af9ba 86=cut
87
88sub class2prefix {
89 my $class = shift || '';
90 my $prefix;
91 if ( $class =~ /^.*::([MVC]|Model|View|Controller)?::(.*)$/ ) {
92 $prefix = lc $2;
93 $prefix =~ s/\:\:/\//g;
94 }
95 return $prefix;
96}
97
812a28c9 98=item home($class)
99
100Returns home directory for given class.
101
102=cut
103
104sub home {
105 my $name = shift;
106 $name =~ s/\:\:/\//g;
107 my $home = 0;
108 if ( my $path = $INC{"$name.pm"} ) {
109 $home = file($path)->absolute->dir;
110 $name =~ /(\w+)$/;
111 my $append = $1;
112 my $subdir = dir($home)->subdir($append);
113 for ( split '/', $name ) { $home = dir($home)->parent }
114 if ( $home =~ /blib$/ ) { $home = dir($home)->parent }
51452916 115 elsif (!-f file( $home, 'Makefile.PL' )
116 && !-f file( $home, 'Build.PL' ) )
117 {
118 $home = $subdir;
119 }
812a28c9 120 }
121 return $home;
122}
123
124=item prefix($class, $name);
125
126Returns a prefixed action.
127
128 MyApp::C::Foo::Bar, yada becomes /foo/bar/yada
129
130=cut
131
132sub prefix {
133 my ( $class, $name ) = @_;
134 my $prefix = &class2prefix($class);
135 $name = "$prefix/$name" if $prefix;
136 return $name;
137}
138
139=item reflect_actions($class);
140
141Returns an arrayref containing all actions of a component class.
142
143=cut
144
145sub reflect_actions {
146 my $class = shift;
147 my $actions = [];
148 eval '$actions = $class->_action_cache';
149 die qq/Couldn't reflect actions of component "$class", "$@"/ if $@;
150 return $actions;
151}
152
f05af9ba 153=back
154
155=head1 AUTHOR
156
157Sebastian Riedel, C<sri@cpan.org>
158
159=head1 COPYRIGHT
160
161This program is free software, you can redistribute it and/or modify it under
162the same terms as Perl itself.
163
164=cut
165
1661;