← Index
NYTProf Performance Profile   « block view • line view • sub view »
For /usr/bin/epoll_server.pl
  Run on Wed Jan 5 05:34:33 2011
Reported on Wed Jan 5 05:40:26 2011

File /usr/lib/perl5/vendor_perl/5.10.1/Catalyst.pm
Statements Executed 28205
Statement Execution Time 378ms
Subroutines — ordered by exclusive time
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
861206250ms394msCatalyst::::uri_forCatalyst::uri_for
51689238.6ms50.1msCatalyst::::CORE:substCatalyst::CORE:subst (opcode)
904211222.4ms37.5msCatalyst::::reqCatalyst::req
1119.08ms666msCatalyst::::BEGIN@16Catalyst::BEGIN@16
1116.77ms62.0msCatalyst::::BEGIN@15Catalyst::BEGIN@15
1114.24ms181msCatalyst::::BEGIN@12Catalyst::BEGIN@12
1114.13ms4.58msCatalyst::::BEGIN@26Catalyst::BEGIN@26
1113.58ms138msCatalyst::::BEGIN@14Catalyst::BEGIN@14
1113.53ms15.7msCatalyst::::BEGIN@19Catalyst::BEGIN@19
1112.92ms3.02msCatalyst::::BEGIN@20Catalyst::BEGIN@20
13112.67ms23.7msCatalyst::::_stats_start_executeCatalyst::_stats_start_execute
877122.56ms2.56msCatalyst::::CORE:regcompCatalyst::CORE:regcomp (opcode)
13112.50ms19.0sCatalyst::::executeCatalyst::execute
1112.42ms3.81sCatalyst::::setupCatalyst::setup
1112.09ms156msCatalyst::::BEGIN@13Catalyst::BEGIN@13
1111.97ms38.8msCatalyst::::BEGIN@11Catalyst::BEGIN@11
1111.51ms70.2msCatalyst::::prepareCatalyst::prepare
1111.44ms851msCatalyst::::BEGIN@8Catalyst::BEGIN@8
30221.32ms6.16msCatalyst::::prepare_bodyCatalyst::prepare_body
29211.26ms1.61msCatalyst::::_filter_componentCatalyst::_filter_component
1111.19ms1.38sCatalyst::::setup_componentsCatalyst::setup_components
6111.04ms59.3msCatalyst::::_register_pluginCatalyst::_register_plugin
111986µs16.4msCatalyst::::finalize_headersCatalyst::finalize_headers
111959µs2.95msCatalyst::::BEGIN@27Catalyst::BEGIN@27
1111885µs375msCatalyst::::setup_componentCatalyst::setup_component
1722845µs3.11msCatalyst::::componentCatalyst::component
1111833µs1.80msCatalyst::::_controller_init_base_classesCatalyst::_controller_init_base_classes
111801µs847msCatalyst::::setup_pluginsCatalyst::setup_plugins
111755µs84.3msCatalyst::::BEGIN@9Catalyst::BEGIN@9
111716µs253msCatalyst::::finalizeCatalyst::finalize
1063516µs19.0sCatalyst::::forwardCatalyst::forward
12107512µs2.12msCatalyst::::modelCatalyst::model
111414µs19.5sCatalyst::::handle_requestCatalyst::handle_request
111393µs41.9msCatalyst::::BEGIN@10Catalyst::BEGIN@10
111369µs44.1msCatalyst::::log_requestCatalyst::log_request
555326µs7.47msCatalyst::::path_toCatalyst::path_to
111290µs469msCatalyst::::setup_dispatcherCatalyst::setup_dispatcher
111283µs2.19msCatalyst::::log_request_parametersCatalyst::log_request_parameters
1311279µs437µsCatalyst::::depthCatalyst::depth
811275µs6.04msCatalyst::::_stats_finish_executeCatalyst::_stats_finish_execute
111262µs65.5msCatalyst::::setup_statsCatalyst::setup_stats
7472261µs261µsCatalyst::::CORE:matchCatalyst::CORE:match (opcode)
444234µs48.1msCatalyst::::importCatalyst::import
111218µs376µsCatalyst::::finalize_uploadsCatalyst::finalize_uploads
722191µs996µsCatalyst::::get_actionCatalyst::get_action
111178µs35.5msCatalyst::::locate_componentsCatalyst::locate_components
111175µs4.92msCatalyst::::setup_engineCatalyst::setup_engine
622174µs1.07msCatalyst::::CORE:ftdirCatalyst::CORE:ftdir (opcode)
111160µs247µsCatalyst::::registered_pluginsCatalyst::registered_plugins
221151µs33.9msCatalyst::::setup_homeCatalyst::setup_home
111134µs23.8msCatalyst::::__ANON__[:1189]Catalyst::__ANON__[:1189]
111124µs2.02msCatalyst::::setup_logCatalyst::setup_log
211120µs1.54msCatalyst::::dump_theseCatalyst::dump_these
543118µs173µsCatalyst::::resCatalyst::res
111118µs1.36msCatalyst::::prepare_parametersCatalyst::prepare_parameters
111107µs8.53msCatalyst::::log_responseCatalyst::log_response
111100µs1.71msCatalyst::::prepare_cookiesCatalyst::prepare_cookies
11194µs512msCatalyst::::setup_actionsCatalyst::setup_actions
33192µs1.12msCatalyst::::get_actionsCatalyst::get_actions
11176µs704µsCatalyst::::prepare_body_chunkCatalyst::prepare_body_chunk
11175µs185µsCatalyst::::setup_finalizeCatalyst::setup_finalize
11172µs1.03msCatalyst::::__ANON__[:42]Catalyst::__ANON__[:42]
55270µs70µsCatalyst::::errorCatalyst::error
11170µs626µsCatalyst::::__ANON__[:43]Catalyst::__ANON__[:43]
55260µs60µsCatalyst::::CORE:sortCatalyst::CORE:sort (opcode)
11159µs742µsCatalyst::::log_response_status_lineCatalyst::log_response_status_line
11159µs14.7msCatalyst::::BEGIN@3Catalyst::BEGIN@3
11154µs19.0sCatalyst::::dispatchCatalyst::dispatch
11150µs1.92msCatalyst::::finalize_cookiesCatalyst::finalize_cookies
11147µs58µsCatalyst::::BEGIN@28Catalyst::BEGIN@28
11146µs162msCatalyst::::finalize_bodyCatalyst::finalize_body
11146µs834µsCatalyst::::prepare_connectionCatalyst::prepare_connection
11145µs566µsCatalyst::::prepare_uploadsCatalyst::prepare_uploads
11145µs184µsCatalyst::::prepare_query_parametersCatalyst::prepare_query_parameters
11143µs43µsCatalyst::::BEGIN@21Catalyst::BEGIN@21
11141µs3.07msCatalyst::::prepare_headersCatalyst::prepare_headers
11141µs57µsCatalyst::::log_request_uploadsCatalyst::log_request_uploads
11140µs1.04msCatalyst::::BEGIN@6Catalyst::BEGIN@6
11140µs536µsCatalyst::::prepare_body_parametersCatalyst::prepare_body_parameters
11140µs142µsCatalyst::::prepare_requestCatalyst::prepare_request
11139µs3.42msCatalyst::::prepare_pathCatalyst::prepare_path
11136µs2.12msCatalyst::::prepare_actionCatalyst::prepare_action
11133µs33µsCatalyst::::BEGIN@34Catalyst::BEGIN@34
11132µs660µsCatalyst::::prepare_readCatalyst::prepare_read
11129µs132µsCatalyst::::BEGIN@18Catalyst::BEGIN@18
11125µs56µsCatalyst::::BEGIN@1135Catalyst::BEGIN@1135
11125µs54µsCatalyst::::BEGIN@1628Catalyst::BEGIN@1628
11124µs60µsCatalyst::::BEGIN@371Catalyst::BEGIN@371
11123µs99µsCatalyst::::BEGIN@30Catalyst::BEGIN@30
11121µs58µsCatalyst::::BEGIN@2793Catalyst::BEGIN@2793
11121µs245µsCatalyst::::BEGIN@3195Catalyst::BEGIN@3195
11120µs26µsCatalyst::::BEGIN@24Catalyst::BEGIN@24
11119µs84µsCatalyst::::BEGIN@29Catalyst::BEGIN@29
11119µs27µsCatalyst::::BEGIN@31Catalyst::BEGIN@31
11119µs19µsCatalyst::::BEGIN@4Catalyst::BEGIN@4
11119µs127µsCatalyst::::BEGIN@32Catalyst::BEGIN@32
11117µs17µsCatalyst::::BEGIN@7Catalyst::BEGIN@7
11116µs19µsCatalyst::::BEGIN@25Catalyst::BEGIN@25
11115µs32µsCatalyst::::BEGIN@1644Catalyst::BEGIN@1644
11114µs14µsCatalyst::::BEGIN@17Catalyst::BEGIN@17
11110µs10µsCatalyst::::__ANON__[:41]Catalyst::__ANON__[:41]
1119µs9µsCatalyst::::BEGIN@23Catalyst::BEGIN@23
1119µs9µsCatalyst::::BEGIN@22Catalyst::BEGIN@22
1118µs8µsCatalyst::::__ANON__[:36]Catalyst::__ANON__[:36]
1118µs8µsCatalyst::::__ANON__[:37]Catalyst::__ANON__[:37]
1116µs6µsCatalyst::::__ANON__[:1136]Catalyst::__ANON__[:1136]
1116µs6µsCatalyst::::log_request_headersCatalyst::log_request_headers
1113µs3µsCatalyst::::log_response_headersCatalyst::log_response_headers
0000s0sCatalyst::::__ANON__[:105]Catalyst::__ANON__[:105]
0000s0sCatalyst::::__ANON__[:2287]Catalyst::__ANON__[:2287]
0000s0sCatalyst::::__ANON__[:2577]Catalyst::__ANON__[:2577]
0000s0sCatalyst::::__ANON__[:2612]Catalyst::__ANON__[:2612]
0000s0sCatalyst::::__ANON__[:2615]Catalyst::__ANON__[:2615]
0000s0sCatalyst::::__ANON__[:2729]Catalyst::__ANON__[:2729]
0000s0sCatalyst::::__ANON__[:2753]Catalyst::__ANON__[:2753]
0000s0sCatalyst::::__ANON__[:474]Catalyst::__ANON__[:474]
0000s0sCatalyst::::__ANON__[:917]Catalyst::__ANON__[:917]
0000s0sCatalyst::::_applicationCatalyst::_application
0000s0sCatalyst::::_comp_namesCatalyst::_comp_names
0000s0sCatalyst::::_comp_names_search_prefixesCatalyst::_comp_names_search_prefixes
0000s0sCatalyst::::_comp_search_prefixesCatalyst::_comp_search_prefixes
0000s0sCatalyst::::clear_errorsCatalyst::clear_errors
0000s0sCatalyst::::compCatalyst::comp
0000s0sCatalyst::::controllerCatalyst::controller
0000s0sCatalyst::::controllersCatalyst::controllers
0000s0sCatalyst::::debugCatalyst::debug
0000s0sCatalyst::::detachCatalyst::detach
0000s0sCatalyst::::expand_component_moduleCatalyst::expand_component_module
0000s0sCatalyst::::finalize_errorCatalyst::finalize_error
0000s0sCatalyst::::finalize_outputCatalyst::finalize_output
0000s0sCatalyst::::finalize_readCatalyst::finalize_read
0000s0sCatalyst::::goCatalyst::go
0000s0sCatalyst::::log_headersCatalyst::log_headers
0000s0sCatalyst::::modelsCatalyst::models
0000s0sCatalyst::::pluginCatalyst::plugin
0000s0sCatalyst::::prepare_writeCatalyst::prepare_write
0000s0sCatalyst::::readCatalyst::read
0000s0sCatalyst::::runCatalyst::run
0000s0sCatalyst::::set_actionCatalyst::set_action
0000s0sCatalyst::::uri_for_actionCatalyst::uri_for_action
0000s0sCatalyst::::use_statsCatalyst::use_stats
0000s0sCatalyst::::versionCatalyst::version
0000s0sCatalyst::::viewCatalyst::view
0000s0sCatalyst::::viewsCatalyst::views
0000s0sCatalyst::::visitCatalyst::visit
0000s0sCatalyst::::welcome_messageCatalyst::welcome_message
0000s0sCatalyst::::writeCatalyst::write
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package Catalyst;
2
33119µs229.4ms
# spent 14.7ms (59µs+14.7) within Catalyst::BEGIN@3 which was called # once (59µs+14.7ms) by Epoll::BEGIN@17 at line 3
use Moose;
# spent 14.7ms making 1 call to Catalyst::BEGIN@3 # spent 14.7ms making 1 call to Moose::Exporter::__ANON__[Moose/Exporter.pm:389]
431.01ms119µs
# spent 19µs within Catalyst::BEGIN@4 which was called # once (19µs+0s) by Epoll::BEGIN@17 at line 4
use Moose::Meta::Class ();
# spent 19µs making 1 call to Catalyst::BEGIN@4
516µs1856µsextends 'Catalyst::Component';
# spent 856µs making 1 call to Moose::extends
63102µs22.05ms
# spent 1.04ms (40µs+1.00) within Catalyst::BEGIN@6 which was called # once (40µs+1.00ms) by Epoll::BEGIN@17 at line 6
use Moose::Util qw/find_meta/;
# spent 1.04ms making 1 call to Catalyst::BEGIN@6 # spent 1.00ms making 1 call to Sub::Exporter::__ANON__[Sub/Exporter.pm:756]
7374µs117µs
# spent 17µs within Catalyst::BEGIN@7 which was called # once (17µs+0s) by Epoll::BEGIN@17 at line 7
use B::Hooks::EndOfScope ();
# spent 17µs making 1 call to Catalyst::BEGIN@7
83520µs2851ms
# spent 851ms (1.44+849) within Catalyst::BEGIN@8 which was called # once (1.44ms+849ms) by Epoll::BEGIN@17 at line 8
use Catalyst::Exception;
# spent 851ms making 1 call to Catalyst::BEGIN@8 # spent 8µs making 1 call to UNIVERSAL::import
93375µs284.3ms
# spent 84.3ms (755µs+83.6) within Catalyst::BEGIN@9 which was called # once (755µs+83.6ms) by Epoll::BEGIN@17 at line 9
use Catalyst::Exception::Detach;
# spent 84.3ms making 1 call to Catalyst::BEGIN@9 # spent 4µs making 1 call to UNIVERSAL::import
103211µs241.9ms
# spent 41.9ms (393µs+41.5) within Catalyst::BEGIN@10 which was called # once (393µs+41.5ms) by Epoll::BEGIN@17 at line 10
use Catalyst::Exception::Go;
# spent 41.9ms making 1 call to Catalyst::BEGIN@10 # spent 4µs making 1 call to UNIVERSAL::import
113230µs238.8ms
# spent 38.8ms (1.97+36.8) within Catalyst::BEGIN@11 which was called # once (1.97ms+36.8ms) by Epoll::BEGIN@17 at line 11
use Catalyst::Log;
# spent 38.8ms making 1 call to Catalyst::BEGIN@11 # spent 4µs making 1 call to UNIVERSAL::import
123314µs2181ms
# spent 181ms (4.24+177) within Catalyst::BEGIN@12 which was called # once (4.24ms+177ms) by Epoll::BEGIN@17 at line 12
use Catalyst::Request;
# spent 181ms making 1 call to Catalyst::BEGIN@12 # spent 6µs making 1 call to UNIVERSAL::import
133512µs2156ms
# spent 156ms (2.09+154) within Catalyst::BEGIN@13 which was called # once (2.09ms+154ms) by Epoll::BEGIN@17 at line 13
use Catalyst::Request::Upload;
# spent 156ms making 1 call to Catalyst::BEGIN@13 # spent 8µs making 1 call to UNIVERSAL::import
143492µs2138ms
# spent 138ms (3.58+134) within Catalyst::BEGIN@14 which was called # once (3.58ms+134ms) by Epoll::BEGIN@17 at line 14
use Catalyst::Response;
# spent 138ms making 1 call to Catalyst::BEGIN@14 # spent 8µs making 1 call to UNIVERSAL::import
153823µs262.0ms
# spent 62.0ms (6.77+55.3) within Catalyst::BEGIN@15 which was called # once (6.77ms+55.3ms) by Epoll::BEGIN@17 at line 15
use Catalyst::Utils;
# spent 62.0ms making 1 call to Catalyst::BEGIN@15 # spent 9µs making 1 call to UNIVERSAL::import
163607µs2666ms
# spent 666ms (9.08+657) within Catalyst::BEGIN@16 which was called # once (9.08ms+657ms) by Epoll::BEGIN@17 at line 16
use Catalyst::Controller;
# spent 666ms making 1 call to Catalyst::BEGIN@16 # spent 4µs making 1 call to UNIVERSAL::import
17344µs114µs
# spent 14µs within Catalyst::BEGIN@17 which was called # once (14µs+0s) by Epoll::BEGIN@17 at line 17
use Devel::InnerPackage ();
# spent 14µs making 1 call to Catalyst::BEGIN@17
18343µs2140µs
# spent 132µs (29+102) within Catalyst::BEGIN@18 which was called # once (29µs+102µs) by Epoll::BEGIN@17 at line 18
use File::stat;
# spent 132µs making 1 call to Catalyst::BEGIN@18 # spent 8µs making 1 call to File::stat::import
193249µs115.7ms
# spent 15.7ms (3.53+12.2) within Catalyst::BEGIN@19 which was called # once (3.53ms+12.2ms) by Epoll::BEGIN@17 at line 19
use Module::Pluggable::Object ();
# spent 15.7ms making 1 call to Catalyst::BEGIN@19
203259µs13.02ms
# spent 3.02ms (2.92+94µs) within Catalyst::BEGIN@20 which was called # once (2.92ms+94µs) by Epoll::BEGIN@17 at line 20
use Text::SimpleTable ();
# spent 3.02ms making 1 call to Catalyst::BEGIN@20
21337µs143µs
# spent 43µs within Catalyst::BEGIN@21 which was called # once (43µs+0s) by Epoll::BEGIN@17 at line 21
use Path::Class::Dir ();
# spent 43µs making 1 call to Catalyst::BEGIN@21
22334µs19µs
# spent 9µs within Catalyst::BEGIN@22 which was called # once (9µs+0s) by Epoll::BEGIN@17 at line 22
use Path::Class::File ();
# spent 9µs making 1 call to Catalyst::BEGIN@22
23335µs19µs
# spent 9µs within Catalyst::BEGIN@23 which was called # once (9µs+0s) by Epoll::BEGIN@17 at line 23
use URI ();
# spent 9µs making 1 call to Catalyst::BEGIN@23
24344µs231µs
# spent 26µs (20+6) within Catalyst::BEGIN@24 which was called # once (20µs+6µs) by Epoll::BEGIN@17 at line 24
use URI::http;
# spent 26µs making 1 call to Catalyst::BEGIN@24 # spent 6µs making 1 call to UNIVERSAL::import
25342µs222µs
# spent 19µs (16+3) within Catalyst::BEGIN@25 which was called # once (16µs+3µs) by Epoll::BEGIN@17 at line 25
use URI::https;
# spent 19µs making 1 call to Catalyst::BEGIN@25 # spent 3µs making 1 call to UNIVERSAL::import
263299µs24.59ms
# spent 4.58ms (4.13+448µs) within Catalyst::BEGIN@26 which was called # once (4.13ms+448µs) by Epoll::BEGIN@17 at line 26
use Tree::Simple qw/use_weak_refs/;
# spent 4.58ms making 1 call to Catalyst::BEGIN@26 # spent 14µs making 1 call to Tree::Simple::import
273209µs22.96ms
# spent 2.95ms (959µs+1.99) within Catalyst::BEGIN@27 which was called # once (959µs+1.99ms) by Epoll::BEGIN@17 at line 27
use Tree::Simple::Visitor::FindByUID;
# spent 2.95ms making 1 call to Catalyst::BEGIN@27 # spent 5µs making 1 call to UNIVERSAL::import
28356µs269µs
# spent 58µs (47+11) within Catalyst::BEGIN@28 which was called # once (47µs+11µs) by Epoll::BEGIN@17 at line 28
use Class::C3::Adopt::NEXT;
# spent 58µs making 1 call to Catalyst::BEGIN@28 # spent 11µs making 1 call to Class::C3::Adopt::NEXT::import
29344µs2149µs
# spent 84µs (19+65) within Catalyst::BEGIN@29 which was called # once (19µs+65µs) by Epoll::BEGIN@17 at line 29
use List::MoreUtils qw/uniq/;
# spent 84µs making 1 call to Catalyst::BEGIN@29 # spent 65µs making 1 call to Exporter::import
30343µs2108µs
# spent 99µs (23+76) within Catalyst::BEGIN@30 which was called # once (23µs+76µs) by Epoll::BEGIN@17 at line 30
use attributes;
# spent 99µs making 1 call to Catalyst::BEGIN@30 # spent 9µs making 1 call to attributes::import
31350µs235µs
# spent 27µs (19+8) within Catalyst::BEGIN@31 which was called # once (19µs+8µs) by Epoll::BEGIN@17 at line 31
use utf8;
# spent 27µs making 1 call to Catalyst::BEGIN@31 # spent 8µs making 1 call to utf8::import
32347µs2235µs
# spent 127µs (19+108) within Catalyst::BEGIN@32 which was called # once (19µs+108µs) by Epoll::BEGIN@17 at line 32
use Carp qw/croak carp shortmess/;
# spent 127µs making 1 call to Catalyst::BEGIN@32 # spent 108µs making 1 call to Exporter::import
33
3411.23ms133µs
# spent 33µs within Catalyst::BEGIN@34 which was called # once (33µs+0s) by Epoll::BEGIN@17 at line 34
BEGIN { require 5.008004; }
# spent 33µs making 1 call to Catalyst::BEGIN@34
35
36223µs12.82ms
# spent 8µs within Catalyst::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/Catalyst.pm:36] which was called # once (8µs+0s) by Class::MOP::Mixin::AttributeCore::default at line 53 of Class/MOP/Mixin/AttributeCore.pm
has stack => (is => 'ro', default => sub { [] });
# spent 2.82ms making 1 call to Moose::has
37220µs13.10ms
# spent 8µs within Catalyst::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/Catalyst.pm:37] which was called # once (8µs+0s) by Class::MOP::Mixin::AttributeCore::default at line 53 of Class/MOP/Mixin/AttributeCore.pm
has stash => (is => 'rw', default => sub { {} });
# spent 3.10ms making 1 call to Moose::has
3814µs13.25mshas state => (is => 'rw', default => 0);
# spent 3.25ms making 1 call to Moose::has
3914µs12.67mshas stats => (is => 'rw');
# spent 2.67ms making 1 call to Moose::has
4014µs13.02mshas action => (is => 'rw');
# spent 3.02ms making 1 call to Moose::has
412195µs12.78ms
# spent 10µs within Catalyst::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/Catalyst.pm:41] which was called # once (10µs+0s) by Class::MOP::Mixin::AttributeCore::default at line 53 of Class/MOP/Mixin/AttributeCore.pm
has counter => (is => 'rw', default => sub { {} });
# spent 2.78ms making 1 call to Moose::has
42272µs34.56ms
# spent 1.03ms (72µs+958µs) within Catalyst::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/Catalyst.pm:42] which was called # once (72µs+958µs) by Class::MOP::Mixin::AttributeCore::default at line 53 of Class/MOP/Mixin/AttributeCore.pm
has request => (is => 'rw', default => sub { $_[0]->request_class->new({}) }, required => 1, lazy => 1);
# spent 3.61ms making 1 call to Moose::has # spent 650µs making 1 call to Catalyst::Request::new # spent 308µs making 1 call to Catalyst::_request_class_accessor
43271µs33.82ms
# spent 626µs (70+556) within Catalyst::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/Catalyst.pm:43] which was called # once (70µs+556µs) by Class::MOP::Mixin::AttributeCore::default at line 53 of Class/MOP/Mixin/AttributeCore.pm
has response => (is => 'rw', default => sub { $_[0]->response_class->new({}) }, required => 1, lazy => 1);
# spent 3.27ms making 1 call to Moose::has # spent 334µs making 1 call to Catalyst::Response::new # spent 222µs making 1 call to Catalyst::_response_class_accessor
4414µs13.14mshas namespace => (is => 'rw');
# spent 3.14ms making 1 call to Moose::has
45
4613302µs13158µs
# spent 437µs (279+158) within Catalyst::depth which was called 13 times, avg 34µs/call: # 13 times (279µs+158µs) by Catalyst::execute at line 1614, avg 34µs/call
sub depth { scalar @{ shift->stack || [] }; }
# spent 158µs making 13 calls to Catalyst::stack, avg 12µs/call
47sub comp { shift->component(@_) }
48
49
# spent 37.5ms (22.4+15.1) within Catalyst::req which was called 904 times, avg 42µs/call: # 861 times (21.4ms+14.7ms) by Catalyst::uri_for at line 1328, avg 42µs/call # 13 times (376µs+133µs) by Catalyst::execute at line 1629, avg 39µs/call # 6 times (76µs+47µs) by Epoll::View::Mail::render at line 31 of Epoll/View/Mail.pm, avg 20µs/call # 4 times (63µs+40µs) by Catalyst::View::TT::template_vars at line 274 of Catalyst/View/TT.pm, avg 26µs/call # 3 times (62µs+34µs) by Epoll::Controller::Admin::voters at line 199 of Epoll/Controller/Admin.pm, avg 32µs/call # 2 times (25µs+19µs) by Catalyst::dump_these at line 1592, avg 22µs/call # once (158µs+13µs) by Catalyst::Dispatcher::prepare_action at line 361 of Catalyst/Dispatcher.pm # once (39µs+15µs) by Epoll::Controller::Root::begin at line 33 of Epoll/Controller/Root.pm # once (31µs+21µs) by Catalyst::prepare at line 1983 # once (21µs+14µs) by Template::Stash::XS::get at line 2 of Epoll/root/templates/includes/locale_select_form.tt # once (21µs+10µs) by Catalyst::Engine::prepare_cookies at line 404 of Catalyst/Engine.pm # once (18µs+11µs) by Class::MOP::Class:::before at line 18 of Catalyst/Plugin/Static/Simple.pm # once (16µs+11µs) by Catalyst::prepare at line 1984 # once (17µs+10µs) by Catalyst::Controller::_ACTION at line 110 of Catalyst/Controller.pm # once (16µs+10µs) by Catalyst::prepare at line 1986 # once (16µs+10µs) by Epoll::Controller::Root::begin at line 34 of Epoll/Controller/Root.pm # once (16µs+10µs) by Catalyst::DispatchType::Regex::match at line 83 of Catalyst/DispatchType/Regex.pm # once (16µs+10µs) by Epoll::Controller::Admin::voters at line 186 of Epoll/Controller/Admin.pm # once (15µs+9µs) by Catalyst::DispatchType::Regex::match at line 84 of Catalyst/DispatchType/Regex.pm # once (15µs+10µs) by Catalyst::DispatchType::Index::match at line 46 of Catalyst/DispatchType/Index.pm # once (15µs+9µs) by Catalyst::DispatchType::Regex::match at line 85 of Catalyst/DispatchType/Regex.pm
sub req {
50180818.8ms90415.1ms my $self = shift; return $self->request(@_);
# spent 15.1ms making 904 calls to Catalyst::request, avg 17µs/call
51}
52
# spent 173µs (118+54) within Catalyst::res which was called 5 times, avg 35µs/call: # 2 times (63µs+20µs) by Catalyst::dump_these at line 1592, avg 41µs/call # once (19µs+13µs) by Epoll::Controller::Admin::end at line 377 of Epoll/Controller/Admin.pm # once (20µs+10µs) by Catalyst::prepare at line 1957 # once (17µs+12µs) by Class::MOP::Class:::around at line 67 of Catalyst/Plugin/Static/Simple.pm
sub res {
531086µs554µs my $self = shift; return $self->response(@_);
# spent 54µs making 5 calls to Catalyst::response, avg 11µs/call
54}
55
56# For backwards compatibility
57sub finalize_output { shift->finalize_body(@_) };
58
59# For statistics
6011µsour $COUNT = 1;
6112µsour $START = time;
621700nsour $RECURSION = 1000;
63111µs1169µsour $DETACH = Catalyst::Exception::Detach->new;
# spent 169µs making 1 call to Catalyst::Exception::Detach::new
6419µs1144µsour $GO = Catalyst::Exception::Go->new;
# spent 144µs making 1 call to Catalyst::Exception::Go::new
65
66#I imagine that very few of these really need to be class variables. if any.
67#maybe we should just make them attributes with a default?
68__PACKAGE__->mk_classdata($_)
69157µs122.77ms for qw/components arguments dispatcher engine log dispatcher_class
# spent 2.77ms making 12 calls to Catalyst::ClassData::mk_classdata, avg 231µs/call
70 engine_class context_class request_class response_class stats_class
711600ns setup_finished/;
72
7314µs167µs__PACKAGE__->dispatcher_class('Catalyst::Dispatcher');
# spent 67µs making 1 call to Catalyst::_dispatcher_class_accessor
7414µs186µs__PACKAGE__->engine_class('Catalyst::Engine::CGI');
# spent 86µs making 1 call to Catalyst::_engine_class_accessor
7514µs141µs__PACKAGE__->request_class('Catalyst::Request');
# spent 41µs making 1 call to Catalyst::_request_class_accessor
7614µs138µs__PACKAGE__->response_class('Catalyst::Response');
# spent 38µs making 1 call to Catalyst::_response_class_accessor
7713µs136µs__PACKAGE__->stats_class('Catalyst::Stats');
# spent 36µs making 1 call to Catalyst::_stats_class_accessor
78
79# Remember to update this in Catalyst::Runtime as well!
80
8111µsour $VERSION = '5.80022';
821900nsour $PRETTY_VERSION = $VERSION;
83
84145µs$VERSION = eval $VERSION;
85
86
# spent 48.1ms (234µs+47.9) within Catalyst::import which was called 4 times, avg 12.0ms/call: # once (185µs+47.9ms) by Epoll::BEGIN@17 at line 17 of Epoll.pm # once (21µs+0s) by Epoll::View::TT::BEGIN@5 at line 5 of Epoll/View/TT.pm # once (14µs+0s) by Epoll::View::Mail::BEGIN@6 at line 6 of Epoll/View/Mail.pm # once (13µs+0s) by Epoll::View::Ajax::BEGIN@7 at line 7 of Epoll/View/Ajax.pm
sub import {
87418µs my ( $class, @arguments ) = @_;
88
89 # We have to limit $class to Catalyst to avoid pushing Catalyst upon every
90 # callers @ISA.
91450µs return unless $class eq 'Catalyst';
92
9312µs my $caller = caller();
941700ns return if $caller eq 'main';
95
9614µs11.66ms my $meta = Moose::Meta::Class->initialize($caller);
# spent 1.66ms making 1 call to Moose::Meta::Class::initialize
97115µs13µs unless ( $caller->isa('Catalyst') ) {
# spent 3µs making 1 call to UNIVERSAL::isa
9815µs143µs my @superclasses = ($meta->superclasses, $class, 'Catalyst::Controller');
# spent 43µs making 1 call to Moose::Meta::Class::superclasses
9914µs114.9ms $meta->superclasses(@superclasses);
# spent 14.9ms making 1 call to Moose::Meta::Class::superclasses
100 }
101 # Avoid possible C3 issues if 'Moose::Object' is already on RHS of MyApp
102110µs21.11ms $meta->superclasses(grep { $_ ne 'Moose::Object' } $meta->superclasses);
# spent 1.11ms making 2 calls to Moose::Meta::Class::superclasses, avg 557µs/call
103
104129µs23.77ms unless( $meta->has_method('meta') ){
# spent 3.68ms making 1 call to Class::MOP::Mixin::HasMethods::add_method # spent 91µs making 1 call to Class::MOP::Mixin::HasMethods::has_method
105 $meta->add_method(meta => sub { Moose::Meta::Class->initialize("${caller}") } );
106 }
107
108129µs1103µs $caller->arguments( [@arguments] );
# spent 103µs making 1 call to Catalyst::_arguments_accessor
109128µs126.3ms $caller->setup_home;
# spent 26.3ms making 1 call to Catalyst::setup_home
110}
111
112sub _application { $_[0] }
113
114=head1 NAME
115
116Catalyst - The Elegant MVC Web Application Framework
117
118=head1 SYNOPSIS
119
120See the L<Catalyst::Manual> distribution for comprehensive
121documentation and tutorials.
122
123 # Install Catalyst::Devel for helpers and other development tools
124 # use the helper to create a new application
125 catalyst.pl MyApp
126
127 # add models, views, controllers
128 script/myapp_create.pl model MyDatabase DBIC::Schema create=static dbi:SQLite:/path/to/db
129 script/myapp_create.pl view MyTemplate TT
130 script/myapp_create.pl controller Search
131
132 # built in testserver -- use -r to restart automatically on changes
133 # --help to see all available options
134 script/myapp_server.pl
135
136 # command line testing interface
137 script/myapp_test.pl /yada
138
139 ### in lib/MyApp.pm
140 use Catalyst qw/-Debug/; # include plugins here as well
141
142 ### In lib/MyApp/Controller/Root.pm (autocreated)
143 sub foo : Global { # called for /foo, /foo/1, /foo/1/2, etc.
144 my ( $self, $c, @args ) = @_; # args are qw/1 2/ for /foo/1/2
145 $c->stash->{template} = 'foo.tt'; # set the template
146 # lookup something from db -- stash vars are passed to TT
147 $c->stash->{data} =
148 $c->model('Database::Foo')->search( { country => $args[0] } );
149 if ( $c->req->params->{bar} ) { # access GET or POST parameters
150 $c->forward( 'bar' ); # process another action
151 # do something else after forward returns
152 }
153 }
154
155 # The foo.tt TT template can use the stash data from the database
156 [% WHILE (item = data.next) %]
157 [% item.foo %]
158 [% END %]
159
160 # called for /bar/of/soap, /bar/of/soap/10, etc.
161 sub bar : Path('/bar/of/soap') { ... }
162
163 # called for all actions, from the top-most controller downwards
164 sub auto : Private {
165 my ( $self, $c ) = @_;
166 if ( !$c->user_exists ) { # Catalyst::Plugin::Authentication
167 $c->res->redirect( '/login' ); # require login
168 return 0; # abort request and go immediately to end()
169 }
170 return 1; # success; carry on to next action
171 }
172
173 # called after all actions are finished
174 sub end : Private {
175 my ( $self, $c ) = @_;
176 if ( scalar @{ $c->error } ) { ... } # handle errors
177 return if $c->res->body; # already have a response
178 $c->forward( 'MyApp::View::TT' ); # render template
179 }
180
181 ### in MyApp/Controller/Foo.pm
182 # called for /foo/bar
183 sub bar : Local { ... }
184
185 # called for /blargle
186 sub blargle : Global { ... }
187
188 # an index action matches /foo, but not /foo/1, etc.
189 sub index : Private { ... }
190
191 ### in MyApp/Controller/Foo/Bar.pm
192 # called for /foo/bar/baz
193 sub baz : Local { ... }
194
195 # first Root auto is called, then Foo auto, then this
196 sub auto : Private { ... }
197
198 # powerful regular expression paths are also possible
199 sub details : Regex('^product/(\w+)/details$') {
200 my ( $self, $c ) = @_;
201 # extract the (\w+) from the URI
202 my $product = $c->req->captures->[0];
203 }
204
205See L<Catalyst::Manual::Intro> for additional information.
206
207=head1 DESCRIPTION
208
209Catalyst is a modern framework for making web applications without the
210pain usually associated with this process. This document is a reference
211to the main Catalyst application. If you are a new user, we suggest you
212start with L<Catalyst::Manual::Tutorial> or L<Catalyst::Manual::Intro>.
213
214See L<Catalyst::Manual> for more documentation.
215
216Catalyst plugins can be loaded by naming them as arguments to the "use
217Catalyst" statement. Omit the C<Catalyst::Plugin::> prefix from the
218plugin name, i.e., C<Catalyst::Plugin::My::Module> becomes
219C<My::Module>.
220
221 use Catalyst qw/My::Module/;
222
223If your plugin starts with a name other than C<Catalyst::Plugin::>, you can
224fully qualify the name by using a unary plus:
225
226 use Catalyst qw/
227 My::Module
228 +Fully::Qualified::Plugin::Name
229 /;
230
231Special flags like C<-Debug> and C<-Engine> can also be specified as
232arguments when Catalyst is loaded:
233
234 use Catalyst qw/-Debug My::Module/;
235
236The position of plugins and flags in the chain is important, because
237they are loaded in the order in which they appear.
238
239The following flags are supported:
240
241=head2 -Debug
242
243Enables debug output. You can also force this setting from the system
244environment with CATALYST_DEBUG or <MYAPP>_DEBUG. The environment
245settings override the application, with <MYAPP>_DEBUG having the highest
246priority.
247
248This sets the log level to 'debug' and enables full debug output on the
249error screen. If you only want the latter, see L<< $c->debug >>.
250
251=head2 -Engine
252
253Forces Catalyst to use a specific engine. Omit the
254C<Catalyst::Engine::> prefix of the engine name, i.e.:
255
256 use Catalyst qw/-Engine=CGI/;
257
258=head2 -Home
259
260Forces Catalyst to use a specific home directory, e.g.:
261
262 use Catalyst qw[-Home=/usr/mst];
263
264This can also be done in the shell environment by setting either the
265C<CATALYST_HOME> environment variable or C<MYAPP_HOME>; where C<MYAPP>
266is replaced with the uppercased name of your application, any "::" in
267the name will be replaced with underscores, e.g. MyApp::Web should use
268MYAPP_WEB_HOME. If both variables are set, the MYAPP_HOME one will be used.
269
270If none of these are set, Catalyst will attempt to automatically detect the
271home directory. If you are working in a development envirnoment, Catalyst
272will try and find the directory containing either Makefile.PL, Build.PL or
273dist.ini. If the application has been installed into the system (i.e.
274you have done C<make install>), then Catalyst will use the path to your
275application module, without the .pm extension (ie, /foo/MyApp if your
276application was installed at /foo/MyApp.pm)
277
278=head2 -Log
279
280 use Catalyst '-Log=warn,fatal,error';
281
282Specifies a comma-delimited list of log levels.
283
284=head2 -Stats
285
286Enables statistics collection and reporting. You can also force this setting
287from the system environment with CATALYST_STATS or <MYAPP>_STATS. The
288environment settings override the application, with <MYAPP>_STATS having the
289highest priority.
290
291e.g.
292
293 use Catalyst qw/-Stats=1/
294
295=head1 METHODS
296
297=head2 INFORMATION ABOUT THE CURRENT REQUEST
298
299=head2 $c->action
300
301Returns a L<Catalyst::Action> object for the current action, which
302stringifies to the action name. See L<Catalyst::Action>.
303
304=head2 $c->namespace
305
306Returns the namespace of the current action, i.e., the URI prefix
307corresponding to the controller of the current action. For example:
308
309 # in Controller::Foo::Bar
310 $c->namespace; # returns 'foo/bar';
311
312=head2 $c->request
313
314=head2 $c->req
315
316Returns the current L<Catalyst::Request> object, giving access to
317information about the current client request (including parameters,
318cookies, HTTP headers, etc.). See L<Catalyst::Request>.
319
320=head2 REQUEST FLOW HANDLING
321
322=head2 $c->forward( $action [, \@arguments ] )
323
324=head2 $c->forward( $class, $method, [, \@arguments ] )
325
326Forwards processing to another action, by its private name. If you give a
327class name but no method, C<process()> is called. You may also optionally
328pass arguments in an arrayref. The action will receive the arguments in
329C<@_> and C<< $c->req->args >>. Upon returning from the function,
330C<< $c->req->args >> will be restored to the previous values.
331
332Any data C<return>ed from the action forwarded to, will be returned by the
333call to forward.
334
335 my $foodata = $c->forward('/foo');
336 $c->forward('index');
337 $c->forward(qw/Model::DBIC::Foo do_stuff/);
338 $c->forward('View::TT');
339
340Note that L<< forward|/"$c->forward( $action [, \@arguments ] )" >> implies
341an C<< eval { } >> around the call (actually
342L<< execute|/"$c->execute( $class, $coderef )" >> does), thus de-fatalizing
343all 'dies' within the called action. If you want C<die> to propagate you
344need to do something like:
345
346 $c->forward('foo');
347 die join "\n", @{ $c->error } if @{ $c->error };
348
349Or make sure to always return true values from your actions and write
350your code like this:
351
352 $c->forward('foo') || return;
353
354Another note is that C<< $c->forward >> always returns a scalar because it
355actually returns $c->state which operates in a scalar context.
356Thus, something like:
357
358 return @array;
359
360in an action that is forwarded to is going to return a scalar,
361i.e. how many items are in that array, which is probably not what you want.
362If you need to return an array then return a reference to it,
363or stash it like so:
364
365 $c->stash->{array} = \@array;
366
367and access it from the stash.
368
369=cut
370
371234.50ms2219.0s
# spent 60µs (24+36) within Catalyst::BEGIN@371 which was called # once (24µs+36µs) by Epoll::BEGIN@17 at line 371 # spent 19.0s (516µs+19.0) within Catalyst::forward which was called 10 times, avg 1.90s/call: # 3 times (134µs+-134µs) by Epoll::Controller::Admin::voters at line 210 of Epoll/Controller/Admin.pm, avg 0s/call # 3 times (256µs+-256µs) by Catalyst::Controller::_DISPATCH at line 84 of Catalyst/Controller.pm, avg 0s/call # once (31µs+19.0s) by Catalyst::Dispatcher::dispatch at line 105 of Catalyst/Dispatcher.pm # once (29µs+-29µs) by Epoll::Controller::Admin::end at line 380 of Epoll/Controller/Admin.pm # once (36µs+-36µs) by Epoll::Controller::Admin::voters at line 195 of Epoll/Controller/Admin.pm # once (29µs+-29µs) by Catalyst::Controller::_DISPATCH at line 87 of Catalyst/Controller.pm
sub forward { my $c = shift; no warnings 'recursion'; $c->dispatcher->forward( $c, @_ ) }
# spent 56.7s making 10 calls to Catalyst::Dispatcher::forward, avg 5.67s/call, recursion: max depth 2, time 37.7s # spent 1.20ms making 10 calls to Catalyst::_dispatcher_accessor, avg 120µs/call # spent 60µs making 1 call to Catalyst::BEGIN@371 # spent 36µs making 1 call to warnings::unimport
372
373=head2 $c->detach( $action [, \@arguments ] )
374
375=head2 $c->detach( $class, $method, [, \@arguments ] )
376
377=head2 $c->detach()
378
379The same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, but
380doesn't return to the previous action when processing is finished.
381
382When called with no arguments it escapes the processing chain entirely.
383
384=cut
385
386sub detach { my $c = shift; $c->dispatcher->detach( $c, @_ ) }
387
388=head2 $c->visit( $action [, \@captures, \@arguments ] )
389
390=head2 $c->visit( $class, $method, [, \@captures, \@arguments ] )
391
392Almost the same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>,
393but does a full dispatch, instead of just calling the new C<$action> /
394C<< $class->$method >>. This means that C<begin>, C<auto> and the method
395you go to are called, just like a new request.
396
397In addition both C<< $c->action >> and C<< $c->namespace >> are localized.
398This means, for example, that C<< $c->action >> methods such as
399L<name|Catalyst::Action/name>, L<class|Catalyst::Action/class> and
400L<reverse|Catalyst::Action/reverse> return information for the visited action
401when they are invoked within the visited action. This is different from the
402behavior of L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, which
403continues to use the $c->action object from the caller action even when
404invoked from the callee.
405
406C<< $c->stash >> is kept unchanged.
407
408In effect, L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >>
409allows you to "wrap" another action, just as it would have been called by
410dispatching from a URL, while the analogous
411L<< go|/"$c->go( $action [, \@captures, \@arguments ] )" >> allows you to
412transfer control to another action as if it had been reached directly from a URL.
413
414=cut
415
416sub visit { my $c = shift; $c->dispatcher->visit( $c, @_ ) }
417
418=head2 $c->go( $action [, \@captures, \@arguments ] )
419
420=head2 $c->go( $class, $method, [, \@captures, \@arguments ] )
421
422The relationship between C<go> and
423L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >> is the same as
424the relationship between
425L<< forward|/"$c->forward( $class, $method, [, \@arguments ] )" >> and
426L<< detach|/"$c->detach( $action [, \@arguments ] )" >>. Like C<< $c->visit >>,
427C<< $c->go >> will perform a full dispatch on the specified action or method,
428with localized C<< $c->action >> and C<< $c->namespace >>. Like C<detach>,
429C<go> escapes the processing of the current request chain on completion, and
430does not return to its caller.
431
432=cut
433
434sub go { my $c = shift; $c->dispatcher->go( $c, @_ ) }
435
436=head2 $c->response
437
438=head2 $c->res
439
440Returns the current L<Catalyst::Response> object, see there for details.
441
442=head2 $c->stash
443
444Returns a hashref to the stash, which may be used to store data and pass
445it between components during a request. You can also set hash keys by
446passing arguments. The stash is automatically sent to the view. The
447stash is cleared at the end of a request; it cannot be used for
448persistent storage (for this you must use a session; see
449L<Catalyst::Plugin::Session> for a complete system integrated with
450Catalyst).
451
452 $c->stash->{foo} = $bar;
453 $c->stash( { moose => 'majestic', qux => 0 } );
454 $c->stash( bar => 1, gorch => 2 ); # equivalent to passing a hashref
455
456 # stash is automatically passed to the view for use in a template
457 $c->forward( 'MyApp::View::TT' );
458
459=cut
460
461around stash => sub {
4621379µs my $orig = shift;
4631321µs my $c = shift;
46413221µs13118µs my $stash = $orig->($c);
# spent 118µs making 13 calls to Catalyst::stash, avg 9µs/call
4651321µs if (@_) {
466 my $new_stash = @_ > 1 ? {@_} : $_[0];
467 croak('stash takes a hash or hashref') unless ref $new_stash;
468 foreach my $key ( keys %$new_stash ) {
469 $stash->{$key} = $new_stash->{$key};
470 }
471 }
472
47313422µs return $stash;
474112µs1816µs};
# spent 816µs making 1 call to Moose::around
475
476
477=head2 $c->error
478
479=head2 $c->error($error, ...)
480
481=head2 $c->error($arrayref)
482
483Returns an arrayref containing error messages. If Catalyst encounters an
484error while processing a request, it stores the error in $c->error. This
485method should only be used to store fatal error messages.
486
487 my @error = @{ $c->error };
488
489Add a new error.
490
491 $c->error('Something bad happened');
492
493=cut
494
495
# spent 70µs within Catalyst::error which was called 5 times, avg 14µs/call: # once (16µs+0s) by Catalyst::Controller::_BEGIN at line 95 of Catalyst/Controller.pm # once (15µs+0s) by Catalyst::Controller::_ACTION at line 116 of Catalyst/Controller.pm # once (14µs+0s) by Catalyst::Controller::_END at line 124 of Catalyst/Controller.pm # once (13µs+0s) by Catalyst::finalize at line 1748 # once (12µs+0s) by Catalyst::finalize at line 1734
sub error {
496511µs my $c = shift;
497512µs if ( $_[0] ) {
498 my $error = ref $_[0] eq 'ARRAY' ? $_[0] : [@_];
499 croak @$error unless ref $c;
500 push @{ $c->{error} }, @$error;
501 }
502 elsif ( defined $_[0] ) { $c->{error} = undef }
5035380µs return $c->{error} || [];
504}
505
506
507=head2 $c->state
508
509Contains the return value of the last executed action.
510Note that << $c->state >> operates in a scalar context which means that all
511values it returns are scalar.
512
513=head2 $c->clear_errors
514
515Clear errors. You probably don't want to clear the errors unless you are
516implementing a custom error screen.
517
518This is equivalent to running
519
520 $c->error(0);
521
522=cut
523
524sub clear_errors {
525 my $c = shift;
526 $c->error(0);
527}
528
529sub _comp_search_prefixes {
530 my $c = shift;
531 return map $c->components->{ $_ }, $c->_comp_names_search_prefixes(@_);
532}
533
534# search components given a name and some prefixes
535sub _comp_names_search_prefixes {
536 my ( $c, $name, @prefixes ) = @_;
537 my $appclass = ref $c || $c;
538 my $filter = "^${appclass}::(" . join( '|', @prefixes ) . ')::';
539 $filter = qr/$filter/; # Compile regex now rather than once per loop
540
541 # map the original component name to the sub part that we will search against
542 my %eligible = map { my $n = $_; $n =~ s{^$appclass\::[^:]+::}{}; $_ => $n; }
543 grep { /$filter/ } keys %{ $c->components };
544
545 # undef for a name will return all
546 return keys %eligible if !defined $name;
547
548 my $query = ref $name ? $name : qr/^$name$/i;
549 my @result = grep { $eligible{$_} =~ m{$query} } keys %eligible;
550
551 return @result if @result;
552
553 # if we were given a regexp to search against, we're done.
554 return if ref $name;
555
556 # skip regexp fallback if configured
557 return
558 if $appclass->config->{disable_component_resolution_regex_fallback};
559
560 # regexp fallback
561 $query = qr/$name/i;
562 @result = grep { $eligible{ $_ } =~ m{$query} } keys %eligible;
563
564 # no results? try against full names
565 if( !@result ) {
566 @result = grep { m{$query} } keys %eligible;
567 }
568
569 # don't warn if we didn't find any results, it just might not exist
570 if( @result ) {
571 # Disgusting hack to work out correct method name
572 my $warn_for = lc $prefixes[0];
573 my $msg = "Used regexp fallback for \$c->${warn_for}('${name}'), which found '" .
574 (join '", "', @result) . "'. Relying on regexp fallback behavior for " .
575 "component resolution is unreliable and unsafe.";
576 my $short = $result[0];
577 # remove the component namespace prefix
578 $short =~ s/.*?(Model|Controller|View):://;
579 my $shortmess = Carp::shortmess('');
580 if ($shortmess =~ m#Catalyst/Plugin#) {
581 $msg .= " You probably need to set '$short' instead of '${name}' in this " .
582 "plugin's config";
583 } elsif ($shortmess =~ m#Catalyst/lib/(View|Controller)#) {
584 $msg .= " You probably need to set '$short' instead of '${name}' in this " .
585 "component's config";
586 } else {
587 $msg .= " You probably meant \$c->${warn_for}('$short') instead of \$c->${warn_for}('${name}'), " .
588 "but if you really wanted to search, pass in a regexp as the argument " .
589 "like so: \$c->${warn_for}(qr/${name}/)";
590 }
591 $c->log->warn( "${msg}$shortmess" );
592 }
593
594 return @result;
595}
596
597# Find possible names for a prefix
598sub _comp_names {
599 my ( $c, @prefixes ) = @_;
600 my $appclass = ref $c || $c;
601
602 my $filter = "^${appclass}::(" . join( '|', @prefixes ) . ')::';
603
604 my @names = map { s{$filter}{}; $_; }
605 $c->_comp_names_search_prefixes( undef, @prefixes );
606
607 return @names;
608}
609
610# Filter a component before returning by calling ACCEPT_CONTEXT if available
611
# spent 1.61ms (1.26+352µs) within Catalyst::_filter_component which was called 29 times, avg 56µs/call: # 17 times (759µs+216µs) by Catalyst::component at line 836, avg 57µs/call # 12 times (500µs+137µs) by Catalyst::model at line 686, avg 53µs/call
sub _filter_component {
61229114µs my ( $c, $comp, @args ) = @_;
613
614581.11ms29352µs if ( eval { $comp->can('ACCEPT_CONTEXT'); } ) {
# spent 352µs making 29 calls to UNIVERSAL::can, avg 12µs/call
615 return $comp->ACCEPT_CONTEXT( $c, @args );
616 }
617
61829309µs return $comp;
619}
620
621=head2 COMPONENT ACCESSORS
622
623=head2 $c->controller($name)
624
625Gets a L<Catalyst::Controller> instance by name.
626
627 $c->controller('Foo')->do_stuff;
628
629If the name is omitted, will return the controller for the dispatched
630action.
631
632If you want to search for controllers, pass in a regexp as the argument.
633
634 # find all controllers that start with Foo
635 my @foo_controllers = $c->controller(qr{^Foo});
636
637
638=cut
639
640sub controller {
641 my ( $c, $name, @args ) = @_;
642
643 my $appclass = ref($c) || $c;
644 if( $name ) {
645 unless ( ref($name) ) { # Direct component hash lookup to avoid costly regexps
646 my $comps = $c->components;
647 my $check = $appclass."::Controller::".$name;
648 return $c->_filter_component( $comps->{$check}, @args ) if exists $comps->{$check};
649 }
650 my @result = $c->_comp_search_prefixes( $name, qw/Controller C/ );
651 return map { $c->_filter_component( $_, @args ) } @result if ref $name;
652 return $c->_filter_component( $result[ 0 ], @args );
653 }
654
655 return $c->component( $c->action->class );
656}
657
658=head2 $c->model($name)
659
660Gets a L<Catalyst::Model> instance by name.
661
662 $c->model('Foo')->do_stuff;
663
664Any extra arguments are directly passed to ACCEPT_CONTEXT.
665
666If the name is omitted, it will look for
667 - a model object in $c->stash->{current_model_instance}, then
668 - a model name in $c->stash->{current_model}, then
669 - a config setting 'default_model', or
670 - check if there is only one model, and return it if that's the case.
671
672If you want to search for models, pass in a regexp as the argument.
673
674 # find all models that start with Foo
675 my @foo_models = $c->model(qr{^Foo});
676
677=cut
678
679
# spent 2.12ms (512µs+1.60) within Catalyst::model which was called 12 times, avg 176µs/call: # 3 times (114µs+429µs) by Template::Stash::XS::get at line 1 of Epoll/root/mail/voting_passwd.tt, avg 181µs/call # once (42µs+298µs) by Epoll::Controller::Admin::voters at line 188 of Epoll/Controller/Admin.pm # once (63µs+181µs) by Epoll::Controller::Root::begin at line 31 of Epoll/Controller/Root.pm # once (45µs+172µs) by Epoll::Controller::Admin::end at line 381 of Epoll/Controller/Admin.pm # once (100µs+115µs) by Template::Stash::XS::get at line 10 of Epoll/root/templates/includes/footer.tt # once (46µs+145µs) by Template::Stash::XS::get at line 2 of Epoll/root/templates/includes/admin_menu.tt # once (39µs+92µs) by Epoll::Controller::Admin::auth at line 152 of Epoll/Controller/Admin.pm # once (22µs+63µs) by Template::Stash::XS::get at line 45 of Epoll/root/templates/includes/header.tt # once (22µs+62µs) by Template::Stash::XS::get at line 30 of Epoll/root/templates/includes/header.tt # once (20µs+49µs) by Template::Stash::XS::get at line 2 of Epoll/root/templates/admin/voters.tt
sub model {
6801238µs my ( $c, $name, @args ) = @_;
6811224µs my $appclass = ref($c) || $c;
6821218µs if( $name ) {
6831215µs unless ( ref($name) ) { # Direct component hash lookup to avoid costly regexps
6841299µs12968µs my $comps = $c->components;
# spent 968µs making 12 calls to Catalyst::_components_accessor, avg 81µs/call
6851234µs my $check = $appclass."::Model::".$name;
68612247µs12637µs return $c->_filter_component( $comps->{$check}, @args ) if exists $comps->{$check};
# spent 637µs making 12 calls to Catalyst::_filter_component, avg 53µs/call
687 }
688 my @result = $c->_comp_search_prefixes( $name, qw/Model M/ );
689 return map { $c->_filter_component( $_, @args ) } @result if ref $name;
690 return $c->_filter_component( $result[ 0 ], @args );
691 }
692
693 if (ref $c) {
694 return $c->stash->{current_model_instance}
695 if $c->stash->{current_model_instance};
696 return $c->model( $c->stash->{current_model} )
697 if $c->stash->{current_model};
698 }
699 return $c->model( $appclass->config->{default_model} )
700 if $appclass->config->{default_model};
701
702 my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/Model M/);
703
704 if( $rest ) {
705 $c->log->warn( Carp::shortmess('Calling $c->model() will return a random model unless you specify one of:') );
706 $c->log->warn( '* $c->config(default_model => "the name of the default model to use")' );
707 $c->log->warn( '* $c->stash->{current_model} # the name of the model to use for this request' );
708 $c->log->warn( '* $c->stash->{current_model_instance} # the instance of the model to use for this request' );
709 $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' );
710 }
711
712 return $c->_filter_component( $comp );
713}
714
715
716=head2 $c->view($name)
717
718Gets a L<Catalyst::View> instance by name.
719
720 $c->view('Foo')->do_stuff;
721
722Any extra arguments are directly passed to ACCEPT_CONTEXT.
723
724If the name is omitted, it will look for
725 - a view object in $c->stash->{current_view_instance}, then
726 - a view name in $c->stash->{current_view}, then
727 - a config setting 'default_view', or
728 - check if there is only one view, and return it if that's the case.
729
730If you want to search for views, pass in a regexp as the argument.
731
732 # find all views that start with Foo
733 my @foo_views = $c->view(qr{^Foo});
734
735=cut
736
737sub view {
738 my ( $c, $name, @args ) = @_;
739
740 my $appclass = ref($c) || $c;
741 if( $name ) {
742 unless ( ref($name) ) { # Direct component hash lookup to avoid costly regexps
743 my $comps = $c->components;
744 my $check = $appclass."::View::".$name;
745 return $c->_filter_component( $comps->{$check}, @args ) if exists $comps->{$check};
746 }
747 my @result = $c->_comp_search_prefixes( $name, qw/View V/ );
748 return map { $c->_filter_component( $_, @args ) } @result if ref $name;
749 return $c->_filter_component( $result[ 0 ], @args );
750 }
751
752 if (ref $c) {
753 return $c->stash->{current_view_instance}
754 if $c->stash->{current_view_instance};
755 return $c->view( $c->stash->{current_view} )
756 if $c->stash->{current_view};
757 }
758 return $c->view( $appclass->config->{default_view} )
759 if $appclass->config->{default_view};
760
761 my( $comp, $rest ) = $c->_comp_search_prefixes( undef, qw/View V/);
762
763 if( $rest ) {
764 $c->log->warn( 'Calling $c->view() will return a random view unless you specify one of:' );
765 $c->log->warn( '* $c->config(default_view => "the name of the default view to use")' );
766 $c->log->warn( '* $c->stash->{current_view} # the name of the view to use for this request' );
767 $c->log->warn( '* $c->stash->{current_view_instance} # the instance of the view to use for this request' );
768 $c->log->warn( 'NB: in version 5.81, the "random" behavior will not work at all.' );
769 }
770
771 return $c->_filter_component( $comp );
772}
773
774=head2 $c->controllers
775
776Returns the available names which can be passed to $c->controller
777
778=cut
779
780sub controllers {
781 my ( $c ) = @_;
782 return $c->_comp_names(qw/Controller C/);
783}
784
785=head2 $c->models
786
787Returns the available names which can be passed to $c->model
788
789=cut
790
791sub models {
792 my ( $c ) = @_;
793 return $c->_comp_names(qw/Model M/);
794}
795
796
797=head2 $c->views
798
799Returns the available names which can be passed to $c->view
800
801=cut
802
803sub views {
804 my ( $c ) = @_;
805 return $c->_comp_names(qw/View V/);
806}
807
808=head2 $c->comp($name)
809
810=head2 $c->component($name)
811
812Gets a component object by name. This method is not recommended,
813unless you want to get a specific component by full
814class. C<< $c->controller >>, C<< $c->model >>, and C<< $c->view >>
815should be used instead.
816
817If C<$name> is a regexp, a list of components matched against the full
818component name will be returned.
819
820If Catalyst can't find a component by name, it will fallback to regex
821matching by default. To disable this behaviour set
822disable_component_resolution_regex_fallback to a true value.
823
824 __PACKAGE__->config( disable_component_resolution_regex_fallback => 1 );
825
826=cut
827
828
# spent 3.11ms (845µs+2.26) within Catalyst::component which was called 17 times, avg 183µs/call: # 13 times (684µs+1.74ms) by Catalyst::execute at line 1611, avg 186µs/call # 4 times (161µs+527µs) by Catalyst::Dispatcher::_find_component at line 314 of Catalyst/Dispatcher.pm, avg 172µs/call
sub component {
82917209µs my ( $c, $name, @args ) = @_;
830
8311727µs if( $name ) {
83217132µs171.29ms my $comps = $c->components;
# spent 1.29ms making 17 calls to Catalyst::_components_accessor, avg 76µs/call
833
8341732µs if( !ref $name ) {
835 # is it the exact name?
83617530µs17975µs return $c->_filter_component( $comps->{ $name }, @args )
# spent 975µs making 17 calls to Catalyst::_filter_component, avg 57µs/call
837 if exists $comps->{ $name };
838
839 # perhaps we just omitted "MyApp"?
840 my $composed = ( ref $c || $c ) . "::${name}";
841 return $c->_filter_component( $comps->{ $composed }, @args )
842 if exists $comps->{ $composed };
843
844 # search all of the models, views and controllers
845 my( $comp ) = $c->_comp_search_prefixes( $name, qw/Model M Controller C View V/ );
846 return $c->_filter_component( $comp, @args ) if $comp;
847 }
848
849 # This is here so $c->comp( '::M::' ) works
850 my $query = ref $name ? $name : qr{$name}i;
851
852 my @result = grep { m{$query} } keys %{ $c->components };
853 return map { $c->_filter_component( $_, @args ) } @result if ref $name;
854
855 if( $result[ 0 ] ) {
856 $c->log->warn( Carp::shortmess(qq(Found results for "${name}" using regexp fallback)) );
857 $c->log->warn( 'Relying on the regexp fallback behavior for component resolution' );
858 $c->log->warn( 'is unreliable and unsafe. You have been warned' );
859 return $c->_filter_component( $result[ 0 ], @args );
860 }
861
862 # I would expect to return an empty list here, but that breaks back-compat
863 }
864
865 # fallback
866 return sort keys %{ $c->components };
867}
868
869=head2 CLASS DATA AND HELPER CLASSES
870
871=head2 $c->config
872
873Returns or takes a hashref containing the application's configuration.
874
875 __PACKAGE__->config( { db => 'dsn:SQLite:foo.db' } );
876
877You can also use a C<YAML>, C<XML> or L<Config::General> config file
878like C<myapp.conf> in your applications home directory. See
879L<Catalyst::Plugin::ConfigLoader>.
880
881=head3 Cascading configuration
882
883The config method is present on all Catalyst components, and configuration
884will be merged when an application is started. Configuration loaded with
885L<Catalyst::Plugin::ConfigLoader> takes precedence over other configuration,
886followed by configuration in your top level C<MyApp> class. These two
887configurations are merged, and then configuration data whose hash key matches a
888component name is merged with configuration for that component.
889
890The configuration for a component is then passed to the C<new> method when a
891component is constructed.
892
893For example:
894
895 MyApp->config({ 'Model::Foo' => { bar => 'baz', overrides => 'me' } });
896 MyApp::Model::Foo->config({ quux => 'frob', 'overrides => 'this' });
897
898will mean that C<MyApp::Model::Foo> receives the following data when
899constructed:
900
901 MyApp::Model::Foo->new({
902 bar => 'baz',
903 quux => 'frob',
904 overrides => 'me',
905 });
906
907=cut
908
909around config => sub {
910154285µs my $orig = shift;
911154259µs my $c = shift;
912
913154329µs3634µs croak('Setting config after setup has been run is not allowed.')
# spent 634µs making 3 calls to Catalyst::_setup_finished_accessor, avg 211µs/call
914 if ( @_ and $c->setup_finished );
915
9161542.45ms15456.7ms $c->$orig(@_);
# spent 56.7ms making 154 calls to Catalyst::Component::config, avg 368µs/call
91718µs1953µs};
# spent 953µs making 1 call to Moose::around
918
919=head2 $c->log
920
921Returns the logging object instance. Unless it is already set, Catalyst
922sets this up with a L<Catalyst::Log> object. To use your own log class,
923set the logger with the C<< __PACKAGE__->log >> method prior to calling
924C<< __PACKAGE__->setup >>.
925
926 __PACKAGE__->log( MyLogger->new );
927 __PACKAGE__->setup;
928
929And later:
930
931 $c->log->info( 'Now logging with my own logger!' );
932
933Your log class should implement the methods described in
934L<Catalyst::Log>.
935
936
937=head2 $c->debug
938
939Returns 1 if debug mode is enabled, 0 otherwise.
940
941You can enable debug mode in several ways:
942
943=over
944
945=item By calling myapp_server.pl with the -d flag
946
947=item With the environment variables MYAPP_DEBUG, or CATALYST_DEBUG
948
949=item The -Debug option in your MyApp.pm
950
951=item By declaring C<sub debug { 1 }> in your MyApp.pm.
952
953=back
954
955The first three also set the log level to 'debug'.
956
957Calling C<< $c->debug(1) >> has no effect.
958
959=cut
960
961sub debug { 0 }
962
963=head2 $c->dispatcher
964
965Returns the dispatcher instance. See L<Catalyst::Dispatcher>.
966
967=head2 $c->engine
968
969Returns the engine instance. See L<Catalyst::Engine>.
970
971
972=head2 UTILITY METHODS
973
974=head2 $c->path_to(@path)
975
976Merges C<@path> with C<< $c->config->{home} >> and returns a
977L<Path::Class::Dir> object. Note you can usually use this object as
978a filename, but sometimes you will have to explicitly stringify it
979yourself by calling the C<< ->stringify >> method.
980
981For example:
982
983 $c->path_to( 'db', 'sqlite.db' );
984
985=cut
986
987
# spent 7.47ms (326µs+7.14) within Catalyst::path_to which was called 5 times, avg 1.49ms/call: # once (99µs+1.98ms) by main::RUNTIME at line 40 of Epoll.pm # once (70µs+1.50ms) by Catalyst::Utils::ensure_class_loaded at line 9 of Epoll/View/Mail.pm # once (55µs+1.34ms) by Catalyst::Utils::ensure_class_loaded at line 8 of Epoll/View/TT.pm # once (59µs+1.33ms) by Catalyst::Utils::ensure_class_loaded at line 16 of Epoll/View/Latex.pm # once (42µs+1.00ms) by Catalyst::Utils::ensure_class_loaded at line 9 of Epoll/View/Ajax.pm
sub path_to {
988533µs my ( $c, @path ) = @_;
9895205µs105.02ms my $path = Path::Class::Dir->new( $c->config->{home}, @path );
# spent 2.87ms making 5 calls to Path::Class::Dir::new, avg 575µs/call # spent 2.14ms making 5 calls to Catalyst::config, avg 428µs/call
9905242µs101.94ms if ( -d $path ) { return $path }
# spent 1.05ms making 5 calls to Catalyst::CORE:ftdir, avg 210µs/call # spent 893µs making 5 calls to Path::Class::Dir::stringify, avg 179µs/call
991130µs21.08ms else { return Path::Class::File->new( $c->config->{home}, @path ) }
# spent 678µs making 1 call to Path::Class::File::new # spent 398µs making 1 call to Catalyst::config
992}
993
994=head2 $c->plugin( $name, $class, @args )
995
996Helper method for plugins. It creates a class data accessor/mutator and
997loads and instantiates the given class.
998
999 MyApp->plugin( 'prototype', 'HTML::Prototype' );
1000
1001 $c->prototype->define_javascript_functions;
1002
1003B<Note:> This method of adding plugins is deprecated. The ability
1004to add plugins like this B<will be removed> in a Catalyst 5.81.
1005Please do not use this functionality in new code.
1006
1007=cut
1008
1009sub plugin {
1010 my ( $class, $name, $plugin, @args ) = @_;
1011
1012 # See block comment in t/unit_core_plugin.t
1013 $class->log->warn(qq/Adding plugin using the ->plugin method is deprecated, and will be removed in Catalyst 5.81/);
1014
1015 $class->_register_plugin( $plugin, 1 );
1016
1017 eval { $plugin->import };
1018 $class->mk_classdata($name);
1019 my $obj;
1020 eval { $obj = $plugin->new(@args) };
1021
1022 if ($@) {
1023 Catalyst::Exception->throw( message =>
1024 qq/Couldn't instantiate instant plugin "$plugin", "$@"/ );
1025 }
1026
1027 $class->$name($obj);
1028 $class->log->debug(qq/Initialized instant plugin "$plugin" as "$name"/)
1029 if $class->debug;
1030}
1031
1032=head2 MyApp->setup
1033
1034Initializes the dispatcher and engine, loads any plugins, and loads the
1035model, view, and controller components. You may also specify an array
1036of plugins to load here, if you choose to not load them in the C<use
1037Catalyst> line.
1038
1039 MyApp->setup;
1040 MyApp->setup( qw/-Debug/ );
1041
1042=cut
1043
1044
# spent 3.81s (2.42ms+3.81) within Catalyst::setup which was called # once (2.42ms+3.81s) by main::RUNTIME at line 61 of Epoll.pm
sub setup {
104512µs my ( $class, @arguments ) = @_;
104614µs170µs croak('Running setup more than once')
# spent 70µs making 1 call to Catalyst::_setup_finished_accessor
1047 if ( $class->setup_finished );
1048
1049110µs13µs unless ( $class->isa('Catalyst') ) {
# spent 3µs making 1 call to UNIVERSAL::isa
1050
1051 Catalyst::Exception->throw(
1052 message => qq/'$class' does not inherit from Catalyst/ );
1053 }
1054
1055115µs256µs if ( $class->arguments ) {
# spent 56µs making 2 calls to Catalyst::_arguments_accessor, avg 28µs/call
1056 @arguments = ( @arguments, @{ $class->arguments } );
1057 }
1058
1059 # Process options
106011µs my $flags = {};
1061
106213µs foreach (@arguments) {
1063
1064760µs1412µs if (/^-Debug$/) {
# spent 12µs making 14 calls to Catalyst::CORE:match, avg 829ns/call
1065 $flags->{log} =
1066 ( $flags->{log} ) ? 'debug,' . $flags->{log} : 'debug';
1067 }
1068 elsif (/^-(\w+)=?(.*)$/) {
1069 $flags->{ lc $1 } = $2;
1070 }
1071 else {
1072714µs push @{ $flags->{plugins} }, $_;
1073 }
1074 }
1075
107616µs17.63ms $class->setup_home( delete $flags->{home} );
# spent 7.63ms making 1 call to Catalyst::setup_home
1077
1078111µs12.02ms $class->setup_log( delete $flags->{log} );
# spent 2.02ms making 1 call to Catalyst::setup_log
1079120µs1847ms $class->setup_plugins( delete $flags->{plugins} );
# spent 847ms making 1 call to Catalyst::setup_plugins
1080148µs1469ms $class->setup_dispatcher( delete $flags->{dispatcher} );
# spent 469ms making 1 call to Catalyst::setup_dispatcher
1081155µs14.92ms $class->setup_engine( delete $flags->{engine} );
# spent 4.92ms making 1 call to Catalyst::setup_engine
1082142µs165.5ms $class->setup_stats( delete $flags->{stats} );
# spent 65.5ms making 1 call to Catalyst::setup_stats
1083
1084127µs15µs for my $flag ( sort keys %{$flags} ) {
# spent 5µs making 1 call to Catalyst::CORE:sort
1085
1086 if ( my $code = $class->can( 'setup_' . $flag ) ) {
1087 &$code( $class, delete $flags->{$flag} );
1088 }
1089 else {
1090 $class->log->warn(qq/Unknown flag "$flag"/);
1091 }
1092 }
1093
10942255µs eval { require Catalyst::Devel; };
1095128µs2178µs if( !$@ && $ENV{CATALYST_SCRIPT_GEN} && ( $ENV{CATALYST_SCRIPT_GEN} < $Catalyst::Devel::CATALYST_SCRIPT_GEN ) ) {
# spent 113µs making 1 call to Catalyst::Log::warn # spent 65µs making 1 call to Catalyst::_log_accessor
1096 $class->log->warn(<<"EOF");
1097You are running an old script!
1098
1099 Please update by running (this will overwrite existing files):
1100 catalyst.pl -force -scripts $class
1101
1102 or (this will not overwrite existing files):
1103 catalyst.pl -scripts $class
1104
1105EOF
1106 }
1107
1108111µs16µs if ( $class->debug ) {
# spent 6µs making 1 call to Epoll::debug
11097545µs7514µs my @plugins = map { "$_ " . ( $_->VERSION || '' ) } $class->registered_plugins;
# spent 266µs making 6 calls to UNIVERSAL::VERSION, avg 44µs/call # spent 247µs making 1 call to Catalyst::registered_plugins
1110
111115µs if (@plugins) {
1112110µs11.57ms my $column_width = Catalyst::Utils::term_width() - 6;
# spent 1.57ms making 1 call to Catalyst::Utils::term_width
1113112µs183µs my $t = Text::SimpleTable->new($column_width);
# spent 83µs making 1 call to Text::SimpleTable::new
1114259µs6733µs $t->row($_) for @plugins;
# spent 733µs making 6 calls to Text::SimpleTable::row, avg 122µs/call
1115135µs3513µs $class->log->debug( "Loaded plugins:\n" . $t->draw . "\n" );
# spent 326µs making 1 call to Text::SimpleTable::draw # spent 121µs making 1 call to Catalyst::Log::debug # spent 65µs making 1 call to Catalyst::_log_accessor
1116 }
1117
1118111µs171µs my $dispatcher = $class->dispatcher;
# spent 71µs making 1 call to Catalyst::_dispatcher_accessor
111919µs160µs my $engine = $class->engine;
# spent 60µs making 1 call to Catalyst::_engine_accessor
1120144µs1500µs my $home = $class->config->{home};
# spent 500µs making 1 call to Catalyst::config
1121
1122177µs3245µs $class->log->debug(sprintf(q/Loaded dispatcher "%s"/, blessed($dispatcher)));
# spent 183µs making 1 call to Catalyst::Log::debug # spent 56µs making 1 call to Catalyst::_log_accessor # spent 7µs making 1 call to Scalar::Util::blessed
1123133µs3397µs $class->log->debug(sprintf(q/Loaded engine "%s"/, blessed($engine)));
# spent 332µs making 1 call to Catalyst::Log::debug # spent 59µs making 1 call to Catalyst::_log_accessor # spent 6µs making 1 call to Scalar::Util::blessed
1124
1125148µs3174µs $home
# spent 98µs making 1 call to Catalyst::Log::debug # spent 60µs making 1 call to Catalyst::_log_accessor # spent 16µs making 1 call to Catalyst::CORE:ftdir
1126 ? ( -d $home )
1127 ? $class->log->debug(qq/Found home "$home"/)
1128 : $class->log->debug(qq/Home "$home" doesn't exist/)
1129 : $class->log->debug(q/Couldn't find home/);
1130 }
1131
1132 # Call plugins setup, this is stupid and evil.
1133 # Also screws C3 badly on 5.10, hack to avoid.
1134 {
113543.74ms286µs
# spent 56µs (25+31) within Catalyst::BEGIN@1135 which was called # once (25µs+31µs) by Epoll::BEGIN@17 at line 1135
no warnings qw/redefine/;
# spent 56µs making 1 call to Catalyst::BEGIN@1135 # spent 31µs making 1 call to warnings::unimport
1136230µs
# spent 6µs within Catalyst::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/Catalyst.pm:1136] which was called # once (6µs+0s) by Catalyst::Plugin::I18N::setup at line 28 of mro.pm
local *setup = sub { };
1137126µs1309ms $class->setup unless $Catalyst::__AM_RESTARTING;
# spent 309ms making 1 call to Catalyst::Plugin::ConfigLoader::setup
1138 }
1139
1140 # Initialize our data structure
1141140µs188µs $class->components( {} );
# spent 88µs making 1 call to Catalyst::_components_accessor
1142
1143136µs11.38s $class->setup_components;
# spent 1.38s making 1 call to Catalyst::setup_components
1144
114517µs14µs if ( $class->debug ) {
# spent 4µs making 1 call to Epoll::debug
114616µs14µs my $column_width = Catalyst::Utils::term_width() - 8 - 9;
# spent 4µs making 1 call to Catalyst::Utils::term_width
1147112µs1120µs my $t = Text::SimpleTable->new( [ $column_width, 'Class' ], [ 8, 'Type' ] );
# spent 120µs making 1 call to Text::SimpleTable::new
1148121µs235µs for my $comp ( sort keys %{ $class->components } ) {
# spent 28µs making 1 call to Catalyst::_components_accessor # spent 8µs making 1 call to Catalyst::CORE:sort
11491156µs11363µs my $type = ref $class->components->{$comp} ? 'instance' : 'class';
# spent 363µs making 11 calls to Catalyst::_components_accessor, avg 33µs/call
11501150µs111.10ms $t->row( $comp, $type );
# spent 1.10ms making 11 calls to Text::SimpleTable::row, avg 100µs/call
1151 }
1152 $class->log->debug( "Loaded components:\n" . $t->draw . "\n" )
1153177µs4577µs if ( keys %{ $class->components } );
# spent 368µs making 1 call to Text::SimpleTable::draw # spent 124µs making 1 call to Catalyst::Log::debug # spent 58µs making 1 call to Catalyst::_components_accessor # spent 28µs making 1 call to Catalyst::_log_accessor
1154 }
1155
1156 # Add our self to components, since we are also a component
1157115µs231µs if( $class->isa('Catalyst::Controller') ){
# spent 28µs making 1 call to Catalyst::_components_accessor # spent 4µs making 1 call to UNIVERSAL::isa
1158 $class->components->{$class} = $class;
1159 }
1160
1161121µs1512ms $class->setup_actions;
# spent 512ms making 1 call to Catalyst::setup_actions
1162
1163114µs18µs if ( $class->debug ) {
# spent 8µs making 1 call to Epoll::debug
1164114µs1354µs my $name = $class->config->{name} || 'Application';
# spent 354µs making 1 call to Catalyst::config
1165122µs2462µs $class->log->info("$name powered by Catalyst $Catalyst::PRETTY_VERSION");
# spent 403µs making 1 call to Catalyst::Log::info # spent 59µs making 1 call to Catalyst::_log_accessor
1166 }
1167
1168 # Make sure that the application class becomes immutable at this point,
1169
# spent 23.8ms (134µs+23.7) within Catalyst::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/Catalyst.pm:1189] which was called # once (134µs+23.7ms) by B::Hooks::EndOfScope::__ANON__[/usr/lib/perl5/vendor_perl/5.10.0/B/Hooks/EndOfScope.pm:47] at line 47 of B/Hooks/EndOfScope.pm
B::Hooks::EndOfScope::on_scope_end {
117012µs return if $@;
117117µs16µs my $meta = Class::MOP::get_metaclass_by_name($class);
# spent 6µs making 1 call to Class::MOP::get_metaclass_by_name
1172124µs16µs if (
# spent 6µs making 1 call to Class::MOP::Class::is_immutable
1173 $meta->is_immutable
1174 && ! { $meta->immutable_options }->{replace_constructor}
1175 && (
1176 $class->isa('Class::Accessor::Fast')
1177 || $class->isa('Class::Accessor')
1178 )
1179 ) {
1180 warn "You made your application class ($class) immutable, "
1181 . "but did not inline the\nconstructor. "
1182 . "This will break catalyst, as your app \@ISA "
1183 . "Class::Accessor(::Fast)?\nPlease pass "
1184 . "(replace_constructor => 1)\nwhen making your class immutable.\n";
1185 }
1186 $meta->make_immutable(
1187187µs223.6ms replace_constructor => 1,
# spent 23.6ms making 1 call to Class::MOP::Class::make_immutable # spent 5µs making 1 call to Class::MOP::Class::is_immutable
1188 ) unless $meta->is_immutable;
11891137µs1128µs };
# spent 128µs making 1 call to B::Hooks::EndOfScope::on_scope_end
1190
1191111µs1378µs if ($class->config->{case_sensitive}) {
# spent 378µs making 1 call to Catalyst::config
1192 $class->log->warn($class . "->config->{case_sensitive} is set.");
1193 $class->log->warn("This setting is deprecated and planned to be removed in Catalyst 5.81.");
1194 }
1195
1196110µs1202ms $class->setup_finalize;
# spent 202ms making 1 call to Epoll::setup_finalize
1197 # Should be the last thing we do so that user things hooking
1198 # setup_finalize can log..
1199151µs4941µs $class->log->_flush() if $class->log->can('_flush');
# spent 760µs making 1 call to Catalyst::Log::_flush # spent 175µs making 2 calls to Catalyst::_log_accessor, avg 88µs/call # spent 6µs making 1 call to UNIVERSAL::can
1200121µs return 1; # Explicit return true as people have __PACKAGE__->setup as the last thing in their class. HATE.
1201}
1202
1203=head2 $app->setup_finalize
1204
1205A hook to attach modifiers to. This method does not do anything except set the
1206C<setup_finished> accessor.
1207
1208Applying method modifiers to the C<setup> method doesn't work, because of quirky thingsdone for plugin setup.
1209
1210Example:
1211
1212 after setup_finalize => sub {
1213 my $app = shift;
1214
1215 ## do stuff here..
1216 };
1217
1218=cut
1219
1220
# spent 185µs (75+110) within Catalyst::setup_finalize which was called # once (75µs+110µs) by Class::MOP::Method::Wrapped::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/i386-linux-thread-multi/Class/MOP/Method/Wrapped.pm:49] at line 48 of Class/MOP/Method/Wrapped.pm
sub setup_finalize {
122113µs my ($class) = @_;
1222171µs1110µs $class->setup_finished(1);
# spent 110µs making 1 call to Catalyst::_setup_finished_accessor
1223}
1224
1225=head2 $c->uri_for( $path?, @args?, \%query_values? )
1226
1227=head2 $c->uri_for( $action, \@captures?, @args?, \%query_values? )
1228
1229Constructs an absolute L<URI> object based on the application root, the
1230provided path, and the additional arguments and query parameters provided.
1231When used as a string, provides a textual URI.
1232
1233If no arguments are provided, the URI for the current action is returned.
1234To return the current action and also provide @args, use
1235C<< $c->uri_for( $c->action, @args ) >>.
1236
1237If the first argument is a string, it is taken as a public URI path relative
1238to C<< $c->namespace >> (if it doesn't begin with a forward slash) or
1239relative to the application root (if it does). It is then merged with
1240C<< $c->request->base >>; any C<@args> are appended as additional path
1241components; and any C<%query_values> are appended as C<?foo=bar> parameters.
1242
1243If the first argument is a L<Catalyst::Action> it represents an action which
1244will have its path resolved using C<< $c->dispatcher->uri_for_action >>. The
1245optional C<\@captures> argument (an arrayref) allows passing the captured
1246variables that are needed to fill in the paths of Chained and Regex actions;
1247once the path is resolved, C<uri_for> continues as though a path was
1248provided, appending any arguments or parameters and creating an absolute
1249URI.
1250
1251The captures for the current request can be found in
1252C<< $c->request->captures >>, and actions can be resolved using
1253C<< Catalyst::Controller->action_for($name) >>. If you have a private action
1254path, use C<< $c->uri_for_action >> instead.
1255
1256 # Equivalent to $c->req->uri
1257 $c->uri_for($c->action, $c->req->captures,
1258 @{ $c->req->args }, $c->req->params);
1259
1260 # For the Foo action in the Bar controller
1261 $c->uri_for($c->controller('Bar')->action_for('Foo'));
1262
1263 # Path to a static resource
1264 $c->uri_for('/static/images/logo.png');
1265
1266=cut
1267
1268
# spent 394ms (250+144) within Catalyst::uri_for which was called 861 times, avg 457µs/call: # 836 times (243ms+140ms) by Template::Stash::XS::get at line 69 of Epoll/root/templates/admin/voters.tt, avg 459µs/call # 4 times (928µs+558µs) by Template::Stash::XS::get at line 10 of Epoll/root/templates/includes/header.tt, avg 372µs/call # 3 times (517µs+295µs) by Template::Stash::XS::get at line 7 of Epoll/root/mail/voting_passwd.tt, avg 271µs/call # 2 times (664µs+281µs) by Template::Stash::XS::get at line 16 of Epoll/root/templates/includes/header.tt, avg 472µs/call # once (686µs+307µs) by Template::Stash::XS::get at line 24 of Epoll/root/templates/admin/voters.tt # once (408µs+332µs) by Template::Stash::XS::get at line 5 of Epoll/root/templates/includes/admin_menu.tt # once (433µs+284µs) by Template::Stash::XS::get at line 33 of Epoll/root/templates/admin/voters.tt # once (520µs+130µs) by Template::Stash::XS::get at line 7 of Epoll/root/templates/includes/header.tt # once (352µs+181µs) by Template::Stash::XS::get at line 11 of Epoll/root/templates/includes/admin_menu.tt # once (277µs+191µs) by Template::Stash::XS::get at line 7 of Epoll/root/templates/includes/admin_menu.tt # once (296µs+129µs) by Template::Stash::XS::get at line 9 of Epoll/root/templates/admin/voters.tt # once (315µs+107µs) by Template::Stash::XS::get at line 14 of Epoll/root/templates/includes/header.tt # once (215µs+186µs) by Template::Stash::XS::get at line 19 of Epoll/root/templates/includes/admin_menu.tt # once (259µs+131µs) by Template::Stash::XS::get at line 6 of Epoll/root/templates/includes/footer.tt # once (253µs+122µs) by Template::Stash::XS::get at line 2 of Epoll/root/templates/includes/locale_select_form.tt # once (255µs+120µs) by Template::Stash::XS::get at line 9 of Epoll/root/templates/includes/admin_menu.tt # once (238µs+111µs) by Template::Stash::XS::get at line 8 of Epoll/root/templates/includes/header.tt # once (108µs+62µs) by Template::Stash::XS::get at line 30 of Epoll/root/templates/includes/header.tt # once (77µs+56µs) by Template::Stash::XS::get at line 27 of Epoll/root/templates/includes/header.tt # once (62µs+42µs) by Template::Stash::XS::get at line 28 of Epoll/root/templates/includes/header.tt
sub uri_for {
12698615.41ms my ( $c, $path, @args ) = @_;
1270
127186117.9ms8616.65ms if (blessed($path) && $path->isa('Catalyst::Controller')) {
# spent 6.65ms making 861 calls to Scalar::Util::blessed, avg 8µs/call
1272 $path = $path->path_prefix;
1273 $path =~ s{/+\z}{};
1274 $path .= '/';
1275 }
1276
12778612.60ms undef($path) if (defined $path && $path eq '');
1278
127986110.5ms my $params =
1280 ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} );
1281
12828614.13ms carp "uri_for called with undef argument" if grep { ! defined $_ } @args;
12838615.97ms foreach my $arg (@args) {
128487722.0ms8775.54ms utf8::encode($arg) if utf8::is_utf8($arg);
# spent 5.54ms making 877 calls to utf8::is_utf8, avg 6µs/call
1285 }
1286172232.2ms17548.30ms s/([^$URI::uric])/$URI::Escape::escapes{$1}/go for @args;
# spent 5.74ms making 877 calls to Catalyst::CORE:subst, avg 7µs/call # spent 2.56ms making 877 calls to Catalyst::CORE:regcomp, avg 3µs/call
128786112.3ms8614.87ms if (blessed $path) { # Action object only.
# spent 4.87ms making 861 calls to Scalar::Util::blessed, avg 6µs/call
1288 s|/|%2F|g for @args;
1289 }
1290
129186110.1ms8613.33ms if ( blessed($path) ) { # action object
# spent 3.33ms making 861 calls to Scalar::Util::blessed, avg 4µs/call
1292 my $captures = [ map { s|/|%2F|g; $_; }
1293 ( scalar @args && ref $args[0] eq 'ARRAY'
1294 ? @{ shift(@args) }
1295 : ()) ];
1296
1297 foreach my $capture (@$captures) {
1298 utf8::encode($capture) if utf8::is_utf8($capture);
1299 $capture =~ s/([^$URI::uric])/$URI::Escape::escapes{$1}/go;
1300 }
1301
1302 my $action = $path;
1303 $path = $c->dispatcher->uri_for_action($action, $captures);
1304 if (not defined $path) {
1305 $c->log->debug(qq/Can't find uri_for action '$action' @$captures/)
1306 if $c->debug;
1307 return undef;
1308 }
1309 $path = '/' if $path eq '';
1310 }
1311
13128612.31ms undef($path) if (defined $path && $path eq '');
1313
13148614.52ms unshift(@args, $path);
1315
131686116.3ms8613.59ms unless (defined $path && $path =~ s!^/!!) { # in-place strip
# spent 3.59ms making 861 calls to Catalyst::CORE:subst, avg 4µs/call
131783912.0ms83914.9ms my $namespace = $c->namespace;
# spent 14.9ms making 839 calls to Catalyst::namespace, avg 18µs/call
13188394.47ms if (defined $path) { # cheesy hack to handle path '../foo'
131983914.5ms8393.12ms $namespace =~ s{(?:^|/)[^/]+$}{} while $args[0] =~ s{^\.\./}{};
# spent 3.12ms making 839 calls to Catalyst::CORE:subst, avg 4µs/call
1320 }
13218394.71ms unshift(@args, $namespace || '');
1322 }
1323
1324 # join args with '/', or a blank string
13258617.58ms my $args = join('/', grep { defined($_) } @args);
132686111.2ms8612.60ms $args =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE
# spent 2.60ms making 861 calls to Catalyst::CORE:subst, avg 3µs/call
13278618.76ms8612.32ms $args =~ s!^/+!!;
# spent 2.32ms making 861 calls to Catalyst::CORE:subst, avg 3µs/call
132886119.5ms172248.7ms my $base = $c->req->base;
# spent 36.0ms making 861 calls to Catalyst::req, avg 42µs/call # spent 12.7ms making 861 calls to Catalyst::Request::base, avg 15µs/call
13298614.35ms my $class = ref($base);
133086127.7ms172244.3ms $base =~ s{(?<!/)$}{/};
# spent 32.7ms making 861 calls to Catalyst::CORE:subst, avg 38µs/call # spent 11.6ms making 861 calls to URI::__ANON__[URI.pm:24], avg 13µs/call
1331
13328612.42ms my $query = '';
1333
13348614.85ms if (my @keys = keys %$params) {
1335 # somewhat lifted from URI::_query's query_form
1336 $query = '?'.join('&', map {
1337 my $val = $params->{$_};
1338 s/([;\/?:@&=+,\$\[\]%])/$URI::Escape::escapes{$1}/go;
1339 s/ /+/g;
1340 my $key = $_;
1341 $val = '' unless defined $val;
1342 (map {
1343 my $param = "$_";
1344 utf8::encode( $param ) if utf8::is_utf8($param);
1345 # using the URI::Escape pattern here so utf8 chars survive
1346 $param =~ s/([^A-Za-z0-9\-_.!~*'() ])/$URI::Escape::escapes{$1}/go;
1347 $param =~ s/ /+/g;
1348 "${key}=$param"; } ( ref $val eq 'ARRAY' ? @$val : $val ));
1349 } @keys);
1350 }
1351
135286119.9ms8616.94ms my $res = bless(\"${base}${args}${query}", $class);
# spent 6.94ms making 861 calls to URI::__ANON__[URI.pm:24], avg 8µs/call
135386115.5ms $res;
1354}
1355
1356=head2 $c->uri_for_action( $path, \@captures?, @args?, \%query_values? )
1357
1358=head2 $c->uri_for_action( $action, \@captures?, @args?, \%query_values? )
1359
1360=over
1361
1362=item $path
1363
1364A private path to the Catalyst action you want to create a URI for.
1365
1366This is a shortcut for calling C<< $c->dispatcher->get_action_by_path($path)
1367>> and passing the resulting C<$action> and the remaining arguments to C<<
1368$c->uri_for >>.
1369
1370You can also pass in a Catalyst::Action object, in which case it is passed to
1371C<< $c->uri_for >>.
1372
1373Note that although the path looks like a URI that dispatches to the wanted action, it is not a URI, but an internal path to that action.
1374
1375For example, if the action looks like:
1376
1377 package MyApp::Controller::Users;
1378
1379 sub lst : Path('the-list') {}
1380
1381You can use:
1382
1383 $c->uri_for_action('/users/lst')
1384
1385and it will create the URI /users/the-list.
1386
1387=back
1388
1389=cut
1390
1391sub uri_for_action {
1392 my ( $c, $path, @args ) = @_;
1393 my $action = blessed($path)
1394 ? $path
1395 : $c->dispatcher->get_action_by_path($path);
1396 unless (defined $action) {
1397 croak "Can't find action for path '$path'";
1398 }
1399 return $c->uri_for( $action, @args );
1400}
1401
1402=head2 $c->welcome_message
1403
1404Returns the Catalyst welcome HTML page.
1405
1406=cut
1407
1408sub welcome_message {
1409 my $c = shift;
1410 my $name = $c->config->{name};
1411 my $logo = $c->uri_for('/static/images/catalyst_logo.png');
1412 my $prefix = Catalyst::Utils::appprefix( ref $c );
1413 $c->response->content_type('text/html; charset=utf-8');
1414 return <<"EOF";
1415<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
1416 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
1417<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
1418 <head>
1419 <meta http-equiv="Content-Language" content="en" />
1420 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1421 <title>$name on Catalyst $VERSION</title>
1422 <style type="text/css">
1423 body {
1424 color: #000;
1425 background-color: #eee;
1426 }
1427 div#content {
1428 width: 640px;
1429 margin-left: auto;
1430 margin-right: auto;
1431 margin-top: 10px;
1432 margin-bottom: 10px;
1433 text-align: left;
1434 background-color: #ccc;
1435 border: 1px solid #aaa;
1436 }
1437 p, h1, h2 {
1438 margin-left: 20px;
1439 margin-right: 20px;
1440 font-family: verdana, tahoma, sans-serif;
1441 }
1442 a {
1443 font-family: verdana, tahoma, sans-serif;
1444 }
1445 :link, :visited {
1446 text-decoration: none;
1447 color: #b00;
1448 border-bottom: 1px dotted #bbb;
1449 }
1450 :link:hover, :visited:hover {
1451 color: #555;
1452 }
1453 div#topbar {
1454 margin: 0px;
1455 }
1456 pre {
1457 margin: 10px;
1458 padding: 8px;
1459 }
1460 div#answers {
1461 padding: 8px;
1462 margin: 10px;
1463 background-color: #fff;
1464 border: 1px solid #aaa;
1465 }
1466 h1 {
1467 font-size: 0.9em;
1468 font-weight: normal;
1469 text-align: center;
1470 }
1471 h2 {
1472 font-size: 1.0em;
1473 }
1474 p {
1475 font-size: 0.9em;
1476 }
1477 p img {
1478 float: right;
1479 margin-left: 10px;
1480 }
1481 span#appname {
1482 font-weight: bold;
1483 font-size: 1.6em;
1484 }
1485 </style>
1486 </head>
1487 <body>
1488 <div id="content">
1489 <div id="topbar">
1490 <h1><span id="appname">$name</span> on <a href="http://catalyst.perl.org">Catalyst</a>
1491 $VERSION</h1>
1492 </div>
1493 <div id="answers">
1494 <p>
1495 <img src="$logo" alt="Catalyst Logo" />
1496 </p>
1497 <p>Welcome to the world of Catalyst.
1498 This <a href="http://en.wikipedia.org/wiki/MVC">MVC</a>
1499 framework will make web development something you had
1500 never expected it to be: Fun, rewarding, and quick.</p>
1501 <h2>What to do now?</h2>
1502 <p>That really depends on what <b>you</b> want to do.
1503 We do, however, provide you with a few starting points.</p>
1504 <p>If you want to jump right into web development with Catalyst
1505 you might want to start with a tutorial.</p>
1506<pre>perldoc <a href="http://cpansearch.perl.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Tutorial.pod">Catalyst::Manual::Tutorial</a></code>
1507</pre>
1508<p>Afterwards you can go on to check out a more complete look at our features.</p>
1509<pre>
1510<code>perldoc <a href="http://cpansearch.perl.org/dist/Catalyst-Manual/lib/Catalyst/Manual/Intro.pod">Catalyst::Manual::Intro</a>
1511<!-- Something else should go here, but the Catalyst::Manual link seems unhelpful -->
1512</code></pre>
1513 <h2>What to do next?</h2>
1514 <p>Next it's time to write an actual application. Use the
1515 helper scripts to generate <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AController%3A%3A&amp;mode=all">controllers</a>,
1516 <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AModel%3A%3A&amp;mode=all">models</a>, and
1517 <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AView%3A%3A&amp;mode=all">views</a>;
1518 they can save you a lot of work.</p>
1519 <pre><code>script/${prefix}_create.pl --help</code></pre>
1520 <p>Also, be sure to check out the vast and growing
1521 collection of <a href="http://search.cpan.org/search?query=Catalyst">plugins for Catalyst on CPAN</a>;
1522 you are likely to find what you need there.
1523 </p>
1524
1525 <h2>Need help?</h2>
1526 <p>Catalyst has a very active community. Here are the main places to
1527 get in touch with us.</p>
1528 <ul>
1529 <li>
1530 <a href="http://dev.catalyst.perl.org">Wiki</a>
1531 </li>
1532 <li>
1533 <a href="http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst">Mailing-List</a>
1534 </li>
1535 <li>
1536 <a href="irc://irc.perl.org/catalyst">IRC channel #catalyst on irc.perl.org</a>
1537 </li>
1538 </ul>
1539 <h2>In conclusion</h2>
1540 <p>The Catalyst team hopes you will enjoy using Catalyst as much
1541 as we enjoyed making it. Please contact us if you have ideas
1542 for improvement or other feedback.</p>
1543 </div>
1544 </div>
1545 </body>
1546</html>
1547EOF
1548}
1549
1550=head1 INTERNAL METHODS
1551
1552These methods are not meant to be used by end users.
1553
1554=head2 $c->components
1555
1556Returns a hash of components.
1557
1558=head2 $c->context_class
1559
1560Returns or sets the context class.
1561
1562=head2 $c->counter
1563
1564Returns a hashref containing coderefs and execution counts (needed for
1565deep recursion detection).
1566
1567=head2 $c->depth
1568
1569Returns the number of actions on the current internal execution stack.
1570
1571=head2 $c->dispatch
1572
1573Dispatches a request to actions.
1574
1575=cut
1576
1577245µs219.0s
# spent 19.0s (54µs+19.0) within Catalyst::dispatch which was called # once (54µs+19.0s) by Class::MOP::Class:::around at line 76 of Catalyst/Plugin/Static/Simple.pm
sub dispatch { my $c = shift; $c->dispatcher->dispatch( $c, @_ ) }
# spent 19.0s making 1 call to Catalyst::Dispatcher::dispatch # spent 133µs making 1 call to Catalyst::_dispatcher_accessor
1578
1579=head2 $c->dispatcher_class
1580
1581Returns or sets the dispatcher class.
1582
1583=head2 $c->dump_these
1584
1585Returns a list of 2-element array references (name, structure) pairs
1586that will be dumped on the error page in debug mode.
1587
1588=cut
1589
1590
# spent 1.54ms (120µs+1.42) within Catalyst::dump_these which was called 2 times, avg 772µs/call: # 2 times (120µs+1.42ms) by Catalyst::Plugin::Session::dump_these at line 36 of mro.pm, avg 772µs/call
sub dump_these {
159123µs my $c = shift;
15922197µs81.42ms [ Request => $c->req ],
# spent 663µs making 2 calls to Catalyst::config, avg 331µs/call # spent 636µs making 2 calls to Catalyst::stash, avg 318µs/call # spent 82µs making 2 calls to Catalyst::res, avg 41µs/call # spent 43µs making 2 calls to Catalyst::req, avg 22µs/call
1593 [ Response => $c->res ],
1594 [ Stash => $c->stash ],
1595 [ Config => $c->config ];
1596}
1597
1598=head2 $c->engine_class
1599
1600Returns or sets the engine class.
1601
1602=head2 $c->execute( $class, $coderef )
1603
1604Execute a coderef in given class and catch exceptions. Errors are available
1605via $c->error.
1606
1607=cut
1608
1609
# spent 19.0s (2.50ms+19.0) within Catalyst::execute which was called 13 times, avg 1.46s/call: # 13 times (2.50ms+19.0s) by Catalyst::Action::dispatch at line 60 of Catalyst/Action.pm, avg 1.46s/call
sub execute {
16101345µs my ( $c, $class, $code ) = @_;
161113184µs132.42ms $class = $c->component($class) || $class;
# spent 2.42ms making 13 calls to Catalyst::component, avg 186µs/call
161213129µs13147µs $c->state(0);
# spent 147µs making 13 calls to Catalyst::state, avg 11µs/call
1613
161413138µs13437µs if ( $c->depth >= $RECURSION ) {
# spent 437µs making 13 calls to Catalyst::depth, avg 34µs/call
1615 my $action = $code->reverse();
1616 $action = "/$action" unless $action =~ /->/;
1617 my $error = qq/Deep recursion detected calling "${action}"/;
1618 $c->log->error($error);
1619 $c->error($error);
1620 $c->state(0);
1621 return $c->state;
1622 }
1623
162413242µs2623.8ms my $stats_info = $c->_stats_start_execute( $code ) if $c->use_stats;
# spent 23.7ms making 13 calls to Catalyst::_stats_start_execute, avg 1.82ms/call # spent 82µs making 13 calls to Epoll::use_stats, avg 6µs/call
1625
162613257µs13257µs push( @{ $c->stack }, $code );
# spent 257µs making 13 calls to Catalyst::stack, avg 20µs/call
1627
16283170µs284µs
# spent 54µs (25+30) within Catalyst::BEGIN@1628 which was called # once (25µs+30µs) by Epoll::BEGIN@17 at line 1628
no warnings 'recursion';
# spent 54µs making 1 call to Catalyst::BEGIN@1628 # spent 30µs making 1 call to warnings::unimport
162926753µs5219.0s eval { $c->state( $code->execute( $class, $c, @{ $c->req->args } ) || 0 ) };
# spent 75.7s making 13 calls to Catalyst::Action::execute, avg 5.82s/call, recursion: max depth 3, time 56.6s # spent 509µs making 13 calls to Catalyst::req, avg 39µs/call # spent 348µs making 13 calls to Catalyst::state, avg 27µs/call # spent 342µs making 13 calls to Catalyst::Request::args, avg 26µs/call
1630
163113259µs216.12ms $c->_stats_finish_execute( $stats_info ) if $c->use_stats and $stats_info;
# spent 6.04ms making 8 calls to Catalyst::_stats_finish_execute, avg 755µs/call # spent 81µs making 13 calls to Epoll::use_stats, avg 6µs/call
1632
163313135µs13138µs my $last = pop( @{ $c->stack } );
# spent 138µs making 13 calls to Catalyst::stack, avg 11µs/call
1634
16351328µs if ( my $error = $@ ) {
1636 if ( blessed($error) and $error->isa('Catalyst::Exception::Detach') ) {
1637 $error->rethrow if $c->depth > 1;
1638 }
1639 elsif ( blessed($error) and $error->isa('Catalyst::Exception::Go') ) {
1640 $error->rethrow if $c->depth > 0;
1641 }
1642 else {
1643 unless ( ref $error ) {
164437.74ms250µs
# spent 32µs (15+17) within Catalyst::BEGIN@1644 which was called # once (15µs+17µs) by Epoll::BEGIN@17 at line 1644
no warnings 'uninitialized';
# spent 32µs making 1 call to Catalyst::BEGIN@1644 # spent 17µs making 1 call to warnings::unimport
1645 chomp $error;
1646 my $class = $last->class;
1647 my $name = $last->name;
1648 $error = qq/Caught exception in $class->$name "$error"/;
1649 }
1650 $c->error($error);
1651 $c->state(0);
1652 }
1653 }
165413538µs13164µs return $c->state;
# spent 164µs making 13 calls to Catalyst::state, avg 13µs/call
1655}
1656
1657
# spent 23.7ms (2.67+21.0) within Catalyst::_stats_start_execute which was called 13 times, avg 1.82ms/call: # 13 times (2.67ms+21.0ms) by Catalyst::execute at line 1624, avg 1.82ms/call
sub _stats_start_execute {
16581337µs my ( $c, $code ) = @_;
16591336µs my $appclass = ref($c) || $c;
166013331µs312.66ms return if ( ( $code->name =~ /^_.*/ )
# spent 2.48ms making 5 calls to Catalyst::config, avg 496µs/call # spent 123µs making 13 calls to Catalyst::Action::name, avg 9µs/call # spent 62µs making 13 calls to Catalyst::CORE:match, avg 5µs/call
1661 && ( !$appclass->config->{show_internal_actions} ) );
1662
1663868µs876µs my $action_name = $code->reverse();
# spent 76µs making 8 calls to Catalyst::Action::reverse, avg 9µs/call
16648104µs869µs $c->counter->{$action_name}++;
# spent 69µs making 8 calls to Catalyst::counter, avg 9µs/call
1665
1666817µs my $action = $action_name;
16678103µs837µs $action = "/$action" unless $action =~ /->/;
# spent 37µs making 8 calls to Catalyst::CORE:match, avg 5µs/call
1668
1669 # determine if the call was the result of a forward
1670 # this is done by walking up the call stack and looking for a calling
1671 # sub of Catalyst::forward before the eval
1672816µs my $callsub = q{};
1673832µs for my $index ( 2 .. 11 ) {
1674 last
167522367µs if ( ( caller($index) )[0] eq 'Catalyst'
1676 && ( caller($index) )[3] eq '(eval)' );
1677
167819321µs1968µs if ( ( caller($index) )[3] =~ /forward$/ ) {
# spent 68µs making 19 calls to Catalyst::CORE:match, avg 4µs/call
1679578µs $callsub = ( caller($index) )[3];
1680514µs $action = "-> $action";
16815226µs last;
1682 }
1683 }
1684
1685890µs868µs my $uid = $action_name . $c->counter->{$action_name};
# spent 68µs making 8 calls to Catalyst::counter, avg 8µs/call
1686
1687 # is this a root-level call or a forwarded call?
16888109µs830µs if ( $callsub =~ /forward$/ ) {
# spent 30µs making 8 calls to Catalyst::CORE:match, avg 4µs/call
1689540µs541µs my $parent = $c->stack->[-1];
# spent 41µs making 5 calls to Catalyst::stack, avg 8µs/call
1690
1691 # forward, locate the caller
16925235µs3514.2ms if ( exists $c->counter->{"$parent"} ) {
# spent 14.0ms making 5 calls to Catalyst::Stats::profile, avg 2.80ms/call # spent 92µs making 15 calls to Catalyst::Action::__ANON__[Catalyst/Action.pm:44], avg 6µs/call # spent 67µs making 10 calls to Catalyst::counter, avg 7µs/call # spent 43µs making 5 calls to Catalyst::stats, avg 9µs/call
1693 $c->stats->profile(
1694 begin => $action,
1695 parent => "$parent" . $c->counter->{"$parent"},
1696 uid => $uid,
1697 );
1698 }
1699 else {
1700
1701 # forward with no caller may come from a plugin
1702 $c->stats->profile(
1703 begin => $action,
1704 uid => $uid,
1705 );
1706 }
1707 }
1708 else {
1709
1710 # root-level call
1711350µs63.77ms $c->stats->profile(
# spent 3.74ms making 3 calls to Catalyst::Stats::profile, avg 1.25ms/call # spent 30µs making 3 calls to Catalyst::stats, avg 10µs/call
1712 begin => $action,
1713 uid => $uid,
1714 );
1715 }
17168195µs return $action;
1717
1718}
1719
1720
# spent 6.04ms (275µs+5.76) within Catalyst::_stats_finish_execute which was called 8 times, avg 755µs/call: # 8 times (275µs+5.76ms) by Catalyst::execute at line 1631, avg 755µs/call
sub _stats_finish_execute {
1721829µs my ( $c, $info ) = @_;
17228166µs165.76ms $c->stats->profile( end => $info );
# spent 5.70ms making 8 calls to Catalyst::Stats::profile, avg 712µs/call # spent 67µs making 8 calls to Catalyst::stats, avg 8µs/call
1723}
1724
1725=head2 $c->finalize
1726
1727Finalizes the request.
1728
1729=cut
1730
1731
# spent 253ms (716µs+252) within Catalyst::finalize which was called # once (716µs+252ms) by Class::MOP::Method::Wrapped::__ANON__[/usr/lib/perl5/vendor_perl/5.10.1/i386-linux-thread-multi/Class/MOP/Method/Wrapped.pm:49] at line 48 of Class/MOP/Method/Wrapped.pm
sub finalize {
173212µs my $c = shift;
1733
1734111µs112µs for my $error ( @{ $c->error } ) {
# spent 12µs making 1 call to Catalyst::error
1735 $c->log->error($error);
1736 }
1737
1738 # Allow engine to handle finalize flow (for POE)
1739110µs1119µs my $engine = $c->engine;
# spent 119µs making 1 call to Catalyst::_engine_accessor
1740165µs147µs if ( my $code = $engine->can('finalize') ) {
# spent 47µs making 1 call to UNIVERSAL::can
1741 $engine->$code($c);
1742 }
1743 else {
1744
1745170µs1376µs $c->finalize_uploads;
# spent 376µs making 1 call to Catalyst::finalize_uploads
1746
1747 # Error
1748117µs113µs if ( $#{ $c->error } >= 0 ) {
# spent 13µs making 1 call to Catalyst::error
1749 $c->finalize_error;
1750 }
1751
1752179µs144.8ms $c->finalize_headers;
# spent 44.8ms making 1 call to Catalyst::Plugin::Session::finalize_headers
1753
1754 # HEAD request
1755119µs224µs if ( $c->request->method eq 'HEAD' ) {
# spent 13µs making 1 call to Catalyst::request # spent 12µs making 1 call to Catalyst::Request::method
1756 $c->response->body('');
1757 }
1758
1759122µs1196ms $c->finalize_body;
# spent 196ms making 1 call to Catalyst::Plugin::Session::finalize_body
1760 }
1761
1762146µs18.53ms $c->log_response;
# spent 8.53ms making 1 call to Catalyst::log_response
1763
176418µs14µs if ($c->use_stats) {
# spent 4µs making 1 call to Epoll::use_stats
1765143µs251µs my $elapsed = sprintf '%f', $c->stats->elapsed;
# spent 46µs making 1 call to Catalyst::Stats::elapsed # spent 6µs making 1 call to Catalyst::stats
176618µs my $av = $elapsed == 0 ? '??' : sprintf '%.3f', 1 / $elapsed;
1767123µs42.02ms $c->log->info(
# spent 1.89ms making 1 call to Catalyst::Stats::report # spent 98µs making 1 call to Catalyst::Log::info # spent 35µs making 1 call to Catalyst::_log_accessor # spent 4µs making 1 call to Catalyst::stats
1768 "Request took ${elapsed}s ($av/s)\n" . $c->stats->report . "\n" );
1769 }
1770
1771116µs212µs return $c->response->status;
# spent 7µs making 1 call to Catalyst::response # spent 5µs making 1 call to Catalyst::Response::status
1772}
1773
1774=head2 $c->finalize_body
1775
1776Finalizes body.
1777
1778=cut
1779
1780241µs2162ms
# spent 162ms (46µs+162) within Catalyst::finalize_body which was called # once (46µs+162ms) by Catalyst::Plugin::Session::finalize_body at line 36 of mro.pm
sub finalize_body { my $c = shift; $c->engine->finalize_body( $c, @_ ) }
# spent 162ms making 1 call to Catalyst::Engine::finalize_body # spent 134µs making 1 call to Catalyst::_engine_accessor
1781
1782=head2 $c->finalize_cookies
1783
1784Finalizes cookies.
1785
1786=cut
1787
1788243µs21.87ms
# spent 1.92ms (50µs+1.87) within Catalyst::finalize_cookies which was called # once (50µs+1.87ms) by Catalyst::finalize_headers at line 1851
sub finalize_cookies { my $c = shift; $c->engine->finalize_cookies( $c, @_ ) }
# spent 1.78ms making 1 call to Catalyst::Engine::finalize_cookies # spent 86µs making 1 call to Catalyst::_engine_accessor
1789
1790=head2 $c->finalize_error
1791
1792Finalizes error.
1793
1794=cut
1795
1796sub finalize_error { my $c = shift; $c->engine->finalize_error( $c, @_ ) }
1797
1798=head2 $c->finalize_headers
1799
1800Finalizes headers.
1801
1802=cut
1803
1804
# spent 16.4ms (986µs+15.4) within Catalyst::finalize_headers which was called # once (986µs+15.4ms) by Catalyst::Plugin::Session::finalize_headers at line 36 of mro.pm
sub finalize_headers {
180513µs my $c = shift;
1806
1807111µs115µs my $response = $c->response; #accessor calls can add up?
# spent 15µs making 1 call to Catalyst::response
1808
1809 # Check if we already finalized headers
1810111µs112µs return if $response->finalized_headers;
# spent 12µs making 1 call to Catalyst::Response::finalized_headers
1811
1812 # Handle redirects
1813174µs1104µs if ( my $location = $response->redirect ) {
# spent 104µs making 1 call to Catalyst::Response::redirect
1814 $c->log->debug(qq/Redirecting to "$location"/) if $c->debug;
1815 $response->header( Location => $location );
1816
1817 if ( !$response->has_body ) {
1818 # Add a default body if none is already present
1819 $response->body(
1820 qq{<html><body><p>This item has moved <a href="$location">here</a>.</p></body></html>}
1821 );
1822 }
1823 }
1824
1825 # Content-Length
18261697µs23.78ms if ( $response->body && !$response->content_length ) {
# spent 3.45ms making 1 call to Catalyst::Response::body # spent 332µs making 1 call to Catalyst::Response::content_length
1827
1828 # get the length from a filehandle
1829132µs24.20ms if ( blessed( $response->body ) && $response->body->can('read') )
# spent 4.19ms making 1 call to Catalyst::Response::body # spent 9µs making 1 call to Scalar::Util::blessed
1830 {
1831 my $stat = stat $response->body;
1832 if ( $stat && $stat->size > 0 ) {
1833 $response->content_length( $stat->size );
1834 }
1835 else {
1836 $c->log->warn('Serving filehandle without a content-length');
1837 }
1838 }
1839 else {
1840 # everything should be bytes at this point, but just in case
1841121µs22.07ms $response->content_length( length( $response->body ) );
# spent 1.87ms making 1 call to Catalyst::Response::body # spent 197µs making 1 call to Catalyst::Response::content_length
1842 }
1843 }
1844
1845 # Errors
1846141µs227µs if ( $response->status =~ /^(1\d\d|[23]04)$/ ) {
# spent 16µs making 1 call to Catalyst::Response::status # spent 11µs making 1 call to Catalyst::CORE:match
1847 $response->headers->remove_header("Content-Length");
1848 $response->body('');
1849 }
1850
1851165µs11.92ms $c->finalize_cookies;
# spent 1.92ms making 1 call to Catalyst::finalize_cookies
1852
1853118µs23.28ms $c->engine->finalize_headers( $c, @_ );
# spent 3.21ms making 1 call to Catalyst::Engine::HTTP::finalize_headers # spent 62µs making 1 call to Catalyst::_engine_accessor
1854
1855 # Done
1856123µs112µs $response->finalized_headers(1);
# spent 12µs making 1 call to Catalyst::Response::finalized_headers
1857}
1858
1859=head2 $c->finalize_output
1860
1861An alias for finalize_body.
1862
1863=head2 $c->finalize_read
1864
1865Finalizes the input after reading is complete.
1866
1867=cut
1868
1869sub finalize_read { my $c = shift; $c->engine->finalize_read( $c, @_ ) }
1870
1871=head2 $c->finalize_uploads
1872
1873Finalizes uploads. Cleans up any temporary files.
1874
1875=cut
1876
1877239µs2158µs
# spent 376µs (218+158) within Catalyst::finalize_uploads which was called # once (218µs+158µs) by Catalyst::finalize at line 1745
sub finalize_uploads { my $c = shift; $c->engine->finalize_uploads( $c, @_ ) }
# spent 100µs making 1 call to Catalyst::Engine::finalize_uploads # spent 58µs making 1 call to Catalyst::_engine_accessor
1878
1879=head2 $c->get_action( $action, $namespace )
1880
1881Gets an action in a given namespace.
1882
1883=cut
1884
188514199µs14805µs
# spent 996µs (191+805) within Catalyst::get_action which was called 7 times, avg 142µs/call: # 6 times (158µs+694µs) by Catalyst::Dispatcher::_invoke_as_path at line 294 of Catalyst/Dispatcher.pm, avg 142µs/call # once (32µs+111µs) by Catalyst::DispatchType::Index::match at line 47 of Catalyst/DispatchType/Index.pm
sub get_action { my $c = shift; $c->dispatcher->get_action(@_) }
# spent 419µs making 7 calls to Catalyst::_dispatcher_accessor, avg 60µs/call # spent 386µs making 7 calls to Catalyst::Dispatcher::get_action, avg 55µs/call
1886
1887=head2 $c->get_actions( $action, $namespace )
1888
1889Gets all actions of a given name in a namespace and all parent
1890namespaces.
1891
1892=cut
1893
1894680µs61.02ms
# spent 1.12ms (92µs+1.02) within Catalyst::get_actions which was called 3 times, avg 372µs/call: # once (40µs+407µs) by Catalyst::Controller::_BEGIN at line 92 of Catalyst/Controller.pm # once (24µs+316µs) by Catalyst::Controller::_AUTO at line 100 of Catalyst/Controller.pm # once (27µs+302µs) by Catalyst::Controller::_END at line 121 of Catalyst/Controller.pm
sub get_actions { my $c = shift; $c->dispatcher->get_actions( $c, @_ ) }
# spent 792µs making 3 calls to Catalyst::Dispatcher::get_actions, avg 264µs/call # spent 233µs making 3 calls to Catalyst::_dispatcher_accessor, avg 78µs/call
1895
1896=head2 $c->handle_request( $class, @arguments )
1897
1898Called to handle each HTTP request.
1899
1900=cut
1901
1902
# spent 19.5s (414µs+19.5) within Catalyst::handle_request which was called # once (414µs+19.5s) by Catalyst::Engine::HTTP::_handler at line 394 of Catalyst/Engine/HTTP.pm
sub handle_request {
190313µs my ( $class, @arguments ) = @_;
1904
1905 # Always expect worst case!
190611µs my $status = -1;
19071142µs1371µs eval {
# spent 22µs making 9 calls to Tree::Simple::DESTROY, avg 2µs/call # spent 17µs making 1 call to Epoll::DESTROY # spent 13µs making 1 call to Catalyst::Stats::DESTROY # spent 13µs making 1 call to Catalyst::Request::DESTROY # spent 7µs making 1 call to HTTP::Body::DESTROY
190816µs14µs if ($class->debug) {
# spent 4µs making 1 call to Epoll::debug
190913µs my $secs = time - $START || 1;
1910141µs my $av = sprintf '%.3f', $COUNT / $secs;
1911127µs my $time = localtime time;
1912116µs2106µs $class->log->info("*** Request $COUNT ($av/s) [$$] [$time] ***");
# spent 59µs making 1 call to Catalyst::Log::info # spent 48µs making 1 call to Catalyst::_log_accessor
1913 }
1914
1915115µs1203ms my $c = $class->prepare(@arguments);
# spent 203ms making 1 call to Catalyst::Plugin::Session::Store::DBI::prepare
1916113µs119.0s $c->dispatch;
# spent 19.0s making 1 call to Epoll::dispatch
1917152µs1254ms $status = $c->finalize;
# spent 254ms making 1 call to Epoll::finalize
1918 };
1919
1920119µs112µs if ( my $error = $@ ) {
# spent 12µs making 1 call to Catalyst::Response::DESTROY
1921 chomp $error;
1922 $class->log->error(qq/Caught exception in engine "$error"/);
1923 }
1924
19251900ns $COUNT++;
1926
1927123µs4215µs if(my $coderef = $class->log->can('_flush')){
# spent 152µs making 1 call to Catalyst::Log::_flush # spent 60µs making 2 calls to Catalyst::_log_accessor, avg 30µs/call # spent 3µs making 1 call to UNIVERSAL::can
1928 $class->log->$coderef();
1929 }
193017µs return $status;
1931}
1932
1933=head2 $c->prepare( @arguments )
1934
1935Creates a Catalyst context from an engine-specific request (Apache, CGI,
1936etc.).
1937
1938=cut
1939
1940
# spent 70.2ms (1.51+68.7) within Catalyst::prepare which was called # once (1.51ms+68.7ms) by Catalyst::Plugin::Session::Store::DBI::prepare at line 36 of mro.pm
sub prepare {
194116µs my ( $class, @arguments ) = @_;
1942
1943 # XXX
1944 # After the app/ctxt split, this should become an attribute based on something passed
1945 # into the application.
1946149µs2513µs $class->context_class( ref $class || $class ) unless $class->context_class;
# spent 513µs making 2 calls to Catalyst::_context_class_accessor, avg 256µs/call
1947
1948119µs2935µs my $c = $class->context_class->new({});
# spent 880µs making 1 call to Epoll::new # spent 56µs making 1 call to Catalyst::_context_class_accessor
1949
1950 # For on-demand data
19511103µs21.15ms $c->request->_context($c);
# spent 1.12ms making 1 call to Catalyst::request # spent 34µs making 1 call to Catalyst::Request::_context
1952149µs2738µs $c->response->_context($c);
# spent 701µs making 1 call to Catalyst::response # spent 37µs making 1 call to Catalyst::Response::_context
1953
1954 #surely this is not the most efficient way to do things...
19551168µs51.14ms $c->stats($class->stats_class->new)->enable($c->use_stats);
# spent 826µs making 1 call to Catalyst::Stats::new # spent 279µs making 1 call to Catalyst::_stats_class_accessor # spent 16µs making 1 call to Catalyst::Stats::enable # spent 14µs making 1 call to Catalyst::stats # spent 7µs making 1 call to Epoll::use_stats
1956112µs17µs if ( $c->debug ) {
# spent 7µs making 1 call to Epoll::debug
1957153µs3533µs $c->res->headers->header( 'X-Catalyst' => $Catalyst::VERSION );
# spent 395µs making 1 call to HTTP::Headers::header # spent 108µs making 1 call to Catalyst::Response::headers # spent 30µs making 1 call to Catalyst::res
1958 }
1959
1960 #XXX reuse coderef from can
1961 # Allow engine to direct the prepare flow (for POE)
1962156µs283µs if ( $c->engine->can('prepare') ) {
# spent 66µs making 1 call to Catalyst::_engine_accessor # spent 17µs making 1 call to UNIVERSAL::can
1963 $c->engine->prepare( $c, @arguments );
1964 }
1965 else {
1966138µs1142µs $c->prepare_request(@arguments);
# spent 142µs making 1 call to Catalyst::prepare_request
1967137µs1834µs $c->prepare_connection;
# spent 834µs making 1 call to Catalyst::prepare_connection
1968141µs1184µs $c->prepare_query_parameters;
# spent 184µs making 1 call to Catalyst::prepare_query_parameters
1969148µs13.07ms $c->prepare_headers;
# spent 3.07ms making 1 call to Catalyst::prepare_headers
1970141µs11.71ms $c->prepare_cookies;
# spent 1.71ms making 1 call to Catalyst::prepare_cookies
1971144µs13.42ms $c->prepare_path;
# spent 3.42ms making 1 call to Catalyst::prepare_path
1972
1973 # Prepare the body for reading, either by prepare_body
1974 # or the user, if they are using $c->read
1975145µs1660µs $c->prepare_read;
# spent 660µs making 1 call to Catalyst::prepare_read
1976
1977 # Parse the body unless the user wants it on-demand
1978151µs25.35ms unless ( ref($c)->config->{parse_on_demand} ) {
# spent 5.03ms making 1 call to Catalyst::prepare_body # spent 319µs making 1 call to Catalyst::config
1979 $c->prepare_body;
1980 }
1981 }
1982
1983125µs269µs my $method = $c->req->method || '';
# spent 52µs making 1 call to Catalyst::req # spent 17µs making 1 call to Catalyst::Request::method
1984117µs2640µs my $path = $c->req->path;
# spent 613µs making 1 call to Catalyst::Request::path # spent 27µs making 1 call to Catalyst::req
198512µs $path = '/' unless length $path;
1986117µs237µs my $address = $c->req->address || '';
# spent 26µs making 1 call to Catalyst::req # spent 11µs making 1 call to Catalyst::Request::address
1987
1988154µs144.1ms $c->log_request;
# spent 44.1ms making 1 call to Catalyst::log_request
1989
1990124µs13.35ms $c->prepare_action;
# spent 3.35ms making 1 call to Epoll::prepare_action
1991
1992118µs return $c;
1993}
1994
1995=head2 $c->prepare_action
1996
1997Prepares action. See L<Catalyst::Dispatcher>.
1998
1999=cut
2000
2001230µs22.08ms
# spent 2.12ms (36µs+2.08) within Catalyst::prepare_action which was called # once (36µs+2.08ms) by Catalyst::Plugin::Session::prepare_action at line 36 of mro.pm
sub prepare_action { my $c = shift; $c->dispatcher->prepare_action( $c, @_ ) }
# spent 2.02ms making 1 call to Catalyst::Dispatcher::prepare_action # spent 62µs making 1 call to Catalyst::_dispatcher_accessor
2002
2003=head2 $c->prepare_body
2004
2005Prepares message body.
2006
2007=cut
2008
2009
# spent 6.16ms (1.32+4.84) within Catalyst::prepare_body which was called 30 times, avg 205µs/call: # 29 times (1.08ms+45µs) by Class::MOP::Class:::before at line 77 of Catalyst/Request.pm, avg 39µs/call # once (239µs+4.80ms) by Catalyst::prepare at line 1978
sub prepare_body {
20103053µs my $c = shift;
2011
201230553µs60481µs return if $c->request->_has_body;
# spent 250µs making 30 calls to Catalyst::request, avg 8µs/call # spent 232µs making 30 calls to Catalyst::Request::_has_body, avg 8µs/call
2013
2014 # Initialize on-demand data
2015125µs22.85ms $c->engine->prepare_body( $c, @_ );
# spent 2.79ms making 1 call to Catalyst::Engine::prepare_body # spent 59µs making 1 call to Catalyst::_engine_accessor
2016143µs11.36ms $c->prepare_parameters;
# spent 1.36ms making 1 call to Catalyst::prepare_parameters
2017146µs1566µs $c->prepare_uploads;
# spent 566µs making 1 call to Catalyst::prepare_uploads
2018}
2019
2020=head2 $c->prepare_body_chunk( $chunk )
2021
2022Prepares a chunk of data before sending it to L<HTTP::Body>.
2023
2024See L<Catalyst::Engine>.
2025
2026=cut
2027
2028
# spent 704µs (76+629) within Catalyst::prepare_body_chunk which was called # once (76µs+629µs) by Catalyst::Engine::prepare_body at line 343 of Catalyst/Engine.pm
sub prepare_body_chunk {
202912µs my $c = shift;
2030133µs2628µs $c->engine->prepare_body_chunk( $c, @_ );
# spent 567µs making 1 call to Catalyst::Engine::prepare_body_chunk # spent 61µs making 1 call to Catalyst::_engine_accessor
2031}
2032
2033=head2 $c->prepare_body_parameters
2034
2035Prepares body parameters.
2036
2037=cut
2038
2039
# spent 536µs (40+496) within Catalyst::prepare_body_parameters which was called # once (40µs+496µs) by Catalyst::prepare_parameters at line 2079
sub prepare_body_parameters {
204012µs my $c = shift;
2041133µs2496µs $c->engine->prepare_body_parameters( $c, @_ );
# spent 437µs making 1 call to Catalyst::Engine::prepare_body_parameters # spent 59µs making 1 call to Catalyst::_engine_accessor
2042}
2043
2044=head2 $c->prepare_connection
2045
2046Prepares connection.
2047
2048=cut
2049
2050
# spent 834µs (46+788) within Catalyst::prepare_connection which was called # once (46µs+788µs) by Catalyst::prepare at line 1967
sub prepare_connection {
205112µs my $c = shift;
2052133µs2788µs $c->engine->prepare_connection( $c, @_ );
# spent 670µs making 1 call to Catalyst::Engine::CGI::prepare_connection # spent 118µs making 1 call to Catalyst::_engine_accessor
2053}
2054
2055=head2 $c->prepare_cookies
2056
2057Prepares cookies.
2058
2059=cut
2060
20612214µs21.61ms
# spent 1.71ms (100µs+1.62) within Catalyst::prepare_cookies which was called # once (100µs+1.62ms) by Catalyst::prepare at line 1970
sub prepare_cookies { my $c = shift; $c->engine->prepare_cookies( $c, @_ ) }
# spent 1.32ms making 1 call to Catalyst::Engine::prepare_cookies # spent 293µs making 1 call to Catalyst::_engine_accessor
2062
2063=head2 $c->prepare_headers
2064
2065Prepares headers.
2066
2067=cut
2068
2069234µs23.03ms
# spent 3.07ms (41µs+3.03) within Catalyst::prepare_headers which was called # once (41µs+3.03ms) by Catalyst::prepare at line 1969
sub prepare_headers { my $c = shift; $c->engine->prepare_headers( $c, @_ ) }
# spent 2.83ms making 1 call to Catalyst::Engine::CGI::prepare_headers # spent 197µs making 1 call to Catalyst::_engine_accessor
2070
2071=head2 $c->prepare_parameters
2072
2073Prepares parameters.
2074
2075=cut
2076
2077
# spent 1.36ms (118µs+1.24) within Catalyst::prepare_parameters which was called # once (118µs+1.24ms) by Catalyst::prepare_body at line 2016
sub prepare_parameters {
207812µs my $c = shift;
2079134µs1536µs $c->prepare_body_parameters;
# spent 536µs making 1 call to Catalyst::prepare_body_parameters
2080136µs2702µs $c->engine->prepare_parameters( $c, @_ );
# spent 642µs making 1 call to Catalyst::Engine::prepare_parameters # spent 59µs making 1 call to Catalyst::_engine_accessor
2081}
2082
2083=head2 $c->prepare_path
2084
2085Prepares path and base.
2086
2087=cut
2088
2089232µs23.38ms
# spent 3.42ms (39µs+3.38) within Catalyst::prepare_path which was called # once (39µs+3.38ms) by Catalyst::prepare at line 1971
sub prepare_path { my $c = shift; $c->engine->prepare_path( $c, @_ ) }
# spent 3.32ms making 1 call to Catalyst::Engine::CGI::prepare_path # spent 60µs making 1 call to Catalyst::_engine_accessor
2090
2091=head2 $c->prepare_query_parameters
2092
2093Prepares query parameters.
2094
2095=cut
2096
2097
# spent 184µs (45+139) within Catalyst::prepare_query_parameters which was called # once (45µs+139µs) by Catalyst::prepare at line 1968
sub prepare_query_parameters {
209812µs my $c = shift;
2099
2100133µs2139µs $c->engine->prepare_query_parameters( $c, @_ );
# spent 75µs making 1 call to Catalyst::Engine::CGI::prepare_query_parameters # spent 64µs making 1 call to Catalyst::_engine_accessor
2101}
2102
2103=head2 $c->log_request
2104
2105Writes information about the request to the debug logs. This includes:
2106
2107=over 4
2108
2109=item * Request method, path, and remote IP address
2110
2111=item * Query keywords (see L<Catalyst::Request/query_keywords>)
2112
2113=item * Request parameters
2114
2115=item * File uploads
2116
2117=back
2118
2119=cut
2120
2121
# spent 44.1ms (369µs+43.7) within Catalyst::log_request which was called # once (369µs+43.7ms) by Catalyst::prepare at line 1988
sub log_request {
212212µs my $c = shift;
2123
212418µs16µs return unless $c->debug;
# spent 6µs making 1 call to Epoll::debug
2125
2126139µs141.0ms my($dump) = grep {$_->[0] eq 'Request' } $c->dump_these;
# spent 41.0ms making 1 call to Catalyst::Plugin::Session::dump_these
212712µs my $request = $dump->[1];
2128
2129129µs376µs my ( $method, $path, $address ) = ( $request->method, $request->path, $request->address );
# spent 51µs making 1 call to Catalyst::Request::path # spent 14µs making 1 call to Catalyst::Request::method # spent 11µs making 1 call to Catalyst::Request::address
213011µs $method ||= '';
213112µs $path = '/' unless length $path;
213211µs $address ||= '';
2133124µs2238µs $c->log->debug(qq/"$method" request for "$path" from "$address"/);
# spent 120µs making 1 call to Catalyst::_log_accessor # spent 117µs making 1 call to Catalyst::Log::debug
2134
2135160µs222µs $c->log_request_headers($request->headers);
# spent 16µs making 1 call to Catalyst::Request::headers # spent 6µs making 1 call to Catalyst::log_request_headers
2136
2137110µs110µs if ( my $keywords = $request->query_keywords ) {
# spent 10µs making 1 call to Catalyst::Request::query_keywords
2138 $c->log->debug("Query keywords are: $keywords");
2139 }
2140
2141161µs32.36ms $c->log_request_parameters( query => $request->query_parameters, body => $request->body_parameters );
# spent 2.19ms making 1 call to Catalyst::log_request_parameters # spent 158µs making 1 call to Catalyst::Request::body_parameters # spent 11µs making 1 call to Catalyst::Request::query_parameters
2142
2143156µs157µs $c->log_request_uploads($request);
# spent 57µs making 1 call to Catalyst::log_request_uploads
2144}
2145
2146=head2 $c->log_response
2147
2148Writes information about the response to the debug logs by calling
2149C<< $c->log_response_status_line >> and C<< $c->log_response_headers >>.
2150
2151=cut
2152
2153
# spent 8.53ms (107µs+8.42) within Catalyst::log_response which was called # once (107µs+8.42ms) by Catalyst::finalize at line 1762
sub log_response {
215412µs my $c = shift;
2155
215615µs14µs return unless $c->debug;
# spent 4µs making 1 call to Epoll::debug
2157
2158115µs17.67ms my($dump) = grep {$_->[0] eq 'Response' } $c->dump_these;
# spent 7.67ms making 1 call to Catalyst::Plugin::Session::dump_these
21591800ns my $response = $dump->[1];
2160
2161134µs1742µs $c->log_response_status_line($response);
# spent 742µs making 1 call to Catalyst::log_response_status_line
2162135µs28µs $c->log_response_headers($response->headers);
# spent 5µs making 1 call to Catalyst::Response::headers # spent 3µs making 1 call to Catalyst::log_response_headers
2163}
2164
2165=head2 $c->log_response_status_line($response)
2166
2167Writes one line of information about the response to the debug logs. This includes:
2168
2169=over 4
2170
2171=item * Response status code
2172
2173=item * Content-Type header (if present)
2174
2175=item * Content-Length header (if present)
2176
2177=back
2178
2179=cut
2180
2181
# spent 742µs (59+682) within Catalyst::log_response_status_line which was called # once (59µs+682µs) by Catalyst::log_response at line 2161
sub log_response_status_line {
218211µs my ($c, $response) = @_;
2183
2184143µs7682µs $c->log->debug(
# spent 575µs making 2 calls to HTTP::Headers::header, avg 287µs/call # spent 58µs making 1 call to Catalyst::Log::debug # spent 31µs making 1 call to Catalyst::_log_accessor # spent 12µs making 2 calls to Catalyst::Response::headers, avg 6µs/call # spent 6µs making 1 call to Catalyst::Response::status
2185 sprintf(
2186 'Response Code: %s; Content-Type: %s; Content-Length: %s',
2187 $response->status || 'unknown',
2188 $response->headers->header('Content-Type') || 'unknown',
2189 $response->headers->header('Content-Length') || 'unknown'
2190 )
2191 );
2192}
2193
2194=head2 $c->log_response_headers($headers);
2195
2196Hook method which can be wrapped by plugins to log the responseheaders.
2197No-op in the default implementation.
2198
2199=cut
2200
220116µs
# spent 3µs within Catalyst::log_response_headers which was called # once (3µs+0s) by Catalyst::log_response at line 2162
sub log_response_headers {}
2202
2203=head2 $c->log_request_parameters( query => {}, body => {} )
2204
2205Logs request parameters to debug logs
2206
2207=cut
2208
2209
# spent 2.19ms (283µs+1.91) within Catalyst::log_request_parameters which was called # once (283µs+1.91ms) by Catalyst::log_request at line 2141
sub log_request_parameters {
221012µs my $c = shift;
221118µs my %all_params = @_;
2212
221318µs16µs return unless $c->debug;
# spent 6µs making 1 call to Epoll::debug
2214
2215111µs18µs my $column_width = Catalyst::Utils::term_width() - 44;
# spent 8µs making 1 call to Catalyst::Utils::term_width
2216118µs foreach my $type (qw(query body)) {
221724µs my $params = $all_params{$type};
221826µs next if ! keys %$params;
2219134µs1718µs my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ $column_width, 'Value' ] );
# spent 718µs making 1 call to Text::SimpleTable::new
2220176µs18µs for my $key ( sort keys %$params ) {
# spent 8µs making 1 call to Catalyst::CORE:sort
222128µs my $param = $params->{$key};
222224µs my $value = defined($param) ? $param : '';
2223225µs2591µs $t->row( $key, ref $value eq 'ARRAY' ? ( join ', ', @$value ) : $value );
# spent 591µs making 2 calls to Text::SimpleTable::row, avg 296µs/call
2224 }
2225142µs3575µs $c->log->debug( ucfirst($type) . " Parameters are:\n" . $t->draw );
# spent 383µs making 1 call to Text::SimpleTable::draw # spent 120µs making 1 call to Catalyst::Log::debug # spent 72µs making 1 call to Catalyst::_log_accessor
2226 }
2227}
2228
2229=head2 $c->log_request_uploads
2230
2231Logs file uploads included in the request to the debug logs.
2232The parameter name, filename, file type, and file size are all included in
2233the debug logs.
2234
2235=cut
2236
2237
# spent 57µs (41+16) within Catalyst::log_request_uploads which was called # once (41µs+16µs) by Catalyst::log_request at line 2143
sub log_request_uploads {
223812µs my $c = shift;
223912µs my $request = shift;
224017µs15µs return unless $c->debug;
# spent 5µs making 1 call to Epoll::debug
224119µs111µs my $uploads = $request->uploads;
# spent 11µs making 1 call to Catalyst::Request::uploads
2242113µs if ( keys %$uploads ) {
2243 my $t = Text::SimpleTable->new(
2244 [ 12, 'Parameter' ],
2245 [ 26, 'Filename' ],
2246 [ 18, 'Type' ],
2247 [ 9, 'Size' ]
2248 );
2249 for my $key ( sort keys %$uploads ) {
2250 my $upload = $uploads->{$key};
2251 for my $u ( ref $upload eq 'ARRAY' ? @{$upload} : ($upload) ) {
2252 $t->row( $key, $u->filename, $u->type, $u->size );
2253 }
2254 }
2255 $c->log->debug( "File Uploads are:\n" . $t->draw );
2256 }
2257}
2258
2259=head2 $c->log_request_headers($headers);
2260
2261Hook method which can be wrapped by plugins to log the request headers.
2262No-op in the default implementation.
2263
2264=cut
2265
2266111µs
# spent 6µs within Catalyst::log_request_headers which was called # once (6µs+0s) by Catalyst::log_request at line 2135
sub log_request_headers {}
2267
2268=head2 $c->log_headers($type => $headers)
2269
2270Logs L<HTTP::Headers> (either request or response) to the debug logs.
2271
2272=cut
2273
2274sub log_headers {
2275 my $c = shift;
2276 my $type = shift;
2277 my $headers = shift; # an HTTP::Headers instance
2278
2279 return unless $c->debug;
2280
2281 my $column_width = Catalyst::Utils::term_width() - 28;
2282 my $t = Text::SimpleTable->new( [ 15, 'Header Name' ], [ $column_width, 'Value' ] );
2283 $headers->scan(
2284 sub {
2285 my ( $name, $value ) = @_;
2286 $t->row( $name, $value );
2287 }
2288 );
2289 $c->log->debug( ucfirst($type) . " Headers:\n" . $t->draw );
2290}
2291
2292
2293=head2 $c->prepare_read
2294
2295Prepares the input for reading.
2296
2297=cut
2298
22992185µs2628µs
# spent 660µs (32+628) within Catalyst::prepare_read which was called # once (32µs+628µs) by Catalyst::prepare at line 1975
sub prepare_read { my $c = shift; $c->engine->prepare_read( $c, @_ ) }
# spent 557µs making 1 call to Catalyst::Engine::HTTP::prepare_read # spent 70µs making 1 call to Catalyst::_engine_accessor
2300
2301=head2 $c->prepare_request
2302
2303Prepares the engine request.
2304
2305=cut
2306
2307233µs2102µs
# spent 142µs (40+102) within Catalyst::prepare_request which was called # once (40µs+102µs) by Catalyst::prepare at line 1966
sub prepare_request { my $c = shift; $c->engine->prepare_request( $c, @_ ) }
# spent 55µs making 1 call to Catalyst::_engine_accessor # spent 47µs making 1 call to Catalyst::Engine::CGI::prepare_request
2308
2309=head2 $c->prepare_uploads
2310
2311Prepares uploads.
2312
2313=cut
2314
2315
# spent 566µs (45+521) within Catalyst::prepare_uploads which was called # once (45µs+521µs) by Catalyst::prepare_body at line 2017
sub prepare_uploads {
231613µs my $c = shift;
2317
2318133µs2521µs $c->engine->prepare_uploads( $c, @_ );
# spent 463µs making 1 call to Catalyst::Engine::prepare_uploads # spent 58µs making 1 call to Catalyst::_engine_accessor
2319}
2320
2321=head2 $c->prepare_write
2322
2323Prepares the output for writing.
2324
2325=cut
2326
2327sub prepare_write { my $c = shift; $c->engine->prepare_write( $c, @_ ) }
2328
2329=head2 $c->request_class
2330
2331Returns or sets the request class.
2332
2333=head2 $c->response_class
2334
2335Returns or sets the response class.
2336
2337=head2 $c->read( [$maxlength] )
2338
2339Reads a chunk of data from the request body. This method is designed to
2340be used in a while loop, reading C<$maxlength> bytes on every call.
2341C<$maxlength> defaults to the size of the request if not specified.
2342
2343You have to set C<< MyApp->config(parse_on_demand => 1) >> to use this
2344directly.
2345
2346Warning: If you use read(), Catalyst will not process the body,
2347so you will not be able to access POST parameters or file uploads via
2348$c->request. You must handle all body parsing yourself.
2349
2350=cut
2351
2352sub read { my $c = shift; return $c->engine->read( $c, @_ ) }
2353
2354=head2 $c->run
2355
2356Starts the engine.
2357
2358=cut
2359
23602114µs150µssub run { my $c = shift; return $c->engine->run( $c, @_ ) }
# spent 50µs making 1 call to Catalyst::_engine_accessor
2361
2362=head2 $c->set_action( $action, $code, $namespace, $attrs )
2363
2364Sets an action in a given namespace.
2365
2366=cut
2367
2368sub set_action { my $c = shift; $c->dispatcher->set_action( $c, @_ ) }
2369
2370=head2 $c->setup_actions($component)
2371
2372Sets up actions for a component.
2373
2374=cut
2375
2376234µs2512ms
# spent 512ms (94µs+512) within Catalyst::setup_actions which was called # once (94µs+512ms) by Catalyst::setup at line 1161
sub setup_actions { my $c = shift; $c->dispatcher->setup_actions( $c, @_ ) }
# spent 512ms making 1 call to Catalyst::Dispatcher::setup_actions # spent 28µs making 1 call to Catalyst::_dispatcher_accessor
2377
2378=head2 $c->setup_components
2379
2380This method is called internally to set up the application's components.
2381
2382It finds modules by calling the L<locate_components> method, expands them to
2383package names with the L<expand_component_module> method, and then installs
2384each component into the application.
2385
2386The C<setup_components> config option is passed to both of the above methods.
2387
2388Installation of each component is performed by the L<setup_component> method,
2389below.
2390
2391=cut
2392
2393
# spent 1.38s (1.19ms+1.38) within Catalyst::setup_components which was called # once (1.19ms+1.38s) by Catalyst::setup at line 1143
sub setup_components {
239412µs my $class = shift;
2395
2396132µs1389µs my $config = $class->config->{ setup_components };
# spent 389µs making 1 call to Catalyst::config
2397
2398188µs235.5ms my @comps = sort { length $a <=> length $b }
# spent 35.5ms making 1 call to Catalyst::locate_components # spent 28µs making 1 call to Catalyst::CORE:sort
2399 $class->locate_components($config);
2400129µs my %comps = map { $_ => 1 } @comps;
2401
240212136µs1140µs my $deprecatedcatalyst_component_names = grep { /::[CMV]::/ } @comps;
# spent 40µs making 11 calls to Catalyst::CORE:match, avg 4µs/call
240312µs $class->log->warn(qq{Your application is using the deprecated ::[MVC]:: type naming scheme.\n}.
2404 qq{Please switch your class names to ::Model::, ::View:: and ::Controller: as appropriate.\n}
2405 ) if $deprecatedcatalyst_component_names;
2406
240714µs for my $component ( @comps ) {
2408
2409 # We pass ignore_loaded here so that overlay files for (e.g.)
2410 # Model::DBI::Schema sub-classes are loaded - if it's in @comps
2411 # we know M::P::O found a file on disk so this is safe
2412
241311183µs11961ms Catalyst::Utils::ensure_class_loaded( $component, { ignore_loaded => 1 } );
# spent 961ms making 11 calls to Catalyst::Utils::ensure_class_loaded, avg 87.4ms/call
2414
2415 # Needs to be done as soon as the component is loaded, as loading a sub-component
2416 # (next time round the loop) can cause us to get the wrong metaclass..
241711217µs111.80ms $class->_controller_init_base_classes($component);
# spent 1.80ms making 11 calls to Catalyst::_controller_init_base_classes, avg 163µs/call
2418 }
2419
2420117µs for my $component (@comps) {
242111303µs22376ms my $instance = $class->components->{ $component } = $class->setup_component($component);
# spent 375ms making 11 calls to Catalyst::setup_component, avg 34.1ms/call # spent 522µs making 11 calls to Catalyst::_components_accessor, avg 47µs/call
242211424µs223.38ms my @expanded_components = $instance->can('expand_modules')
# spent 3.10ms making 11 calls to Catalyst::Component::expand_modules, avg 281µs/call # spent 285µs making 11 calls to UNIVERSAL::can, avg 26µs/call
2423 ? $instance->expand_modules( $component, $config )
2424 : $class->expand_component_module( $component, $config );
24251150µs for my $component (@expanded_components) {
2426 next if $comps{$component};
2427 $class->_controller_init_base_classes($component); # Also cover inner packages
2428 $class->components->{ $component } = $class->setup_component($component);
2429 }
2430 }
2431}
2432
2433=head2 $c->locate_components( $setup_component_config )
2434
2435This method is meant to provide a list of component modules that should be
2436setup for the application. By default, it will use L<Module::Pluggable>.
2437
2438Specify a C<setup_components> config option to pass additional options directly
2439to L<Module::Pluggable>. To add additional search paths, specify a key named
2440C<search_extra> as an array reference. Items in the array beginning with C<::>
2441will have the application class name prepended to them.
2442
2443=cut
2444
2445
# spent 35.5ms (178µs+35.3) within Catalyst::locate_components which was called # once (178µs+35.3ms) by Catalyst::setup_components at line 2398
sub locate_components {
244612µs my $class = shift;
244712µs my $config = shift;
2448
244918µs my @paths = qw( ::Controller ::C ::Model ::M ::View ::V );
245014µs my $extra = delete $config->{ search_extra } || [];
2451
245212µs push @paths, @$extra;
2453
2454690µs644µs my $locator = Module::Pluggable::Object->new(
# spent 44µs making 6 calls to Catalyst::CORE:subst, avg 7µs/call
2455753µs122µs search_path => [ map { s/^(?=::)/$class/; $_; } @paths ],
# spent 22µs making 1 call to Module::Pluggable::Object::new
2456 %$config
2457 );
2458
2459121µs135.2ms my @comps = $locator->plugins;
# spent 35.2ms making 1 call to Module::Pluggable::Object::plugins
2460
2461132µs return @comps;
2462}
2463
2464=head2 $c->expand_component_module( $component, $setup_component_config )
2465
2466Components found by C<locate_components> will be passed to this method, which
2467is expected to return a list of component (package) names to be set up.
2468
2469=cut
2470
2471sub expand_component_module {
2472 my ($class, $module) = @_;
2473 return Devel::InnerPackage::list_packages( $module );
2474}
2475
2476=head2 $c->setup_component
2477
2478=cut
2479
2480# FIXME - Ugly, ugly hack to ensure the we force initialize non-moose base classes
2481# nearest to Catalyst::Controller first, no matter what order stuff happens
2482# to be loaded. There are TODO tests in Moose for this, see
2483# f2391d17574eff81d911b97be15ea51080500003
2484
# spent 1.80ms (833µs+965µs) within Catalyst::_controller_init_base_classes which was called 11 times, avg 163µs/call: # 11 times (833µs+965µs) by Catalyst::setup_components at line 2417, avg 163µs/call
sub _controller_init_base_classes {
24851142µs my ($app_class, $component) = @_;
248611340µs1173µs return unless $component->isa('Catalyst::Controller');
# spent 73µs making 11 calls to UNIVERSAL::isa, avg 7µs/call
24876295µs628µs foreach my $class ( reverse @{ mro::get_linear_isa($component) } ) {
# spent 28µs making 6 calls to mro::get_linear_isa, avg 5µs/call
248830281µs30864µs Moose::Meta::Class->initialize( $class )
# spent 864µs making 30 calls to Moose::Util::find_meta, avg 29µs/call
2489 unless find_meta($class);
2490 }
2491}
2492
2493
# spent 375ms (885µs+374) within Catalyst::setup_component which was called 11 times, avg 34.1ms/call: # 11 times (885µs+374ms) by Catalyst::setup_components at line 2421, avg 34.1ms/call
sub setup_component {
24941127µs my( $class, $component ) = @_;
2495
249611389µs11101µs unless ( $component->can( 'COMPONENT' ) ) {
# spent 101µs making 11 calls to UNIVERSAL::can, avg 9µs/call
2497 return $component;
2498 }
2499
25001166µs11949µs my $suffix = Catalyst::Utils::class2classsuffix( $component );
# spent 949µs making 11 calls to Catalyst::Utils::class2classsuffix, avg 86µs/call
25011193µs112.91ms my $config = $class->config->{ $suffix } || {};
# spent 2.91ms making 11 calls to Catalyst::config, avg 265µs/call
2502 # Stash catalyst_component_name in the config here, so that custom COMPONENT
2503 # methods also pass it. local to avoid pointlessly shitting in config
2504 # for the debug screen, as $component is already the key name.
25051143µs local $config->{catalyst_component_name} = $component;
2506
250722155µs11370ms my $instance = eval { $component->COMPONENT( $class, $config ); };
# spent 370ms making 11 calls to Catalyst::Component::COMPONENT, avg 33.7ms/call
2508
25091116µs if ( my $error = $@ ) {
2510 chomp $error;
2511 Catalyst::Exception->throw(
2512 message => qq/Couldn't instantiate component "$component", "$error"/
2513 );
2514 }
2515
251611114µs1151µs unless (blessed $instance) {
# spent 51µs making 11 calls to Scalar::Util::blessed, avg 5µs/call
2517 my $metaclass = Moose::Util::find_meta($component);
2518 my $method_meta = $metaclass->find_method_by_name('COMPONENT');
2519 my $component_method_from = $method_meta->associated_metaclass->name;
2520 my $value = defined($instance) ? $instance : 'undef';
2521 Catalyst::Exception->throw(
2522 message =>
2523 qq/Couldn't instantiate component "$component", COMPONENT() method (from $component_method_from) didn't return an object-like value (value was $value)./
2524 );
2525 }
252611113µs return $instance;
2527}
2528
2529=head2 $c->setup_dispatcher
2530
2531Sets up dispatcher.
2532
2533=cut
2534
2535
# spent 469ms (290µs+469) within Catalyst::setup_dispatcher which was called # once (290µs+469ms) by Catalyst::setup at line 1080
sub setup_dispatcher {
253613µs my ( $class, $dispatcher ) = @_;
2537
253812µs if ($dispatcher) {
2539 $dispatcher = 'Catalyst::Dispatcher::' . $dispatcher;
2540 }
2541
25421141µs1271µs if ( my $env = Catalyst::Utils::env_value( $class, 'DISPATCHER' ) ) {
# spent 271µs making 1 call to Catalyst::Utils::env_value
2543 $dispatcher = 'Catalyst::Dispatcher::' . $env;
2544 }
2545
2546144µs1401µs unless ($dispatcher) {
# spent 401µs making 1 call to Catalyst::_dispatcher_class_accessor
2547 $dispatcher = $class->dispatcher_class;
2548 }
2549
255019µs1467ms Class::MOP::load_class($dispatcher);
# spent 467ms making 1 call to Class::MOP::load_class
2551
2552 # dispatcher instance
2553181µs21.41ms $class->dispatcher( $dispatcher->new );
# spent 958µs making 1 call to Catalyst::Dispatcher::new # spent 450µs making 1 call to Catalyst::_dispatcher_accessor
2554}
2555
2556=head2 $c->setup_engine
2557
2558Sets up engine.
2559
2560=cut
2561
2562
# spent 4.92ms (175µs+4.75) within Catalyst::setup_engine which was called # once (175µs+4.75ms) by Catalyst::setup at line 1081
sub setup_engine {
256313µs my ( $class, $engine ) = @_;
2564
256512µs if ($engine) {
2566 $engine = 'Catalyst::Engine::' . $engine;
2567 }
2568
2569112µs176µs if ( my $env = Catalyst::Utils::env_value( $class, 'ENGINE' ) ) {
# spent 76µs making 1 call to Catalyst::Utils::env_value
2570 $engine = 'Catalyst::Engine::' . $env;
2571 }
2572
257314µs if ( $ENV{MOD_PERL} ) {
2574 my $meta = Class::MOP::get_metaclass_by_name($class);
2575
2576 # create the apache method
2577 $meta->add_method('apache' => sub { shift->engine->apache });
2578
2579 my ( $software, $version ) =
2580 $ENV{MOD_PERL} =~ /^(\S+)\/(\d+(?:[\.\_]\d+)+)/;
2581
2582 $version =~ s/_//g;
2583 $version =~ s/(\.[^.]+)\./$1/g;
2584
2585 if ( $software eq 'mod_perl' ) {
2586
2587 if ( !$engine ) {
2588
2589 if ( $version >= 1.99922 ) {
2590 $engine = 'Catalyst::Engine::Apache2::MP20';
2591 }
2592
2593 elsif ( $version >= 1.9901 ) {
2594 $engine = 'Catalyst::Engine::Apache2::MP19';
2595 }
2596
2597 elsif ( $version >= 1.24 ) {
2598 $engine = 'Catalyst::Engine::Apache::MP13';
2599 }
2600
2601 else {
2602 Catalyst::Exception->throw( message =>
2603 qq/Unsupported mod_perl version: $ENV{MOD_PERL}/ );
2604 }
2605
2606 }
2607
2608 # install the correct mod_perl handler
2609 if ( $version >= 1.9901 ) {
2610 *handler = sub : method {
2611 shift->handle_request(@_);
2612 };
2613 }
2614 else {
2615 *handler = sub ($$) { shift->handle_request(@_) };
2616 }
2617
2618 }
2619
2620 elsif ( $software eq 'Zeus-Perl' ) {
2621 $engine = 'Catalyst::Engine::Zeus';
2622 }
2623
2624 else {
2625 Catalyst::Exception->throw(
2626 message => qq/Unsupported mod_perl: $ENV{MOD_PERL}/ );
2627 }
2628 }
2629
263011µs unless ($engine) {
2631 $engine = $class->engine_class;
2632 }
2633
2634175µs1326µs Class::MOP::load_class($engine);
# spent 326µs making 1 call to Class::MOP::load_class
2635
2636 # check for old engines that are no longer compatible
263712µs my $old_engine;
26381141µs488µs if ( $engine->isa('Catalyst::Engine::Apache')
# spent 88µs making 4 calls to UNIVERSAL::isa, avg 22µs/call
2639 && !Catalyst::Engine::Apache->VERSION )
2640 {
2641 $old_engine = 1;
2642 }
2643
2644 elsif ( $engine->isa('Catalyst::Engine::Server::Base')
2645 && Catalyst::Engine::Server->VERSION le '0.02' )
2646 {
2647 $old_engine = 1;
2648 }
2649
2650 elsif ($engine->isa('Catalyst::Engine::HTTP::POE')
2651 && $engine->VERSION eq '0.01' )
2652 {
2653 $old_engine = 1;
2654 }
2655
2656 elsif ($engine->isa('Catalyst::Engine::Zeus')
2657 && $engine->VERSION eq '0.01' )
2658 {
2659 $old_engine = 1;
2660 }
2661
266212µs if ($old_engine) {
2663 Catalyst::Exception->throw( message =>
2664 qq/Engine "$engine" is not supported by this version of Catalyst/
2665 );
2666 }
2667
2668 # engine instance
2669172µs24.26ms $class->engine( $engine->new );
# spent 4.12ms making 1 call to Moose::Object::new # spent 141µs making 1 call to Catalyst::_engine_accessor
2670}
2671
2672=head2 $c->setup_home
2673
2674Sets up the home directory.
2675
2676=cut
2677
2678
# spent 33.9ms (151µs+33.7) within Catalyst::setup_home which was called 2 times, avg 16.9ms/call: # once (112µs+26.1ms) by Catalyst::import at line 109 # once (39µs+7.59ms) by Catalyst::setup at line 1076
sub setup_home {
267925µs my ( $class, $home ) = @_;
2680
2681213µs2116µs if ( my $env = Catalyst::Utils::env_value( $class, 'HOME' ) ) {
# spent 116µs making 2 calls to Catalyst::Utils::env_value, avg 58µs/call
2682 $home = $env;
2683 }
2684
2685217µs228.3ms $home ||= Catalyst::Utils::home($class);
# spent 28.3ms making 2 calls to Catalyst::Utils::home, avg 14.2ms/call
2686
2687220µs if ($home) {
2688 #I remember recently being scolded for assigning config values like this
2689230µs21.92ms $class->config->{home} ||= $home;
# spent 1.92ms making 2 calls to Catalyst::config, avg 960µs/call
2690237µs53.36ms $class->config->{root} ||= Path::Class::Dir->new($home)->subdir('root');
# spent 2.44ms making 1 call to Path::Class::Dir::subdir # spent 517µs making 2 calls to Catalyst::config, avg 258µs/call # spent 402µs making 1 call to Path::Class::Dir::new # spent 4µs making 1 call to Path::Class::Entity::boolify
2691 }
2692}
2693
2694=head2 $c->setup_log
2695
2696Sets up log by instantiating a L<Catalyst::Log|Catalyst::Log> object and
2697passing it to C<log()>. Pass in a comma-delimited list of levels to set the
2698log to.
2699
2700This method also installs a C<debug> method that returns a true value into the
2701catalyst subclass if the "debug" level is passed in the comma-delimited list,
2702or if the C<$CATALYST_DEBUG> environment variable is set to a true value.
2703
2704Note that if the log has already been setup, by either a previous call to
2705C<setup_log> or by a call such as C<< __PACKAGE__->log( MyLogger->new ) >>,
2706that this method won't actually set up the log object.
2707
2708=cut
2709
2710
# spent 2.02ms (124µs+1.89) within Catalyst::setup_log which was called # once (124µs+1.89ms) by Catalyst::setup at line 1078
sub setup_log {
271112µs my ( $class, $levels ) = @_;
2712
271311µs $levels ||= '';
2714110µs11µs $levels =~ s/^\s+//;
# spent 1µs making 1 call to Catalyst::CORE:subst
271515µs11µs $levels =~ s/\s+$//;
# spent 1µs making 1 call to Catalyst::CORE:subst
271613µs my %levels = map { $_ => 1 } split /\s*,\s*/, $levels;
2717
271814µs131µs my $env_debug = Catalyst::Utils::env_value( $class, 'DEBUG' );
# spent 31µs making 1 call to Catalyst::Utils::env_value
271912µs if ( defined $env_debug ) {
272012µs $levels{debug} = 1 if $env_debug; # Ugly!
27211700ns delete($levels{debug}) unless $env_debug;
2722 }
2723
2724150µs31.62ms unless ( $class->log ) {
# spent 1.39ms making 1 call to Catalyst::Log::new # spent 233µs making 2 calls to Catalyst::_log_accessor, avg 117µs/call
2725 $class->log( Catalyst::Log->new(keys %levels) );
2726 }
2727
272818µs if ( $levels{debug} ) {
272929462µs295µs Class::MOP::get_metaclass_by_name($class)->add_method('debug' => sub { 1 });
# spent 92µs making 1 call to Class::MOP::Mixin::HasMethods::add_method # spent 3µs making 1 call to Class::MOP::get_metaclass_by_name
273018µs2145µs $class->log->debug('Debug messages enabled');
# spent 116µs making 1 call to Catalyst::Log::debug # spent 30µs making 1 call to Catalyst::_log_accessor
2731 }
2732}
2733
2734=head2 $c->setup_plugins
2735
2736Sets up plugins.
2737
2738=cut
2739
2740=head2 $c->setup_stats
2741
2742Sets up timing statistics class.
2743
2744=cut
2745
2746
# spent 65.5ms (262µs+65.3) within Catalyst::setup_stats which was called # once (262µs+65.3ms) by Catalyst::setup at line 1082
sub setup_stats {
274714µs my ( $class, $stats ) = @_;
2748
27491107µs264.7ms Catalyst::Utils::ensure_class_loaded($class->stats_class);
# spent 64.3ms making 1 call to Catalyst::Utils::ensure_class_loaded # spent 379µs making 1 call to Catalyst::_stats_class_accessor
2750
2751110µs172µs my $env = Catalyst::Utils::env_value( $class, 'STATS' );
# spent 72µs making 1 call to Catalyst::Utils::env_value
2752125µs17µs if ( defined($env) ? $env : ($stats || $class->debug ) ) {
# spent 7µs making 1 call to Epoll::debug
275329250µs2227µs Class::MOP::get_metaclass_by_name($class)->add_method('use_stats' => sub { 1 });
# spent 220µs making 1 call to Class::MOP::Mixin::HasMethods::add_method # spent 7µs making 1 call to Class::MOP::get_metaclass_by_name
2754159µs2252µs $class->log->debug('Statistics enabled');
# spent 139µs making 1 call to Catalyst::_log_accessor # spent 114µs making 1 call to Catalyst::Log::debug
2755 }
2756}
2757
2758
2759=head2 $c->registered_plugins
2760
2761Returns a sorted list of the plugins which have either been stated in the
2762import list or which have been added via C<< MyApp->plugin(@args); >>.
2763
2764If passed a given plugin name, it will report a boolean value indicating
2765whether or not that plugin is loaded. A fully qualified name is required if
2766the plugin name does not begin with C<Catalyst::Plugin::>.
2767
2768 if ($c->registered_plugins('Some::Plugin')) {
2769 ...
2770 }
2771
2772=cut
2773
2774{
2775
277612µs
# spent 247µs (160+87) within Catalyst::registered_plugins which was called # once (160µs+87µs) by Catalyst::setup at line 1109
sub registered_plugins {
277712µs my $proto = shift;
27781176µs288µs return sort keys %{ $proto->_plugins } unless @_;
# spent 76µs making 1 call to Catalyst::Component::__plugins_accessor # spent 11µs making 1 call to Catalyst::CORE:sort
2779 my $plugin = shift;
2780 return 1 if exists $proto->_plugins->{$plugin};
2781 return exists $proto->_plugins->{"Catalyst::Plugin::$plugin"};
2782 }
2783
2784
# spent 59.3ms (1.04+58.2) within Catalyst::_register_plugin which was called 6 times, avg 9.88ms/call: # 6 times (1.04ms+58.2ms) by Catalyst::setup_plugins at line 2817, avg 9.88ms/call
sub _register_plugin {
27856179µs my ( $proto, $plugin, $instant ) = @_;
2786613µs my $class = ref $proto || $proto;
2787
27886101µs61.21ms Class::MOP::load_class( $plugin );
# spent 1.21ms making 6 calls to Class::MOP::load_class, avg 202µs/call
27896170µs657µs $class->log->warn( "$plugin inherits from 'Catalyst::Component' - this is decated and will not work in 5.81" )
# spent 57µs making 6 calls to UNIVERSAL::isa, avg 9µs/call
2790 if $plugin->isa( 'Catalyst::Component' );
27916235µs6424µs $proto->_plugins->{$plugin} = 1;
# spent 424µs making 6 calls to Catalyst::Component::__plugins_accessor, avg 71µs/call
2792624µs unless ($instant) {
27933565µs294µs
# spent 58µs (21+37) within Catalyst::BEGIN@2793 which was called # once (21µs+37µs) by Epoll::BEGIN@17 at line 2793
no strict 'refs';
# spent 58µs making 1 call to Catalyst::BEGIN@2793 # spent 36µs making 1 call to strict::unimport
2794663µs642µs if ( my $meta = Class::MOP::get_metaclass_by_name($class) ) {
# spent 42µs making 6 calls to Class::MOP::get_metaclass_by_name, avg 7µs/call
27956177µs61.01ms my @superclasses = ($plugin, $meta->superclasses );
# spent 1.01ms making 6 calls to Moose::Meta::Class::superclasses, avg 169µs/call
2796667µs655.5ms $meta->superclasses(@superclasses);
# spent 55.5ms making 6 calls to Moose::Meta::Class::superclasses, avg 9.25ms/call
2797 } else {
2798 unshift @{"$class\::ISA"}, $plugin;
2799 }
2800 }
2801663µs return $class;
2802 }
2803
2804
# spent 847ms (801µs+847) within Catalyst::setup_plugins which was called # once (801µs+847ms) by Catalyst::setup at line 1079
sub setup_plugins {
280512µs my ( $class, $plugins ) = @_;
2806
2807114µs2150µs $class->_plugins( {} ) unless $class->_plugins;
# spent 150µs making 2 calls to Catalyst::Component::__plugins_accessor, avg 75µs/call
28081700ns $plugins ||= [];
2809
2810118µs1206µs my @plugins = Catalyst::Utils::resolve_namespace($class . '::Plugin', 'Catalyst::Plugin', @$plugins);
# spent 206µs making 1 call to Catalyst::Utils::resolve_namespace
2811
281215µs for my $plugin ( reverse @plugins ) {
2813754µs7701ms Class::MOP::load_class($plugin);
# spent 701ms making 7 calls to Class::MOP::load_class, avg 100ms/call
28147255µs7543µs my $meta = find_meta($plugin);
# spent 543µs making 7 calls to Moose::Util::find_meta, avg 78µs/call
2815764µs324µs next if $meta && $meta->isa('Moose::Meta::Role');
# spent 24µs making 3 calls to UNIVERSAL::isa, avg 8µs/call
2816
28176310µs659.3ms $class->_register_plugin($plugin);
# spent 59.3ms making 6 calls to Catalyst::_register_plugin, avg 9.88ms/call
2818 }
2819
2820119µs15µs my @roles =
# spent 5µs making 1 call to Class::MOP::Package::name
28217226µs14121µs map { $_->name }
# spent 91µs making 7 calls to UNIVERSAL::isa, avg 13µs/call # spent 30µs making 7 calls to Scalar::Util::blessed, avg 4µs/call
2822758µs7227µs grep { $_ && blessed($_) && $_->isa('Moose::Meta::Role') }
# spent 227µs making 7 calls to Moose::Util::find_meta, avg 32µs/call
2823137µs map { find_meta($_) }
2824 @plugins;
2825
2826124µs185.4ms Moose::Util::apply_all_roles(
# spent 85.4ms making 1 call to Moose::Util::apply_all_roles
2827 $class => @roles
2828 ) if @roles;
2829 }
2830}
2831
2832=head2 $c->stack
2833
2834Returns an arrayref of the internal execution stack (actions that are
2835currently executing).
2836
2837=head2 $c->stats_class
2838
2839Returns or sets the stats (timing statistics) class.
2840
2841=head2 $c->use_stats
2842
2843Returns 1 when stats collection is enabled. Stats collection is enabled
2844when the -Stats options is set, debug is on or when the <MYAPP>_STATS
2845environment variable is set.
2846
2847Note that this is a static method, not an accessor and should be overridden
2848by declaring C<sub use_stats { 1 }> in your MyApp.pm, not by calling C<< $c->use_stats(1) >>.
2849
2850=cut
2851
2852sub use_stats { 0 }
2853
2854
2855=head2 $c->write( $data )
2856
2857Writes $data to the output stream. When using this method directly, you
2858will need to manually set the C<Content-Length> header to the length of
2859your output data, if known.
2860
2861=cut
2862
2863sub write {
2864 my $c = shift;
2865
2866 # Finalize headers if someone manually writes output
2867 $c->finalize_headers;
2868
2869 return $c->engine->write( $c, @_ );
2870}
2871
2872=head2 version
2873
2874Returns the Catalyst version number. Mostly useful for "powered by"
2875messages in template systems.
2876
2877=cut
2878
2879sub version { return $Catalyst::VERSION }
2880
2881=head1 CONFIGURATION
2882
2883There are a number of 'base' config variables which can be set:
2884
2885=over
2886
2887=item *
2888
2889C<default_model> - The default model picked if you say C<< $c->model >>. See L<< /$c->model($name) >>.
2890
2891=item *
2892
2893C<default_view> - The default view to be rendered or returned when C<< $c->view >> is called. See L<< /$c->view($name) >>.
2894
2895=item *
2896
2897C<disable_component_resolution_regex_fallback> - Turns
2898off the deprecated component resolution functionality so
2899that if any of the component methods (e.g. C<< $c->controller('Foo') >>)
2900are called then regex search will not be attempted on string values and
2901instead C<undef> will be returned.
2902
2903=item *
2904
2905C<home> - The application home directory. In an uninstalled application,
2906this is the top level application directory. In an installed application,
2907this will be the directory containing C<< MyApp.pm >>.
2908
2909=item *
2910
2911C<ignore_frontend_proxy> - See L</PROXY SUPPORT>
2912
2913=item *
2914
2915C<name> - The name of the application in debug messages and the debug and
2916welcome screens
2917
2918=item *
2919
2920C<parse_on_demand> - The request body (for example file uploads) will not be parsed
2921until it is accessed. This allows you to (for example) check authentication (and reject
2922the upload) before actually recieving all the data. See L</ON-DEMAND PARSER>
2923
2924=item *
2925
2926C<root> - The root directory for templates. Usually this is just a
2927subdirectory of the home directory, but you can set it to change the
2928templates to a different directory.
2929
2930=item *
2931
2932C<search_extra> - Array reference passed to Module::Pluggable to for additional
2933namespaces from which components will be loaded (and constructed and stored in
2934C<< $c->components >>).
2935
2936=item *
2937
2938C<show_internal_actions> - If true, causes internal actions such as C<< _DISPATCH >>
2939to be shown in hit debug tables in the test server.
2940
2941=item *
2942
2943C<using_frontend_proxy> - See L</PROXY SUPPORT>.
2944
2945=back
2946
2947=head1 INTERNAL ACTIONS
2948
2949Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>,
2950C<_ACTION>, and C<_END>. These are by default not shown in the private
2951action table, but you can make them visible with a config parameter.
2952
2953 MyApp->config(show_internal_actions => 1);
2954
2955=head1 ON-DEMAND PARSER
2956
2957The request body is usually parsed at the beginning of a request,
2958but if you want to handle input yourself, you can enable on-demand
2959parsing with a config parameter.
2960
2961 MyApp->config(parse_on_demand => 1);
2962
2963=head1 PROXY SUPPORT
2964
2965Many production servers operate using the common double-server approach,
2966with a lightweight frontend web server passing requests to a larger
2967backend server. An application running on the backend server must deal
2968with two problems: the remote user always appears to be C<127.0.0.1> and
2969the server's hostname will appear to be C<localhost> regardless of the
2970virtual host that the user connected through.
2971
2972Catalyst will automatically detect this situation when you are running
2973the frontend and backend servers on the same machine. The following
2974changes are made to the request.
2975
2976 $c->req->address is set to the user's real IP address, as read from
2977 the HTTP X-Forwarded-For header.
2978
2979 The host value for $c->req->base and $c->req->uri is set to the real
2980 host, as read from the HTTP X-Forwarded-Host header.
2981
2982Additionally, you may be running your backend application on an insecure
2983connection (port 80) while your frontend proxy is running under SSL. If there
2984is a discrepancy in the ports, use the HTTP header C<X-Forwarded-Port> to
2985tell Catalyst what port the frontend listens on. This will allow all URIs to
2986be created properly.
2987
2988In the case of passing in:
2989
2990 X-Forwarded-Port: 443
2991
2992All calls to C<uri_for> will result in an https link, as is expected.
2993
2994Obviously, your web server must support these headers for this to work.
2995
2996In a more complex server farm environment where you may have your
2997frontend proxy server(s) on different machines, you will need to set a
2998configuration option to tell Catalyst to read the proxied data from the
2999headers.
3000
3001 MyApp->config(using_frontend_proxy => 1);
3002
3003If you do not wish to use the proxy support at all, you may set:
3004
3005 MyApp->config(ignore_frontend_proxy => 1);
3006
3007=head1 THREAD SAFETY
3008
3009Catalyst has been tested under Apache 2's threading C<mpm_worker>,
3010C<mpm_winnt>, and the standalone forking HTTP server on Windows. We
3011believe the Catalyst core to be thread-safe.
3012
3013If you plan to operate in a threaded environment, remember that all other
3014modules you are using must also be thread-safe. Some modules, most notably
3015L<DBD::SQLite>, are not thread-safe.
3016
3017=head1 SUPPORT
3018
3019IRC:
3020
3021 Join #catalyst on irc.perl.org.
3022
3023Mailing Lists:
3024
3025 http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
3026 http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst-dev
3027
3028Web:
3029
3030 http://catalyst.perl.org
3031
3032Wiki:
3033
3034 http://dev.catalyst.perl.org
3035
3036=head1 SEE ALSO
3037
3038=head2 L<Task::Catalyst> - All you need to start with Catalyst
3039
3040=head2 L<Catalyst::Manual> - The Catalyst Manual
3041
3042=head2 L<Catalyst::Component>, L<Catalyst::Controller> - Base classes for components
3043
3044=head2 L<Catalyst::Engine> - Core engine
3045
3046=head2 L<Catalyst::Log> - Log class.
3047
3048=head2 L<Catalyst::Request> - Request object
3049
3050=head2 L<Catalyst::Response> - Response object
3051
3052=head2 L<Catalyst::Test> - The test suite.
3053
3054=head1 PROJECT FOUNDER
3055
3056sri: Sebastian Riedel <sri@cpan.org>
3057
3058=head1 CONTRIBUTORS
3059
3060abw: Andy Wardley
3061
3062acme: Leon Brocard <leon@astray.com>
3063
3064abraxxa: Alexander Hartmaier <abraxxa@cpan.org>
3065
3066Andrew Bramble
3067
3068Andrew Ford E<lt>A.Ford@ford-mason.co.ukE<gt>
3069
3070Andrew Ruthven
3071
3072andyg: Andy Grundman <andy@hybridized.org>
3073
3074audreyt: Audrey Tang
3075
3076bricas: Brian Cassidy <bricas@cpan.org>
3077
3078Caelum: Rafael Kitover <rkitover@io.com>
3079
3080chansen: Christian Hansen
3081
3082chicks: Christopher Hicks
3083
3084Chisel Wright C<pause@herlpacker.co.uk>
3085
3086Danijel Milicevic C<me@danijel.de>
3087
3088David Kamholz E<lt>dkamholz@cpan.orgE<gt>
3089
3090David Naughton, C<naughton@umn.edu>
3091
3092David E. Wheeler
3093
3094dhoss: Devin Austin <dhoss@cpan.org>
3095
3096dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com>
3097
3098Drew Taylor
3099
3100dwc: Daniel Westermann-Clark <danieltwc@cpan.org>
3101
3102esskar: Sascha Kiefer
3103
3104fireartist: Carl Franks <cfranks@cpan.org>
3105
3106frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com>
3107
3108gabb: Danijel Milicevic
3109
3110Gary Ashton Jones
3111
3112Gavin Henry C<ghenry@perl.me.uk>
3113
3114Geoff Richards
3115
3116groditi: Guillermo Roditi <groditi@gmail.com>
3117
3118hobbs: Andrew Rodland <andrew@cleverdomain.org>
3119
3120ilmari: Dagfinn Ilmari Mannsåker <ilmari@ilmari.org>
3121
3122jcamacho: Juan Camacho
3123
3124jester: Jesse Sheidlower C<jester@panix.com>
3125
3126jhannah: Jay Hannah <jay@jays.net>
3127
3128Jody Belka
3129
3130Johan Lindstrom
3131
3132jon: Jon Schutz <jjschutz@cpan.org>
3133
3134Jonathan Rockway C<< <jrockway@cpan.org> >>
3135
3136Kieren Diment C<kd@totaldatasolution.com>
3137
3138konobi: Scott McWhirter <konobi@cpan.org>
3139
3140marcus: Marcus Ramberg <mramberg@cpan.org>
3141
3142miyagawa: Tatsuhiko Miyagawa <miyagawa@bulknews.net>
3143
3144mst: Matt S. Trout <mst@shadowcatsystems.co.uk>
3145
3146mugwump: Sam Vilain
3147
3148naughton: David Naughton
3149
3150ningu: David Kamholz <dkamholz@cpan.org>
3151
3152nothingmuch: Yuval Kogman <nothingmuch@woobling.org>
3153
3154numa: Dan Sully <daniel@cpan.org>
3155
3156obra: Jesse Vincent
3157
3158Octavian Rasnita
3159
3160omega: Andreas Marienborg
3161
3162Oleg Kostyuk <cub.uanic@gmail.com>
3163
3164phaylon: Robert Sedlacek <phaylon@dunkelheit.at>
3165
3166rafl: Florian Ragwitz <rafl@debian.org>
3167
3168random: Roland Lammel <lammel@cpan.org>
3169
3170Robert Sedlacek C<< <rs@474.at> >>
3171
3172sky: Arthur Bergman
3173
3174szbalint: Balint Szilakszi <szbalint@cpan.org>
3175
3176t0m: Tomas Doran <bobtfish@bobtfish.net>
3177
3178Ulf Edvinsson
3179
3180Viljo Marrandi C<vilts@yahoo.com>
3181
3182Will Hawes C<info@whawes.co.uk>
3183
3184willert: Sebastian Willert <willert@cpan.org>
3185
3186Yuval Kogman, C<nothingmuch@woobling.org>
3187
3188=head1 LICENSE
3189
3190This library is free software. You can redistribute it and/or modify it under
3191the same terms as Perl itself.
3192
3193=cut
3194
31953229µs2468µs
# spent 245µs (21+223) within Catalyst::BEGIN@3195 which was called # once (21µs+223µs) by Epoll::BEGIN@17 at line 3195
no Moose;
# spent 245µs making 1 call to Catalyst::BEGIN@3195 # spent 223µs making 1 call to Moose::Exporter::__ANON__[Moose/Exporter.pm:478]
3196
3197110µs28.21ms__PACKAGE__->meta->make_immutable;
# spent 8.19ms making 1 call to Class::MOP::Class::make_immutable # spent 22µs making 1 call to Catalyst::meta
3198
3199169µs1;
# spent 1.07ms (174µs+893µs) within Catalyst::CORE:ftdir which was called 6 times, avg 178µs/call: # 5 times (158µs+893µs) by Catalyst::path_to at line 990 of Catalyst.pm, avg 210µs/call # once (16µs+0s) by Catalyst::setup at line 1125 of Catalyst.pm
sub Catalyst::CORE:ftdir; # xsub
# spent 261µs within Catalyst::CORE:match which was called 74 times, avg 4µs/call: # 19 times (68µs+0s) by Catalyst::_stats_start_execute at line 1678 of Catalyst.pm, avg 4µs/call # 14 times (12µs+0s) by Catalyst::setup at line 1064 of Catalyst.pm, avg 829ns/call # 13 times (62µs+0s) by Catalyst::_stats_start_execute at line 1660 of Catalyst.pm, avg 5µs/call # 11 times (40µs+0s) by Catalyst::setup_components at line 2402 of Catalyst.pm, avg 4µs/call # 8 times (37µs+0s) by Catalyst::_stats_start_execute at line 1667 of Catalyst.pm, avg 5µs/call # 8 times (30µs+0s) by Catalyst::_stats_start_execute at line 1688 of Catalyst.pm, avg 4µs/call # once (11µs+0s) by Catalyst::finalize_headers at line 1846 of Catalyst.pm
sub Catalyst::CORE:match; # xsub
# spent 2.56ms within Catalyst::CORE:regcomp which was called 877 times, avg 3µs/call: # 877 times (2.56ms+0s) by Catalyst::uri_for at line 1286 of Catalyst.pm, avg 3µs/call
sub Catalyst::CORE:regcomp; # xsub
# spent 60µs within Catalyst::CORE:sort which was called 5 times, avg 12µs/call: # once (28µs+0s) by Catalyst::setup_components at line 2398 of Catalyst.pm # once (11µs+0s) by Catalyst::registered_plugins at line 2778 of Catalyst.pm # once (8µs+0s) by Catalyst::log_request_parameters at line 2220 of Catalyst.pm # once (8µs+0s) by Catalyst::setup at line 1148 of Catalyst.pm # once (5µs+0s) by Catalyst::setup at line 1084 of Catalyst.pm
sub Catalyst::CORE:sort; # xsub
# spent 50.1ms (38.6+11.6) within Catalyst::CORE:subst which was called 5168 times, avg 10µs/call: # 877 times (5.74ms+0s) by Catalyst::uri_for at line 1286 of Catalyst.pm, avg 7µs/call # 861 times (21.1ms+11.6ms) by Catalyst::uri_for at line 1330 of Catalyst.pm, avg 38µs/call # 861 times (3.59ms+0s) by Catalyst::uri_for at line 1316 of Catalyst.pm, avg 4µs/call # 861 times (2.60ms+0s) by Catalyst::uri_for at line 1326 of Catalyst.pm, avg 3µs/call # 861 times (2.32ms+0s) by Catalyst::uri_for at line 1327 of Catalyst.pm, avg 3µs/call # 839 times (3.12ms+0s) by Catalyst::uri_for at line 1319 of Catalyst.pm, avg 4µs/call # 6 times (44µs+0s) by Catalyst::locate_components at line 2454 of Catalyst.pm, avg 7µs/call # once (1µs+0s) by Catalyst::setup_log at line 2714 of Catalyst.pm # once (1µs+0s) by Catalyst::setup_log at line 2715 of Catalyst.pm
sub Catalyst::CORE:subst; # xsub