Updated some core stuff, cleanups, better errors...
[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 }
115 elsif ( !-f file( $home, 'Makefile.PL' ) ) { $home = $subdir }
116 }
117 return $home;
118}
119
120=item prefix($class, $name);
121
122Returns a prefixed action.
123
124 MyApp::C::Foo::Bar, yada becomes /foo/bar/yada
125
126=cut
127
128sub prefix {
129 my ( $class, $name ) = @_;
130 my $prefix = &class2prefix($class);
131 $name = "$prefix/$name" if $prefix;
132 return $name;
133}
134
135=item reflect_actions($class);
136
137Returns an arrayref containing all actions of a component class.
138
139=cut
140
141sub reflect_actions {
142 my $class = shift;
143 my $actions = [];
144 eval '$actions = $class->_action_cache';
145 die qq/Couldn't reflect actions of component "$class", "$@"/ if $@;
146 return $actions;
147}
148
f05af9ba 149=back
150
151=head1 AUTHOR
152
153Sebastian Riedel, C<sri@cpan.org>
154
155=head1 COPYRIGHT
156
157This program is free software, you can redistribute it and/or modify it under
158the same terms as Perl itself.
159
160=cut
161
1621;