| File | /usr/lib/perl5/vendor_perl/5.10.1/Catalyst.pm |
| Statements Executed | 28205 |
| Statement Execution Time | 378ms |
| Calls | P | F | Exclusive Time |
Inclusive Time |
Subroutine |
|---|---|---|---|---|---|
| 861 | 20 | 6 | 250ms | 394ms | Catalyst::uri_for |
| 5168 | 9 | 2 | 38.6ms | 50.1ms | Catalyst::CORE:subst (opcode) |
| 904 | 21 | 12 | 22.4ms | 37.5ms | Catalyst::req |
| 1 | 1 | 1 | 9.08ms | 666ms | Catalyst::BEGIN@16 |
| 1 | 1 | 1 | 6.77ms | 62.0ms | Catalyst::BEGIN@15 |
| 1 | 1 | 1 | 4.24ms | 181ms | Catalyst::BEGIN@12 |
| 1 | 1 | 1 | 4.13ms | 4.58ms | Catalyst::BEGIN@26 |
| 1 | 1 | 1 | 3.58ms | 138ms | Catalyst::BEGIN@14 |
| 1 | 1 | 1 | 3.53ms | 15.7ms | Catalyst::BEGIN@19 |
| 1 | 1 | 1 | 2.92ms | 3.02ms | Catalyst::BEGIN@20 |
| 13 | 1 | 1 | 2.67ms | 23.7ms | Catalyst::_stats_start_execute |
| 877 | 1 | 2 | 2.56ms | 2.56ms | Catalyst::CORE:regcomp (opcode) |
| 13 | 1 | 1 | 2.50ms | 19.0s | Catalyst::execute |
| 1 | 1 | 1 | 2.42ms | 3.81s | Catalyst::setup |
| 1 | 1 | 1 | 2.09ms | 156ms | Catalyst::BEGIN@13 |
| 1 | 1 | 1 | 1.97ms | 38.8ms | Catalyst::BEGIN@11 |
| 1 | 1 | 1 | 1.51ms | 70.2ms | Catalyst::prepare |
| 1 | 1 | 1 | 1.44ms | 851ms | Catalyst::BEGIN@8 |
| 30 | 2 | 2 | 1.32ms | 6.16ms | Catalyst::prepare_body |
| 29 | 2 | 1 | 1.26ms | 1.61ms | Catalyst::_filter_component |
| 1 | 1 | 1 | 1.19ms | 1.38s | Catalyst::setup_components |
| 6 | 1 | 1 | 1.04ms | 59.3ms | Catalyst::_register_plugin |
| 1 | 1 | 1 | 986µs | 16.4ms | Catalyst::finalize_headers |
| 1 | 1 | 1 | 959µs | 2.95ms | Catalyst::BEGIN@27 |
| 11 | 1 | 1 | 885µs | 375ms | Catalyst::setup_component |
| 17 | 2 | 2 | 845µs | 3.11ms | Catalyst::component |
| 11 | 1 | 1 | 833µs | 1.80ms | Catalyst::_controller_init_base_classes |
| 1 | 1 | 1 | 801µs | 847ms | Catalyst::setup_plugins |
| 1 | 1 | 1 | 755µs | 84.3ms | Catalyst::BEGIN@9 |
| 1 | 1 | 1 | 716µs | 253ms | Catalyst::finalize |
| 10 | 6 | 3 | 516µs | 19.0s | Catalyst::forward |
| 12 | 10 | 7 | 512µs | 2.12ms | Catalyst::model |
| 1 | 1 | 1 | 414µs | 19.5s | Catalyst::handle_request |
| 1 | 1 | 1 | 393µs | 41.9ms | Catalyst::BEGIN@10 |
| 1 | 1 | 1 | 369µs | 44.1ms | Catalyst::log_request |
| 5 | 5 | 5 | 326µs | 7.47ms | Catalyst::path_to |
| 1 | 1 | 1 | 290µs | 469ms | Catalyst::setup_dispatcher |
| 1 | 1 | 1 | 283µs | 2.19ms | Catalyst::log_request_parameters |
| 13 | 1 | 1 | 279µs | 437µs | Catalyst::depth |
| 8 | 1 | 1 | 275µs | 6.04ms | Catalyst::_stats_finish_execute |
| 1 | 1 | 1 | 262µs | 65.5ms | Catalyst::setup_stats |
| 74 | 7 | 2 | 261µs | 261µs | Catalyst::CORE:match (opcode) |
| 4 | 4 | 4 | 234µs | 48.1ms | Catalyst::import |
| 1 | 1 | 1 | 218µs | 376µs | Catalyst::finalize_uploads |
| 7 | 2 | 2 | 191µs | 996µs | Catalyst::get_action |
| 1 | 1 | 1 | 178µs | 35.5ms | Catalyst::locate_components |
| 1 | 1 | 1 | 175µs | 4.92ms | Catalyst::setup_engine |
| 6 | 2 | 2 | 174µs | 1.07ms | Catalyst::CORE:ftdir (opcode) |
| 1 | 1 | 1 | 160µs | 247µs | Catalyst::registered_plugins |
| 2 | 2 | 1 | 151µs | 33.9ms | Catalyst::setup_home |
| 1 | 1 | 1 | 134µs | 23.8ms | Catalyst::__ANON__[:1189] |
| 1 | 1 | 1 | 124µs | 2.02ms | Catalyst::setup_log |
| 2 | 1 | 1 | 120µs | 1.54ms | Catalyst::dump_these |
| 5 | 4 | 3 | 118µs | 173µs | Catalyst::res |
| 1 | 1 | 1 | 118µs | 1.36ms | Catalyst::prepare_parameters |
| 1 | 1 | 1 | 107µs | 8.53ms | Catalyst::log_response |
| 1 | 1 | 1 | 100µs | 1.71ms | Catalyst::prepare_cookies |
| 1 | 1 | 1 | 94µs | 512ms | Catalyst::setup_actions |
| 3 | 3 | 1 | 92µs | 1.12ms | Catalyst::get_actions |
| 1 | 1 | 1 | 76µs | 704µs | Catalyst::prepare_body_chunk |
| 1 | 1 | 1 | 75µs | 185µs | Catalyst::setup_finalize |
| 1 | 1 | 1 | 72µs | 1.03ms | Catalyst::__ANON__[:42] |
| 5 | 5 | 2 | 70µs | 70µs | Catalyst::error |
| 1 | 1 | 1 | 70µs | 626µs | Catalyst::__ANON__[:43] |
| 5 | 5 | 2 | 60µs | 60µs | Catalyst::CORE:sort (opcode) |
| 1 | 1 | 1 | 59µs | 742µs | Catalyst::log_response_status_line |
| 1 | 1 | 1 | 59µs | 14.7ms | Catalyst::BEGIN@3 |
| 1 | 1 | 1 | 54µs | 19.0s | Catalyst::dispatch |
| 1 | 1 | 1 | 50µs | 1.92ms | Catalyst::finalize_cookies |
| 1 | 1 | 1 | 47µs | 58µs | Catalyst::BEGIN@28 |
| 1 | 1 | 1 | 46µs | 162ms | Catalyst::finalize_body |
| 1 | 1 | 1 | 46µs | 834µs | Catalyst::prepare_connection |
| 1 | 1 | 1 | 45µs | 566µs | Catalyst::prepare_uploads |
| 1 | 1 | 1 | 45µs | 184µs | Catalyst::prepare_query_parameters |
| 1 | 1 | 1 | 43µs | 43µs | Catalyst::BEGIN@21 |
| 1 | 1 | 1 | 41µs | 3.07ms | Catalyst::prepare_headers |
| 1 | 1 | 1 | 41µs | 57µs | Catalyst::log_request_uploads |
| 1 | 1 | 1 | 40µs | 1.04ms | Catalyst::BEGIN@6 |
| 1 | 1 | 1 | 40µs | 536µs | Catalyst::prepare_body_parameters |
| 1 | 1 | 1 | 40µs | 142µs | Catalyst::prepare_request |
| 1 | 1 | 1 | 39µs | 3.42ms | Catalyst::prepare_path |
| 1 | 1 | 1 | 36µs | 2.12ms | Catalyst::prepare_action |
| 1 | 1 | 1 | 33µs | 33µs | Catalyst::BEGIN@34 |
| 1 | 1 | 1 | 32µs | 660µs | Catalyst::prepare_read |
| 1 | 1 | 1 | 29µs | 132µs | Catalyst::BEGIN@18 |
| 1 | 1 | 1 | 25µs | 56µs | Catalyst::BEGIN@1135 |
| 1 | 1 | 1 | 25µs | 54µs | Catalyst::BEGIN@1628 |
| 1 | 1 | 1 | 24µs | 60µs | Catalyst::BEGIN@371 |
| 1 | 1 | 1 | 23µs | 99µs | Catalyst::BEGIN@30 |
| 1 | 1 | 1 | 21µs | 58µs | Catalyst::BEGIN@2793 |
| 1 | 1 | 1 | 21µs | 245µs | Catalyst::BEGIN@3195 |
| 1 | 1 | 1 | 20µs | 26µs | Catalyst::BEGIN@24 |
| 1 | 1 | 1 | 19µs | 84µs | Catalyst::BEGIN@29 |
| 1 | 1 | 1 | 19µs | 27µs | Catalyst::BEGIN@31 |
| 1 | 1 | 1 | 19µs | 19µs | Catalyst::BEGIN@4 |
| 1 | 1 | 1 | 19µs | 127µs | Catalyst::BEGIN@32 |
| 1 | 1 | 1 | 17µs | 17µs | Catalyst::BEGIN@7 |
| 1 | 1 | 1 | 16µs | 19µs | Catalyst::BEGIN@25 |
| 1 | 1 | 1 | 15µs | 32µs | Catalyst::BEGIN@1644 |
| 1 | 1 | 1 | 14µs | 14µs | Catalyst::BEGIN@17 |
| 1 | 1 | 1 | 10µs | 10µs | Catalyst::__ANON__[:41] |
| 1 | 1 | 1 | 9µs | 9µs | Catalyst::BEGIN@23 |
| 1 | 1 | 1 | 9µs | 9µs | Catalyst::BEGIN@22 |
| 1 | 1 | 1 | 8µs | 8µs | Catalyst::__ANON__[:36] |
| 1 | 1 | 1 | 8µs | 8µs | Catalyst::__ANON__[:37] |
| 1 | 1 | 1 | 6µs | 6µs | Catalyst::__ANON__[:1136] |
| 1 | 1 | 1 | 6µs | 6µs | Catalyst::log_request_headers |
| 1 | 1 | 1 | 3µs | 3µs | Catalyst::log_response_headers |
| 0 | 0 | 0 | 0s | 0s | Catalyst::__ANON__[:105] |
| 0 | 0 | 0 | 0s | 0s | Catalyst::__ANON__[:2287] |
| 0 | 0 | 0 | 0s | 0s | Catalyst::__ANON__[:2577] |
| 0 | 0 | 0 | 0s | 0s | Catalyst::__ANON__[:2612] |
| 0 | 0 | 0 | 0s | 0s | Catalyst::__ANON__[:2615] |
| 0 | 0 | 0 | 0s | 0s | Catalyst::__ANON__[:2729] |
| 0 | 0 | 0 | 0s | 0s | Catalyst::__ANON__[:2753] |
| 0 | 0 | 0 | 0s | 0s | Catalyst::__ANON__[:474] |
| 0 | 0 | 0 | 0s | 0s | Catalyst::__ANON__[:917] |
| 0 | 0 | 0 | 0s | 0s | Catalyst::_application |
| 0 | 0 | 0 | 0s | 0s | Catalyst::_comp_names |
| 0 | 0 | 0 | 0s | 0s | Catalyst::_comp_names_search_prefixes |
| 0 | 0 | 0 | 0s | 0s | Catalyst::_comp_search_prefixes |
| 0 | 0 | 0 | 0s | 0s | Catalyst::clear_errors |
| 0 | 0 | 0 | 0s | 0s | Catalyst::comp |
| 0 | 0 | 0 | 0s | 0s | Catalyst::controller |
| 0 | 0 | 0 | 0s | 0s | Catalyst::controllers |
| 0 | 0 | 0 | 0s | 0s | Catalyst::debug |
| 0 | 0 | 0 | 0s | 0s | Catalyst::detach |
| 0 | 0 | 0 | 0s | 0s | Catalyst::expand_component_module |
| 0 | 0 | 0 | 0s | 0s | Catalyst::finalize_error |
| 0 | 0 | 0 | 0s | 0s | Catalyst::finalize_output |
| 0 | 0 | 0 | 0s | 0s | Catalyst::finalize_read |
| 0 | 0 | 0 | 0s | 0s | Catalyst::go |
| 0 | 0 | 0 | 0s | 0s | Catalyst::log_headers |
| 0 | 0 | 0 | 0s | 0s | Catalyst::models |
| 0 | 0 | 0 | 0s | 0s | Catalyst::plugin |
| 0 | 0 | 0 | 0s | 0s | Catalyst::prepare_write |
| 0 | 0 | 0 | 0s | 0s | Catalyst::read |
| 0 | 0 | 0 | 0s | 0s | Catalyst::run |
| 0 | 0 | 0 | 0s | 0s | Catalyst::set_action |
| 0 | 0 | 0 | 0s | 0s | Catalyst::uri_for_action |
| 0 | 0 | 0 | 0s | 0s | Catalyst::use_stats |
| 0 | 0 | 0 | 0s | 0s | Catalyst::version |
| 0 | 0 | 0 | 0s | 0s | Catalyst::view |
| 0 | 0 | 0 | 0s | 0s | Catalyst::views |
| 0 | 0 | 0 | 0s | 0s | Catalyst::visit |
| 0 | 0 | 0 | 0s | 0s | Catalyst::welcome_message |
| 0 | 0 | 0 | 0s | 0s | Catalyst::write |
| Line | State ments |
Time on line |
Calls | Time in subs |
Code |
|---|---|---|---|---|---|
| 1 | package Catalyst; | ||||
| 2 | |||||
| 3 | 3 | 119µs | 2 | 29.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 # spent 14.7ms making 1 call to Catalyst::BEGIN@3
# spent 14.7ms making 1 call to Moose::Exporter::__ANON__[Moose/Exporter.pm:389] |
| 4 | 3 | 1.01ms | 1 | 19µs | # spent 19µs within Catalyst::BEGIN@4 which was called
# once (19µs+0s) by Epoll::BEGIN@17 at line 4 # spent 19µs making 1 call to Catalyst::BEGIN@4 |
| 5 | 1 | 6µs | 1 | 856µs | extends 'Catalyst::Component'; # spent 856µs making 1 call to Moose::extends |
| 6 | 3 | 102µs | 2 | 2.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 # spent 1.04ms making 1 call to Catalyst::BEGIN@6
# spent 1.00ms making 1 call to Sub::Exporter::__ANON__[Sub/Exporter.pm:756] |
| 7 | 3 | 74µs | 1 | 17µs | # spent 17µs within Catalyst::BEGIN@7 which was called
# once (17µs+0s) by Epoll::BEGIN@17 at line 7 # spent 17µs making 1 call to Catalyst::BEGIN@7 |
| 8 | 3 | 520µs | 2 | 851ms | # spent 851ms (1.44+849) within Catalyst::BEGIN@8 which was called
# once (1.44ms+849ms) by Epoll::BEGIN@17 at line 8 # spent 851ms making 1 call to Catalyst::BEGIN@8
# spent 8µs making 1 call to UNIVERSAL::import |
| 9 | 3 | 375µs | 2 | 84.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 # spent 84.3ms making 1 call to Catalyst::BEGIN@9
# spent 4µs making 1 call to UNIVERSAL::import |
| 10 | 3 | 211µs | 2 | 41.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 # spent 41.9ms making 1 call to Catalyst::BEGIN@10
# spent 4µs making 1 call to UNIVERSAL::import |
| 11 | 3 | 230µs | 2 | 38.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 # spent 38.8ms making 1 call to Catalyst::BEGIN@11
# spent 4µs making 1 call to UNIVERSAL::import |
| 12 | 3 | 314µs | 2 | 181ms | # spent 181ms (4.24+177) within Catalyst::BEGIN@12 which was called
# once (4.24ms+177ms) by Epoll::BEGIN@17 at line 12 # spent 181ms making 1 call to Catalyst::BEGIN@12
# spent 6µs making 1 call to UNIVERSAL::import |
| 13 | 3 | 512µs | 2 | 156ms | # spent 156ms (2.09+154) within Catalyst::BEGIN@13 which was called
# once (2.09ms+154ms) by Epoll::BEGIN@17 at line 13 # spent 156ms making 1 call to Catalyst::BEGIN@13
# spent 8µs making 1 call to UNIVERSAL::import |
| 14 | 3 | 492µs | 2 | 138ms | # spent 138ms (3.58+134) within Catalyst::BEGIN@14 which was called
# once (3.58ms+134ms) by Epoll::BEGIN@17 at line 14 # spent 138ms making 1 call to Catalyst::BEGIN@14
# spent 8µs making 1 call to UNIVERSAL::import |
| 15 | 3 | 823µs | 2 | 62.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 # spent 62.0ms making 1 call to Catalyst::BEGIN@15
# spent 9µs making 1 call to UNIVERSAL::import |
| 16 | 3 | 607µs | 2 | 666ms | # spent 666ms (9.08+657) within Catalyst::BEGIN@16 which was called
# once (9.08ms+657ms) by Epoll::BEGIN@17 at line 16 # spent 666ms making 1 call to Catalyst::BEGIN@16
# spent 4µs making 1 call to UNIVERSAL::import |
| 17 | 3 | 44µs | 1 | 14µs | # spent 14µs within Catalyst::BEGIN@17 which was called
# once (14µs+0s) by Epoll::BEGIN@17 at line 17 # spent 14µs making 1 call to Catalyst::BEGIN@17 |
| 18 | 3 | 43µs | 2 | 140µ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 # spent 132µs making 1 call to Catalyst::BEGIN@18
# spent 8µs making 1 call to File::stat::import |
| 19 | 3 | 249µs | 1 | 15.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 # spent 15.7ms making 1 call to Catalyst::BEGIN@19 |
| 20 | 3 | 259µs | 1 | 3.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 # spent 3.02ms making 1 call to Catalyst::BEGIN@20 |
| 21 | 3 | 37µs | 1 | 43µs | # spent 43µs within Catalyst::BEGIN@21 which was called
# once (43µs+0s) by Epoll::BEGIN@17 at line 21 # spent 43µs making 1 call to Catalyst::BEGIN@21 |
| 22 | 3 | 34µs | 1 | 9µs | # spent 9µs within Catalyst::BEGIN@22 which was called
# once (9µs+0s) by Epoll::BEGIN@17 at line 22 # spent 9µs making 1 call to Catalyst::BEGIN@22 |
| 23 | 3 | 35µs | 1 | 9µs | # spent 9µs within Catalyst::BEGIN@23 which was called
# once (9µs+0s) by Epoll::BEGIN@17 at line 23 # spent 9µs making 1 call to Catalyst::BEGIN@23 |
| 24 | 3 | 44µs | 2 | 31µ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 # spent 26µs making 1 call to Catalyst::BEGIN@24
# spent 6µs making 1 call to UNIVERSAL::import |
| 25 | 3 | 42µs | 2 | 22µ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 # spent 19µs making 1 call to Catalyst::BEGIN@25
# spent 3µs making 1 call to UNIVERSAL::import |
| 26 | 3 | 299µs | 2 | 4.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 # spent 4.58ms making 1 call to Catalyst::BEGIN@26
# spent 14µs making 1 call to Tree::Simple::import |
| 27 | 3 | 209µs | 2 | 2.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 # spent 2.95ms making 1 call to Catalyst::BEGIN@27
# spent 5µs making 1 call to UNIVERSAL::import |
| 28 | 3 | 56µs | 2 | 69µ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 # spent 58µs making 1 call to Catalyst::BEGIN@28
# spent 11µs making 1 call to Class::C3::Adopt::NEXT::import |
| 29 | 3 | 44µs | 2 | 149µ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 # spent 84µs making 1 call to Catalyst::BEGIN@29
# spent 65µs making 1 call to Exporter::import |
| 30 | 3 | 43µs | 2 | 108µ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 # spent 99µs making 1 call to Catalyst::BEGIN@30
# spent 9µs making 1 call to attributes::import |
| 31 | 3 | 50µs | 2 | 35µ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 # spent 27µs making 1 call to Catalyst::BEGIN@31
# spent 8µs making 1 call to utf8::import |
| 32 | 3 | 47µs | 2 | 235µ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 # spent 127µs making 1 call to Catalyst::BEGIN@32
# spent 108µs making 1 call to Exporter::import |
| 33 | |||||
| 34 | 1 | 1.23ms | 1 | 33µs | # spent 33µs within Catalyst::BEGIN@34 which was called
# once (33µs+0s) by Epoll::BEGIN@17 at line 34 # spent 33µs making 1 call to Catalyst::BEGIN@34 |
| 35 | |||||
| 36 | 2 | 23µs | 1 | 2.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 # spent 2.82ms making 1 call to Moose::has |
| 37 | 2 | 20µs | 1 | 3.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 # spent 3.10ms making 1 call to Moose::has |
| 38 | 1 | 4µs | 1 | 3.25ms | has state => (is => 'rw', default => 0); # spent 3.25ms making 1 call to Moose::has |
| 39 | 1 | 4µs | 1 | 2.67ms | has stats => (is => 'rw'); # spent 2.67ms making 1 call to Moose::has |
| 40 | 1 | 4µs | 1 | 3.02ms | has action => (is => 'rw'); # spent 3.02ms making 1 call to Moose::has |
| 41 | 2 | 195µs | 1 | 2.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 # spent 2.78ms making 1 call to Moose::has |
| 42 | 2 | 72µs | 3 | 4.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 # 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 |
| 43 | 2 | 71µs | 3 | 3.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 # 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 |
| 44 | 1 | 4µs | 1 | 3.14ms | has namespace => (is => 'rw'); # spent 3.14ms making 1 call to Moose::has |
| 45 | |||||
| 46 | 13 | 302µs | 13 | 158µ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 # spent 158µs making 13 calls to Catalyst::stack, avg 12µs/call |
| 47 | sub 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 | ||||
| 50 | 1808 | 18.8ms | 904 | 15.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 | ||||
| 53 | 10 | 86µs | 5 | 54µ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 | ||||
| 57 | sub finalize_output { shift->finalize_body(@_) }; | ||||
| 58 | |||||
| 59 | # For statistics | ||||
| 60 | 1 | 1µs | our $COUNT = 1; | ||
| 61 | 1 | 2µs | our $START = time; | ||
| 62 | 1 | 700ns | our $RECURSION = 1000; | ||
| 63 | 1 | 11µs | 1 | 169µs | our $DETACH = Catalyst::Exception::Detach->new; # spent 169µs making 1 call to Catalyst::Exception::Detach::new |
| 64 | 1 | 9µs | 1 | 144µs | our $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($_) | ||||
| 69 | 1 | 57µs | 12 | 2.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 | ||||
| 71 | 1 | 600ns | setup_finished/; | ||
| 72 | |||||
| 73 | 1 | 4µs | 1 | 67µs | __PACKAGE__->dispatcher_class('Catalyst::Dispatcher'); # spent 67µs making 1 call to Catalyst::_dispatcher_class_accessor |
| 74 | 1 | 4µs | 1 | 86µs | __PACKAGE__->engine_class('Catalyst::Engine::CGI'); # spent 86µs making 1 call to Catalyst::_engine_class_accessor |
| 75 | 1 | 4µs | 1 | 41µs | __PACKAGE__->request_class('Catalyst::Request'); # spent 41µs making 1 call to Catalyst::_request_class_accessor |
| 76 | 1 | 4µs | 1 | 38µs | __PACKAGE__->response_class('Catalyst::Response'); # spent 38µs making 1 call to Catalyst::_response_class_accessor |
| 77 | 1 | 3µs | 1 | 36µ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 | |||||
| 81 | 1 | 1µs | our $VERSION = '5.80022'; | ||
| 82 | 1 | 900ns | our $PRETTY_VERSION = $VERSION; | ||
| 83 | |||||
| 84 | 1 | 45µ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 | ||||
| 87 | 4 | 18µs | my ( $class, @arguments ) = @_; | ||
| 88 | |||||
| 89 | # We have to limit $class to Catalyst to avoid pushing Catalyst upon every | ||||
| 90 | # callers @ISA. | ||||
| 91 | 4 | 50µs | return unless $class eq 'Catalyst'; | ||
| 92 | |||||
| 93 | 1 | 2µs | my $caller = caller(); | ||
| 94 | 1 | 700ns | return if $caller eq 'main'; | ||
| 95 | |||||
| 96 | 1 | 4µs | 1 | 1.66ms | my $meta = Moose::Meta::Class->initialize($caller); # spent 1.66ms making 1 call to Moose::Meta::Class::initialize |
| 97 | 1 | 15µs | 1 | 3µs | unless ( $caller->isa('Catalyst') ) { # spent 3µs making 1 call to UNIVERSAL::isa |
| 98 | 1 | 5µs | 1 | 43µs | my @superclasses = ($meta->superclasses, $class, 'Catalyst::Controller'); # spent 43µs making 1 call to Moose::Meta::Class::superclasses |
| 99 | 1 | 4µs | 1 | 14.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 | ||||
| 102 | 1 | 10µs | 2 | 1.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 | |||||
| 104 | 1 | 29µs | 2 | 3.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 | |||||
| 108 | 1 | 29µs | 1 | 103µs | $caller->arguments( [@arguments] ); # spent 103µs making 1 call to Catalyst::_arguments_accessor |
| 109 | 1 | 28µs | 1 | 26.3ms | $caller->setup_home; # spent 26.3ms making 1 call to Catalyst::setup_home |
| 110 | } | ||||
| 111 | |||||
| 112 | sub _application { $_[0] } | ||||
| 113 | |||||
| 114 | =head1 NAME | ||||
| 115 | |||||
| 116 | Catalyst - The Elegant MVC Web Application Framework | ||||
| 117 | |||||
| 118 | =head1 SYNOPSIS | ||||
| 119 | |||||
| 120 | See the L<Catalyst::Manual> distribution for comprehensive | ||||
| 121 | documentation 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 | |||||
| 205 | See L<Catalyst::Manual::Intro> for additional information. | ||||
| 206 | |||||
| 207 | =head1 DESCRIPTION | ||||
| 208 | |||||
| 209 | Catalyst is a modern framework for making web applications without the | ||||
| 210 | pain usually associated with this process. This document is a reference | ||||
| 211 | to the main Catalyst application. If you are a new user, we suggest you | ||||
| 212 | start with L<Catalyst::Manual::Tutorial> or L<Catalyst::Manual::Intro>. | ||||
| 213 | |||||
| 214 | See L<Catalyst::Manual> for more documentation. | ||||
| 215 | |||||
| 216 | Catalyst plugins can be loaded by naming them as arguments to the "use | ||||
| 217 | Catalyst" statement. Omit the C<Catalyst::Plugin::> prefix from the | ||||
| 218 | plugin name, i.e., C<Catalyst::Plugin::My::Module> becomes | ||||
| 219 | C<My::Module>. | ||||
| 220 | |||||
| 221 | use Catalyst qw/My::Module/; | ||||
| 222 | |||||
| 223 | If your plugin starts with a name other than C<Catalyst::Plugin::>, you can | ||||
| 224 | fully qualify the name by using a unary plus: | ||||
| 225 | |||||
| 226 | use Catalyst qw/ | ||||
| 227 | My::Module | ||||
| 228 | +Fully::Qualified::Plugin::Name | ||||
| 229 | /; | ||||
| 230 | |||||
| 231 | Special flags like C<-Debug> and C<-Engine> can also be specified as | ||||
| 232 | arguments when Catalyst is loaded: | ||||
| 233 | |||||
| 234 | use Catalyst qw/-Debug My::Module/; | ||||
| 235 | |||||
| 236 | The position of plugins and flags in the chain is important, because | ||||
| 237 | they are loaded in the order in which they appear. | ||||
| 238 | |||||
| 239 | The following flags are supported: | ||||
| 240 | |||||
| 241 | =head2 -Debug | ||||
| 242 | |||||
| 243 | Enables debug output. You can also force this setting from the system | ||||
| 244 | environment with CATALYST_DEBUG or <MYAPP>_DEBUG. The environment | ||||
| 245 | settings override the application, with <MYAPP>_DEBUG having the highest | ||||
| 246 | priority. | ||||
| 247 | |||||
| 248 | This sets the log level to 'debug' and enables full debug output on the | ||||
| 249 | error screen. If you only want the latter, see L<< $c->debug >>. | ||||
| 250 | |||||
| 251 | =head2 -Engine | ||||
| 252 | |||||
| 253 | Forces Catalyst to use a specific engine. Omit the | ||||
| 254 | C<Catalyst::Engine::> prefix of the engine name, i.e.: | ||||
| 255 | |||||
| 256 | use Catalyst qw/-Engine=CGI/; | ||||
| 257 | |||||
| 258 | =head2 -Home | ||||
| 259 | |||||
| 260 | Forces Catalyst to use a specific home directory, e.g.: | ||||
| 261 | |||||
| 262 | use Catalyst qw[-Home=/usr/mst]; | ||||
| 263 | |||||
| 264 | This can also be done in the shell environment by setting either the | ||||
| 265 | C<CATALYST_HOME> environment variable or C<MYAPP_HOME>; where C<MYAPP> | ||||
| 266 | is replaced with the uppercased name of your application, any "::" in | ||||
| 267 | the name will be replaced with underscores, e.g. MyApp::Web should use | ||||
| 268 | MYAPP_WEB_HOME. If both variables are set, the MYAPP_HOME one will be used. | ||||
| 269 | |||||
| 270 | If none of these are set, Catalyst will attempt to automatically detect the | ||||
| 271 | home directory. If you are working in a development envirnoment, Catalyst | ||||
| 272 | will try and find the directory containing either Makefile.PL, Build.PL or | ||||
| 273 | dist.ini. If the application has been installed into the system (i.e. | ||||
| 274 | you have done C<make install>), then Catalyst will use the path to your | ||||
| 275 | application module, without the .pm extension (ie, /foo/MyApp if your | ||||
| 276 | application was installed at /foo/MyApp.pm) | ||||
| 277 | |||||
| 278 | =head2 -Log | ||||
| 279 | |||||
| 280 | use Catalyst '-Log=warn,fatal,error'; | ||||
| 281 | |||||
| 282 | Specifies a comma-delimited list of log levels. | ||||
| 283 | |||||
| 284 | =head2 -Stats | ||||
| 285 | |||||
| 286 | Enables statistics collection and reporting. You can also force this setting | ||||
| 287 | from the system environment with CATALYST_STATS or <MYAPP>_STATS. The | ||||
| 288 | environment settings override the application, with <MYAPP>_STATS having the | ||||
| 289 | highest priority. | ||||
| 290 | |||||
| 291 | e.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 | |||||
| 301 | Returns a L<Catalyst::Action> object for the current action, which | ||||
| 302 | stringifies to the action name. See L<Catalyst::Action>. | ||||
| 303 | |||||
| 304 | =head2 $c->namespace | ||||
| 305 | |||||
| 306 | Returns the namespace of the current action, i.e., the URI prefix | ||||
| 307 | corresponding 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 | |||||
| 316 | Returns the current L<Catalyst::Request> object, giving access to | ||||
| 317 | information about the current client request (including parameters, | ||||
| 318 | cookies, 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 | |||||
| 326 | Forwards processing to another action, by its private name. If you give a | ||||
| 327 | class name but no method, C<process()> is called. You may also optionally | ||||
| 328 | pass arguments in an arrayref. The action will receive the arguments in | ||||
| 329 | C<@_> and C<< $c->req->args >>. Upon returning from the function, | ||||
| 330 | C<< $c->req->args >> will be restored to the previous values. | ||||
| 331 | |||||
| 332 | Any data C<return>ed from the action forwarded to, will be returned by the | ||||
| 333 | call 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 | |||||
| 340 | Note that L<< forward|/"$c->forward( $action [, \@arguments ] )" >> implies | ||||
| 341 | an C<< eval { } >> around the call (actually | ||||
| 342 | L<< execute|/"$c->execute( $class, $coderef )" >> does), thus de-fatalizing | ||||
| 343 | all 'dies' within the called action. If you want C<die> to propagate you | ||||
| 344 | need to do something like: | ||||
| 345 | |||||
| 346 | $c->forward('foo'); | ||||
| 347 | die join "\n", @{ $c->error } if @{ $c->error }; | ||||
| 348 | |||||
| 349 | Or make sure to always return true values from your actions and write | ||||
| 350 | your code like this: | ||||
| 351 | |||||
| 352 | $c->forward('foo') || return; | ||||
| 353 | |||||
| 354 | Another note is that C<< $c->forward >> always returns a scalar because it | ||||
| 355 | actually returns $c->state which operates in a scalar context. | ||||
| 356 | Thus, something like: | ||||
| 357 | |||||
| 358 | return @array; | ||||
| 359 | |||||
| 360 | in an action that is forwarded to is going to return a scalar, | ||||
| 361 | i.e. how many items are in that array, which is probably not what you want. | ||||
| 362 | If you need to return an array then return a reference to it, | ||||
| 363 | or stash it like so: | ||||
| 364 | |||||
| 365 | $c->stash->{array} = \@array; | ||||
| 366 | |||||
| 367 | and access it from the stash. | ||||
| 368 | |||||
| 369 | =cut | ||||
| 370 | |||||
| 371 | 23 | 4.50ms | 22 | 19.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 # 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 | |||||
| 379 | The same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, but | ||||
| 380 | doesn't return to the previous action when processing is finished. | ||||
| 381 | |||||
| 382 | When called with no arguments it escapes the processing chain entirely. | ||||
| 383 | |||||
| 384 | =cut | ||||
| 385 | |||||
| 386 | sub 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 | |||||
| 392 | Almost the same as L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, | ||||
| 393 | but does a full dispatch, instead of just calling the new C<$action> / | ||||
| 394 | C<< $class->$method >>. This means that C<begin>, C<auto> and the method | ||||
| 395 | you go to are called, just like a new request. | ||||
| 396 | |||||
| 397 | In addition both C<< $c->action >> and C<< $c->namespace >> are localized. | ||||
| 398 | This means, for example, that C<< $c->action >> methods such as | ||||
| 399 | L<name|Catalyst::Action/name>, L<class|Catalyst::Action/class> and | ||||
| 400 | L<reverse|Catalyst::Action/reverse> return information for the visited action | ||||
| 401 | when they are invoked within the visited action. This is different from the | ||||
| 402 | behavior of L<< forward|/"$c->forward( $action [, \@arguments ] )" >>, which | ||||
| 403 | continues to use the $c->action object from the caller action even when | ||||
| 404 | invoked from the callee. | ||||
| 405 | |||||
| 406 | C<< $c->stash >> is kept unchanged. | ||||
| 407 | |||||
| 408 | In effect, L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >> | ||||
| 409 | allows you to "wrap" another action, just as it would have been called by | ||||
| 410 | dispatching from a URL, while the analogous | ||||
| 411 | L<< go|/"$c->go( $action [, \@captures, \@arguments ] )" >> allows you to | ||||
| 412 | transfer control to another action as if it had been reached directly from a URL. | ||||
| 413 | |||||
| 414 | =cut | ||||
| 415 | |||||
| 416 | sub 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 | |||||
| 422 | The relationship between C<go> and | ||||
| 423 | L<< visit|/"$c->visit( $action [, \@captures, \@arguments ] )" >> is the same as | ||||
| 424 | the relationship between | ||||
| 425 | L<< forward|/"$c->forward( $class, $method, [, \@arguments ] )" >> and | ||||
| 426 | L<< detach|/"$c->detach( $action [, \@arguments ] )" >>. Like C<< $c->visit >>, | ||||
| 427 | C<< $c->go >> will perform a full dispatch on the specified action or method, | ||||
| 428 | with localized C<< $c->action >> and C<< $c->namespace >>. Like C<detach>, | ||||
| 429 | C<go> escapes the processing of the current request chain on completion, and | ||||
| 430 | does not return to its caller. | ||||
| 431 | |||||
| 432 | =cut | ||||
| 433 | |||||
| 434 | sub go { my $c = shift; $c->dispatcher->go( $c, @_ ) } | ||||
| 435 | |||||
| 436 | =head2 $c->response | ||||
| 437 | |||||
| 438 | =head2 $c->res | ||||
| 439 | |||||
| 440 | Returns the current L<Catalyst::Response> object, see there for details. | ||||
| 441 | |||||
| 442 | =head2 $c->stash | ||||
| 443 | |||||
| 444 | Returns a hashref to the stash, which may be used to store data and pass | ||||
| 445 | it between components during a request. You can also set hash keys by | ||||
| 446 | passing arguments. The stash is automatically sent to the view. The | ||||
| 447 | stash is cleared at the end of a request; it cannot be used for | ||||
| 448 | persistent storage (for this you must use a session; see | ||||
| 449 | L<Catalyst::Plugin::Session> for a complete system integrated with | ||||
| 450 | Catalyst). | ||||
| 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 | |||||
| 461 | around stash => sub { | ||||
| 462 | 13 | 79µs | my $orig = shift; | ||
| 463 | 13 | 21µs | my $c = shift; | ||
| 464 | 13 | 221µs | 13 | 118µs | my $stash = $orig->($c); # spent 118µs making 13 calls to Catalyst::stash, avg 9µs/call |
| 465 | 13 | 21µ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 | |||||
| 473 | 13 | 422µs | return $stash; | ||
| 474 | 1 | 12µs | 1 | 816µ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 | |||||
| 483 | Returns an arrayref containing error messages. If Catalyst encounters an | ||||
| 484 | error while processing a request, it stores the error in $c->error. This | ||||
| 485 | method should only be used to store fatal error messages. | ||||
| 486 | |||||
| 487 | my @error = @{ $c->error }; | ||||
| 488 | |||||
| 489 | Add 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 | ||||
| 496 | 5 | 11µs | my $c = shift; | ||
| 497 | 5 | 12µ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 } | ||||
| 503 | 5 | 380µs | return $c->{error} || []; | ||
| 504 | } | ||||
| 505 | |||||
| 506 | |||||
| 507 | =head2 $c->state | ||||
| 508 | |||||
| 509 | Contains the return value of the last executed action. | ||||
| 510 | Note that << $c->state >> operates in a scalar context which means that all | ||||
| 511 | values it returns are scalar. | ||||
| 512 | |||||
| 513 | =head2 $c->clear_errors | ||||
| 514 | |||||
| 515 | Clear errors. You probably don't want to clear the errors unless you are | ||||
| 516 | implementing a custom error screen. | ||||
| 517 | |||||
| 518 | This is equivalent to running | ||||
| 519 | |||||
| 520 | $c->error(0); | ||||
| 521 | |||||
| 522 | =cut | ||||
| 523 | |||||
| 524 | sub clear_errors { | ||||
| 525 | my $c = shift; | ||||
| 526 | $c->error(0); | ||||
| 527 | } | ||||
| 528 | |||||
| 529 | sub _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 | ||||
| 535 | sub _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 | ||||
| 598 | sub _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 | sub _filter_component { | ||||
| 612 | 29 | 114µs | my ( $c, $comp, @args ) = @_; | ||
| 613 | |||||
| 614 | 58 | 1.11ms | 29 | 352µ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 | |||||
| 618 | 29 | 309µs | return $comp; | ||
| 619 | } | ||||
| 620 | |||||
| 621 | =head2 COMPONENT ACCESSORS | ||||
| 622 | |||||
| 623 | =head2 $c->controller($name) | ||||
| 624 | |||||
| 625 | Gets a L<Catalyst::Controller> instance by name. | ||||
| 626 | |||||
| 627 | $c->controller('Foo')->do_stuff; | ||||
| 628 | |||||
| 629 | If the name is omitted, will return the controller for the dispatched | ||||
| 630 | action. | ||||
| 631 | |||||
| 632 | If 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 | |||||
| 640 | sub 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 | |||||
| 660 | Gets a L<Catalyst::Model> instance by name. | ||||
| 661 | |||||
| 662 | $c->model('Foo')->do_stuff; | ||||
| 663 | |||||
| 664 | Any extra arguments are directly passed to ACCEPT_CONTEXT. | ||||
| 665 | |||||
| 666 | If 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 | |||||
| 672 | If 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 | ||||
| 680 | 12 | 38µs | my ( $c, $name, @args ) = @_; | ||
| 681 | 12 | 24µs | my $appclass = ref($c) || $c; | ||
| 682 | 12 | 18µs | if( $name ) { | ||
| 683 | 12 | 15µs | unless ( ref($name) ) { # Direct component hash lookup to avoid costly regexps | ||
| 684 | 12 | 99µs | 12 | 968µs | my $comps = $c->components; # spent 968µs making 12 calls to Catalyst::_components_accessor, avg 81µs/call |
| 685 | 12 | 34µs | my $check = $appclass."::Model::".$name; | ||
| 686 | 12 | 247µs | 12 | 637µ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 | |||||
| 718 | Gets a L<Catalyst::View> instance by name. | ||||
| 719 | |||||
| 720 | $c->view('Foo')->do_stuff; | ||||
| 721 | |||||
| 722 | Any extra arguments are directly passed to ACCEPT_CONTEXT. | ||||
| 723 | |||||
| 724 | If 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 | |||||
| 730 | If 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 | |||||
| 737 | sub 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 | |||||
| 776 | Returns the available names which can be passed to $c->controller | ||||
| 777 | |||||
| 778 | =cut | ||||
| 779 | |||||
| 780 | sub controllers { | ||||
| 781 | my ( $c ) = @_; | ||||
| 782 | return $c->_comp_names(qw/Controller C/); | ||||
| 783 | } | ||||
| 784 | |||||
| 785 | =head2 $c->models | ||||
| 786 | |||||
| 787 | Returns the available names which can be passed to $c->model | ||||
| 788 | |||||
| 789 | =cut | ||||
| 790 | |||||
| 791 | sub models { | ||||
| 792 | my ( $c ) = @_; | ||||
| 793 | return $c->_comp_names(qw/Model M/); | ||||
| 794 | } | ||||
| 795 | |||||
| 796 | |||||
| 797 | =head2 $c->views | ||||
| 798 | |||||
| 799 | Returns the available names which can be passed to $c->view | ||||
| 800 | |||||
| 801 | =cut | ||||
| 802 | |||||
| 803 | sub 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 | |||||
| 812 | Gets a component object by name. This method is not recommended, | ||||
| 813 | unless you want to get a specific component by full | ||||
| 814 | class. C<< $c->controller >>, C<< $c->model >>, and C<< $c->view >> | ||||
| 815 | should be used instead. | ||||
| 816 | |||||
| 817 | If C<$name> is a regexp, a list of components matched against the full | ||||
| 818 | component name will be returned. | ||||
| 819 | |||||
| 820 | If Catalyst can't find a component by name, it will fallback to regex | ||||
| 821 | matching by default. To disable this behaviour set | ||||
| 822 | disable_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 | ||||
| 829 | 17 | 209µs | my ( $c, $name, @args ) = @_; | ||
| 830 | |||||
| 831 | 17 | 27µs | if( $name ) { | ||
| 832 | 17 | 132µs | 17 | 1.29ms | my $comps = $c->components; # spent 1.29ms making 17 calls to Catalyst::_components_accessor, avg 76µs/call |
| 833 | |||||
| 834 | 17 | 32µs | if( !ref $name ) { | ||
| 835 | # is it the exact name? | ||||
| 836 | 17 | 530µs | 17 | 975µ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 | |||||
| 873 | Returns or takes a hashref containing the application's configuration. | ||||
| 874 | |||||
| 875 | __PACKAGE__->config( { db => 'dsn:SQLite:foo.db' } ); | ||||
| 876 | |||||
| 877 | You can also use a C<YAML>, C<XML> or L<Config::General> config file | ||||
| 878 | like C<myapp.conf> in your applications home directory. See | ||||
| 879 | L<Catalyst::Plugin::ConfigLoader>. | ||||
| 880 | |||||
| 881 | =head3 Cascading configuration | ||||
| 882 | |||||
| 883 | The config method is present on all Catalyst components, and configuration | ||||
| 884 | will be merged when an application is started. Configuration loaded with | ||||
| 885 | L<Catalyst::Plugin::ConfigLoader> takes precedence over other configuration, | ||||
| 886 | followed by configuration in your top level C<MyApp> class. These two | ||||
| 887 | configurations are merged, and then configuration data whose hash key matches a | ||||
| 888 | component name is merged with configuration for that component. | ||||
| 889 | |||||
| 890 | The configuration for a component is then passed to the C<new> method when a | ||||
| 891 | component is constructed. | ||||
| 892 | |||||
| 893 | For example: | ||||
| 894 | |||||
| 895 | MyApp->config({ 'Model::Foo' => { bar => 'baz', overrides => 'me' } }); | ||||
| 896 | MyApp::Model::Foo->config({ quux => 'frob', 'overrides => 'this' }); | ||||
| 897 | |||||
| 898 | will mean that C<MyApp::Model::Foo> receives the following data when | ||||
| 899 | constructed: | ||||
| 900 | |||||
| 901 | MyApp::Model::Foo->new({ | ||||
| 902 | bar => 'baz', | ||||
| 903 | quux => 'frob', | ||||
| 904 | overrides => 'me', | ||||
| 905 | }); | ||||
| 906 | |||||
| 907 | =cut | ||||
| 908 | |||||
| 909 | around config => sub { | ||||
| 910 | 154 | 285µs | my $orig = shift; | ||
| 911 | 154 | 259µs | my $c = shift; | ||
| 912 | |||||
| 913 | 154 | 329µs | 3 | 634µ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 | |||||
| 916 | 154 | 2.45ms | 154 | 56.7ms | $c->$orig(@_); # spent 56.7ms making 154 calls to Catalyst::Component::config, avg 368µs/call |
| 917 | 1 | 8µs | 1 | 953µs | }; # spent 953µs making 1 call to Moose::around |
| 918 | |||||
| 919 | =head2 $c->log | ||||
| 920 | |||||
| 921 | Returns the logging object instance. Unless it is already set, Catalyst | ||||
| 922 | sets this up with a L<Catalyst::Log> object. To use your own log class, | ||||
| 923 | set the logger with the C<< __PACKAGE__->log >> method prior to calling | ||||
| 924 | C<< __PACKAGE__->setup >>. | ||||
| 925 | |||||
| 926 | __PACKAGE__->log( MyLogger->new ); | ||||
| 927 | __PACKAGE__->setup; | ||||
| 928 | |||||
| 929 | And later: | ||||
| 930 | |||||
| 931 | $c->log->info( 'Now logging with my own logger!' ); | ||||
| 932 | |||||
| 933 | Your log class should implement the methods described in | ||||
| 934 | L<Catalyst::Log>. | ||||
| 935 | |||||
| 936 | |||||
| 937 | =head2 $c->debug | ||||
| 938 | |||||
| 939 | Returns 1 if debug mode is enabled, 0 otherwise. | ||||
| 940 | |||||
| 941 | You 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 | |||||
| 955 | The first three also set the log level to 'debug'. | ||||
| 956 | |||||
| 957 | Calling C<< $c->debug(1) >> has no effect. | ||||
| 958 | |||||
| 959 | =cut | ||||
| 960 | |||||
| 961 | sub debug { 0 } | ||||
| 962 | |||||
| 963 | =head2 $c->dispatcher | ||||
| 964 | |||||
| 965 | Returns the dispatcher instance. See L<Catalyst::Dispatcher>. | ||||
| 966 | |||||
| 967 | =head2 $c->engine | ||||
| 968 | |||||
| 969 | Returns the engine instance. See L<Catalyst::Engine>. | ||||
| 970 | |||||
| 971 | |||||
| 972 | =head2 UTILITY METHODS | ||||
| 973 | |||||
| 974 | =head2 $c->path_to(@path) | ||||
| 975 | |||||
| 976 | Merges C<@path> with C<< $c->config->{home} >> and returns a | ||||
| 977 | L<Path::Class::Dir> object. Note you can usually use this object as | ||||
| 978 | a filename, but sometimes you will have to explicitly stringify it | ||||
| 979 | yourself by calling the C<< ->stringify >> method. | ||||
| 980 | |||||
| 981 | For 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 | ||||
| 988 | 5 | 33µs | my ( $c, @path ) = @_; | ||
| 989 | 5 | 205µs | 10 | 5.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 |
| 990 | 5 | 242µs | 10 | 1.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 |
| 991 | 1 | 30µs | 2 | 1.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 | |||||
| 996 | Helper method for plugins. It creates a class data accessor/mutator and | ||||
| 997 | loads and instantiates the given class. | ||||
| 998 | |||||
| 999 | MyApp->plugin( 'prototype', 'HTML::Prototype' ); | ||||
| 1000 | |||||
| 1001 | $c->prototype->define_javascript_functions; | ||||
| 1002 | |||||
| 1003 | B<Note:> This method of adding plugins is deprecated. The ability | ||||
| 1004 | to add plugins like this B<will be removed> in a Catalyst 5.81. | ||||
| 1005 | Please do not use this functionality in new code. | ||||
| 1006 | |||||
| 1007 | =cut | ||||
| 1008 | |||||
| 1009 | sub 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 | |||||
| 1034 | Initializes the dispatcher and engine, loads any plugins, and loads the | ||||
| 1035 | model, view, and controller components. You may also specify an array | ||||
| 1036 | of plugins to load here, if you choose to not load them in the C<use | ||||
| 1037 | Catalyst> 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 | ||||
| 1045 | 1 | 2µs | my ( $class, @arguments ) = @_; | ||
| 1046 | 1 | 4µs | 1 | 70µs | croak('Running setup more than once') # spent 70µs making 1 call to Catalyst::_setup_finished_accessor |
| 1047 | if ( $class->setup_finished ); | ||||
| 1048 | |||||
| 1049 | 1 | 10µs | 1 | 3µ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 | |||||
| 1055 | 1 | 15µs | 2 | 56µ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 | ||||
| 1060 | 1 | 1µs | my $flags = {}; | ||
| 1061 | |||||
| 1062 | 1 | 3µs | foreach (@arguments) { | ||
| 1063 | |||||
| 1064 | 7 | 60µs | 14 | 12µ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 { | ||||
| 1072 | 7 | 14µs | push @{ $flags->{plugins} }, $_; | ||
| 1073 | } | ||||
| 1074 | } | ||||
| 1075 | |||||
| 1076 | 1 | 6µs | 1 | 7.63ms | $class->setup_home( delete $flags->{home} ); # spent 7.63ms making 1 call to Catalyst::setup_home |
| 1077 | |||||
| 1078 | 1 | 11µs | 1 | 2.02ms | $class->setup_log( delete $flags->{log} ); # spent 2.02ms making 1 call to Catalyst::setup_log |
| 1079 | 1 | 20µs | 1 | 847ms | $class->setup_plugins( delete $flags->{plugins} ); # spent 847ms making 1 call to Catalyst::setup_plugins |
| 1080 | 1 | 48µs | 1 | 469ms | $class->setup_dispatcher( delete $flags->{dispatcher} ); # spent 469ms making 1 call to Catalyst::setup_dispatcher |
| 1081 | 1 | 55µs | 1 | 4.92ms | $class->setup_engine( delete $flags->{engine} ); # spent 4.92ms making 1 call to Catalyst::setup_engine |
| 1082 | 1 | 42µs | 1 | 65.5ms | $class->setup_stats( delete $flags->{stats} ); # spent 65.5ms making 1 call to Catalyst::setup_stats |
| 1083 | |||||
| 1084 | 1 | 27µs | 1 | 5µ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 | |||||
| 1094 | 2 | 255µs | eval { require Catalyst::Devel; }; | ||
| 1095 | 1 | 28µs | 2 | 178µ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"); | ||||
| 1097 | You 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 | |||||
| 1105 | EOF | ||||
| 1106 | } | ||||
| 1107 | |||||
| 1108 | 1 | 11µs | 1 | 6µs | if ( $class->debug ) { # spent 6µs making 1 call to Epoll::debug |
| 1109 | 7 | 545µs | 7 | 514µ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 | |||||
| 1111 | 1 | 5µs | if (@plugins) { | ||
| 1112 | 1 | 10µs | 1 | 1.57ms | my $column_width = Catalyst::Utils::term_width() - 6; # spent 1.57ms making 1 call to Catalyst::Utils::term_width |
| 1113 | 1 | 12µs | 1 | 83µs | my $t = Text::SimpleTable->new($column_width); # spent 83µs making 1 call to Text::SimpleTable::new |
| 1114 | 2 | 59µs | 6 | 733µs | $t->row($_) for @plugins; # spent 733µs making 6 calls to Text::SimpleTable::row, avg 122µs/call |
| 1115 | 1 | 35µs | 3 | 513µ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 | |||||
| 1118 | 1 | 11µs | 1 | 71µs | my $dispatcher = $class->dispatcher; # spent 71µs making 1 call to Catalyst::_dispatcher_accessor |
| 1119 | 1 | 9µs | 1 | 60µs | my $engine = $class->engine; # spent 60µs making 1 call to Catalyst::_engine_accessor |
| 1120 | 1 | 44µs | 1 | 500µs | my $home = $class->config->{home}; # spent 500µs making 1 call to Catalyst::config |
| 1121 | |||||
| 1122 | 1 | 77µs | 3 | 245µ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 |
| 1123 | 1 | 33µs | 3 | 397µ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 | |||||
| 1125 | 1 | 48µs | 3 | 174µ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 | { | ||||
| 1135 | 4 | 3.74ms | 2 | 86µ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 # spent 56µs making 1 call to Catalyst::BEGIN@1135
# spent 31µs making 1 call to warnings::unimport |
| 1136 | 2 | 30µ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 | ||
| 1137 | 1 | 26µs | 1 | 309ms | $class->setup unless $Catalyst::__AM_RESTARTING; # spent 309ms making 1 call to Catalyst::Plugin::ConfigLoader::setup |
| 1138 | } | ||||
| 1139 | |||||
| 1140 | # Initialize our data structure | ||||
| 1141 | 1 | 40µs | 1 | 88µs | $class->components( {} ); # spent 88µs making 1 call to Catalyst::_components_accessor |
| 1142 | |||||
| 1143 | 1 | 36µs | 1 | 1.38s | $class->setup_components; # spent 1.38s making 1 call to Catalyst::setup_components |
| 1144 | |||||
| 1145 | 1 | 7µs | 1 | 4µs | if ( $class->debug ) { # spent 4µs making 1 call to Epoll::debug |
| 1146 | 1 | 6µs | 1 | 4µs | my $column_width = Catalyst::Utils::term_width() - 8 - 9; # spent 4µs making 1 call to Catalyst::Utils::term_width |
| 1147 | 1 | 12µs | 1 | 120µs | my $t = Text::SimpleTable->new( [ $column_width, 'Class' ], [ 8, 'Type' ] ); # spent 120µs making 1 call to Text::SimpleTable::new |
| 1148 | 1 | 21µs | 2 | 35µ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 |
| 1149 | 11 | 56µs | 11 | 363µs | my $type = ref $class->components->{$comp} ? 'instance' : 'class'; # spent 363µs making 11 calls to Catalyst::_components_accessor, avg 33µs/call |
| 1150 | 11 | 50µs | 11 | 1.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" ) | ||||
| 1153 | 1 | 77µs | 4 | 577µ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 | ||||
| 1157 | 1 | 15µs | 2 | 31µ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 | |||||
| 1161 | 1 | 21µs | 1 | 512ms | $class->setup_actions; # spent 512ms making 1 call to Catalyst::setup_actions |
| 1162 | |||||
| 1163 | 1 | 14µs | 1 | 8µs | if ( $class->debug ) { # spent 8µs making 1 call to Epoll::debug |
| 1164 | 1 | 14µs | 1 | 354µs | my $name = $class->config->{name} || 'Application'; # spent 354µs making 1 call to Catalyst::config |
| 1165 | 1 | 22µs | 2 | 462µ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 | ||||
| 1170 | 1 | 2µs | return if $@; | ||
| 1171 | 1 | 7µs | 1 | 6µs | my $meta = Class::MOP::get_metaclass_by_name($class); # spent 6µs making 1 call to Class::MOP::get_metaclass_by_name |
| 1172 | 1 | 24µs | 1 | 6µ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( | ||||
| 1187 | 1 | 87µs | 2 | 23.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; | ||||
| 1189 | 1 | 137µs | 1 | 128µs | }; # spent 128µs making 1 call to B::Hooks::EndOfScope::on_scope_end |
| 1190 | |||||
| 1191 | 1 | 11µs | 1 | 378µ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 | |||||
| 1196 | 1 | 10µs | 1 | 202ms | $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.. | ||||
| 1199 | 1 | 51µs | 4 | 941µ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 |
| 1200 | 1 | 21µ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 | |||||
| 1205 | A hook to attach modifiers to. This method does not do anything except set the | ||||
| 1206 | C<setup_finished> accessor. | ||||
| 1207 | |||||
| 1208 | Applying method modifiers to the C<setup> method doesn't work, because of quirky thingsdone for plugin setup. | ||||
| 1209 | |||||
| 1210 | Example: | ||||
| 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 | ||||
| 1221 | 1 | 3µs | my ($class) = @_; | ||
| 1222 | 1 | 71µs | 1 | 110µ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 | |||||
| 1229 | Constructs an absolute L<URI> object based on the application root, the | ||||
| 1230 | provided path, and the additional arguments and query parameters provided. | ||||
| 1231 | When used as a string, provides a textual URI. | ||||
| 1232 | |||||
| 1233 | If no arguments are provided, the URI for the current action is returned. | ||||
| 1234 | To return the current action and also provide @args, use | ||||
| 1235 | C<< $c->uri_for( $c->action, @args ) >>. | ||||
| 1236 | |||||
| 1237 | If the first argument is a string, it is taken as a public URI path relative | ||||
| 1238 | to C<< $c->namespace >> (if it doesn't begin with a forward slash) or | ||||
| 1239 | relative to the application root (if it does). It is then merged with | ||||
| 1240 | C<< $c->request->base >>; any C<@args> are appended as additional path | ||||
| 1241 | components; and any C<%query_values> are appended as C<?foo=bar> parameters. | ||||
| 1242 | |||||
| 1243 | If the first argument is a L<Catalyst::Action> it represents an action which | ||||
| 1244 | will have its path resolved using C<< $c->dispatcher->uri_for_action >>. The | ||||
| 1245 | optional C<\@captures> argument (an arrayref) allows passing the captured | ||||
| 1246 | variables that are needed to fill in the paths of Chained and Regex actions; | ||||
| 1247 | once the path is resolved, C<uri_for> continues as though a path was | ||||
| 1248 | provided, appending any arguments or parameters and creating an absolute | ||||
| 1249 | URI. | ||||
| 1250 | |||||
| 1251 | The captures for the current request can be found in | ||||
| 1252 | C<< $c->request->captures >>, and actions can be resolved using | ||||
| 1253 | C<< Catalyst::Controller->action_for($name) >>. If you have a private action | ||||
| 1254 | path, 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 | ||||
| 1269 | 861 | 5.41ms | my ( $c, $path, @args ) = @_; | ||
| 1270 | |||||
| 1271 | 861 | 17.9ms | 861 | 6.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 | |||||
| 1277 | 861 | 2.60ms | undef($path) if (defined $path && $path eq ''); | ||
| 1278 | |||||
| 1279 | 861 | 10.5ms | my $params = | ||
| 1280 | ( scalar @args && ref $args[$#args] eq 'HASH' ? pop @args : {} ); | ||||
| 1281 | |||||
| 1282 | 861 | 4.13ms | carp "uri_for called with undef argument" if grep { ! defined $_ } @args; | ||
| 1283 | 861 | 5.97ms | foreach my $arg (@args) { | ||
| 1284 | 877 | 22.0ms | 877 | 5.54ms | utf8::encode($arg) if utf8::is_utf8($arg); # spent 5.54ms making 877 calls to utf8::is_utf8, avg 6µs/call |
| 1285 | } | ||||
| 1286 | 1722 | 32.2ms | 1754 | 8.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 |
| 1287 | 861 | 12.3ms | 861 | 4.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 | |||||
| 1291 | 861 | 10.1ms | 861 | 3.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 | |||||
| 1312 | 861 | 2.31ms | undef($path) if (defined $path && $path eq ''); | ||
| 1313 | |||||
| 1314 | 861 | 4.52ms | unshift(@args, $path); | ||
| 1315 | |||||
| 1316 | 861 | 16.3ms | 861 | 3.59ms | unless (defined $path && $path =~ s!^/!!) { # in-place strip # spent 3.59ms making 861 calls to Catalyst::CORE:subst, avg 4µs/call |
| 1317 | 839 | 12.0ms | 839 | 14.9ms | my $namespace = $c->namespace; # spent 14.9ms making 839 calls to Catalyst::namespace, avg 18µs/call |
| 1318 | 839 | 4.47ms | if (defined $path) { # cheesy hack to handle path '../foo' | ||
| 1319 | 839 | 14.5ms | 839 | 3.12ms | $namespace =~ s{(?:^|/)[^/]+$}{} while $args[0] =~ s{^\.\./}{}; # spent 3.12ms making 839 calls to Catalyst::CORE:subst, avg 4µs/call |
| 1320 | } | ||||
| 1321 | 839 | 4.71ms | unshift(@args, $namespace || ''); | ||
| 1322 | } | ||||
| 1323 | |||||
| 1324 | # join args with '/', or a blank string | ||||
| 1325 | 861 | 7.58ms | my $args = join('/', grep { defined($_) } @args); | ||
| 1326 | 861 | 11.2ms | 861 | 2.60ms | $args =~ s/\?/%3F/g; # STUPID STUPID SPECIAL CASE # spent 2.60ms making 861 calls to Catalyst::CORE:subst, avg 3µs/call |
| 1327 | 861 | 8.76ms | 861 | 2.32ms | $args =~ s!^/+!!; # spent 2.32ms making 861 calls to Catalyst::CORE:subst, avg 3µs/call |
| 1328 | 861 | 19.5ms | 1722 | 48.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 |
| 1329 | 861 | 4.35ms | my $class = ref($base); | ||
| 1330 | 861 | 27.7ms | 1722 | 44.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 | |||||
| 1332 | 861 | 2.42ms | my $query = ''; | ||
| 1333 | |||||
| 1334 | 861 | 4.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 | |||||
| 1352 | 861 | 19.9ms | 861 | 6.94ms | my $res = bless(\"${base}${args}${query}", $class); # spent 6.94ms making 861 calls to URI::__ANON__[URI.pm:24], avg 8µs/call |
| 1353 | 861 | 15.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 | |||||
| 1364 | A private path to the Catalyst action you want to create a URI for. | ||||
| 1365 | |||||
| 1366 | This 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 | |||||
| 1370 | You can also pass in a Catalyst::Action object, in which case it is passed to | ||||
| 1371 | C<< $c->uri_for >>. | ||||
| 1372 | |||||
| 1373 | Note 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 | |||||
| 1375 | For example, if the action looks like: | ||||
| 1376 | |||||
| 1377 | package MyApp::Controller::Users; | ||||
| 1378 | |||||
| 1379 | sub lst : Path('the-list') {} | ||||
| 1380 | |||||
| 1381 | You can use: | ||||
| 1382 | |||||
| 1383 | $c->uri_for_action('/users/lst') | ||||
| 1384 | |||||
| 1385 | and it will create the URI /users/the-list. | ||||
| 1386 | |||||
| 1387 | =back | ||||
| 1388 | |||||
| 1389 | =cut | ||||
| 1390 | |||||
| 1391 | sub 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 | |||||
| 1404 | Returns the Catalyst welcome HTML page. | ||||
| 1405 | |||||
| 1406 | =cut | ||||
| 1407 | |||||
| 1408 | sub 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&mode=all">controllers</a>, | ||||
| 1516 | <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AModel%3A%3A&mode=all">models</a>, and | ||||
| 1517 | <a href="http://cpansearch.perl.org/search?query=Catalyst%3A%3AView%3A%3A&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> | ||||
| 1547 | EOF | ||||
| 1548 | } | ||||
| 1549 | |||||
| 1550 | =head1 INTERNAL METHODS | ||||
| 1551 | |||||
| 1552 | These methods are not meant to be used by end users. | ||||
| 1553 | |||||
| 1554 | =head2 $c->components | ||||
| 1555 | |||||
| 1556 | Returns a hash of components. | ||||
| 1557 | |||||
| 1558 | =head2 $c->context_class | ||||
| 1559 | |||||
| 1560 | Returns or sets the context class. | ||||
| 1561 | |||||
| 1562 | =head2 $c->counter | ||||
| 1563 | |||||
| 1564 | Returns a hashref containing coderefs and execution counts (needed for | ||||
| 1565 | deep recursion detection). | ||||
| 1566 | |||||
| 1567 | =head2 $c->depth | ||||
| 1568 | |||||
| 1569 | Returns the number of actions on the current internal execution stack. | ||||
| 1570 | |||||
| 1571 | =head2 $c->dispatch | ||||
| 1572 | |||||
| 1573 | Dispatches a request to actions. | ||||
| 1574 | |||||
| 1575 | =cut | ||||
| 1576 | |||||
| 1577 | 2 | 45µs | 2 | 19.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 # 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 | |||||
| 1581 | Returns or sets the dispatcher class. | ||||
| 1582 | |||||
| 1583 | =head2 $c->dump_these | ||||
| 1584 | |||||
| 1585 | Returns a list of 2-element array references (name, structure) pairs | ||||
| 1586 | that 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 | ||||
| 1591 | 2 | 3µs | my $c = shift; | ||
| 1592 | 2 | 197µs | 8 | 1.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 | |||||
| 1600 | Returns or sets the engine class. | ||||
| 1601 | |||||
| 1602 | =head2 $c->execute( $class, $coderef ) | ||||
| 1603 | |||||
| 1604 | Execute a coderef in given class and catch exceptions. Errors are available | ||||
| 1605 | via $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 | ||||
| 1610 | 13 | 45µs | my ( $c, $class, $code ) = @_; | ||
| 1611 | 13 | 184µs | 13 | 2.42ms | $class = $c->component($class) || $class; # spent 2.42ms making 13 calls to Catalyst::component, avg 186µs/call |
| 1612 | 13 | 129µs | 13 | 147µs | $c->state(0); # spent 147µs making 13 calls to Catalyst::state, avg 11µs/call |
| 1613 | |||||
| 1614 | 13 | 138µs | 13 | 437µ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 | |||||
| 1624 | 13 | 242µs | 26 | 23.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 | |||||
| 1626 | 13 | 257µs | 13 | 257µs | push( @{ $c->stack }, $code ); # spent 257µs making 13 calls to Catalyst::stack, avg 20µs/call |
| 1627 | |||||
| 1628 | 3 | 170µs | 2 | 84µ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 # spent 54µs making 1 call to Catalyst::BEGIN@1628
# spent 30µs making 1 call to warnings::unimport |
| 1629 | 26 | 753µs | 52 | 19.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 | |||||
| 1631 | 13 | 259µs | 21 | 6.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 | |||||
| 1633 | 13 | 135µs | 13 | 138µs | my $last = pop( @{ $c->stack } ); # spent 138µs making 13 calls to Catalyst::stack, avg 11µs/call |
| 1634 | |||||
| 1635 | 13 | 28µ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 ) { | ||||
| 1644 | 3 | 7.74ms | 2 | 50µ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 # 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 | } | ||||
| 1654 | 13 | 538µs | 13 | 164µ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 | ||||
| 1658 | 13 | 37µs | my ( $c, $code ) = @_; | ||
| 1659 | 13 | 36µs | my $appclass = ref($c) || $c; | ||
| 1660 | 13 | 331µs | 31 | 2.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 | |||||
| 1663 | 8 | 68µs | 8 | 76µs | my $action_name = $code->reverse(); # spent 76µs making 8 calls to Catalyst::Action::reverse, avg 9µs/call |
| 1664 | 8 | 104µs | 8 | 69µs | $c->counter->{$action_name}++; # spent 69µs making 8 calls to Catalyst::counter, avg 9µs/call |
| 1665 | |||||
| 1666 | 8 | 17µs | my $action = $action_name; | ||
| 1667 | 8 | 103µs | 8 | 37µ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 | ||||
| 1672 | 8 | 16µs | my $callsub = q{}; | ||
| 1673 | 8 | 32µs | for my $index ( 2 .. 11 ) { | ||
| 1674 | last | ||||
| 1675 | 22 | 367µs | if ( ( caller($index) )[0] eq 'Catalyst' | ||
| 1676 | && ( caller($index) )[3] eq '(eval)' ); | ||||
| 1677 | |||||
| 1678 | 19 | 321µs | 19 | 68µs | if ( ( caller($index) )[3] =~ /forward$/ ) { # spent 68µs making 19 calls to Catalyst::CORE:match, avg 4µs/call |
| 1679 | 5 | 78µs | $callsub = ( caller($index) )[3]; | ||
| 1680 | 5 | 14µs | $action = "-> $action"; | ||
| 1681 | 5 | 226µs | last; | ||
| 1682 | } | ||||
| 1683 | } | ||||
| 1684 | |||||
| 1685 | 8 | 90µs | 8 | 68µ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? | ||||
| 1688 | 8 | 109µs | 8 | 30µs | if ( $callsub =~ /forward$/ ) { # spent 30µs making 8 calls to Catalyst::CORE:match, avg 4µs/call |
| 1689 | 5 | 40µs | 5 | 41µ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 | ||||
| 1692 | 5 | 235µs | 35 | 14.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 | ||||
| 1711 | 3 | 50µs | 6 | 3.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 | } | ||||
| 1716 | 8 | 195µ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 | ||||
| 1721 | 8 | 29µs | my ( $c, $info ) = @_; | ||
| 1722 | 8 | 166µs | 16 | 5.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 | |||||
| 1727 | Finalizes 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 | ||||
| 1732 | 1 | 2µs | my $c = shift; | ||
| 1733 | |||||
| 1734 | 1 | 11µs | 1 | 12µ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) | ||||
| 1739 | 1 | 10µs | 1 | 119µs | my $engine = $c->engine; # spent 119µs making 1 call to Catalyst::_engine_accessor |
| 1740 | 1 | 65µs | 1 | 47µs | if ( my $code = $engine->can('finalize') ) { # spent 47µs making 1 call to UNIVERSAL::can |
| 1741 | $engine->$code($c); | ||||
| 1742 | } | ||||
| 1743 | else { | ||||
| 1744 | |||||
| 1745 | 1 | 70µs | 1 | 376µs | $c->finalize_uploads; # spent 376µs making 1 call to Catalyst::finalize_uploads |
| 1746 | |||||
| 1747 | # Error | ||||
| 1748 | 1 | 17µs | 1 | 13µs | if ( $#{ $c->error } >= 0 ) { # spent 13µs making 1 call to Catalyst::error |
| 1749 | $c->finalize_error; | ||||
| 1750 | } | ||||
| 1751 | |||||
| 1752 | 1 | 79µs | 1 | 44.8ms | $c->finalize_headers; # spent 44.8ms making 1 call to Catalyst::Plugin::Session::finalize_headers |
| 1753 | |||||
| 1754 | # HEAD request | ||||
| 1755 | 1 | 19µs | 2 | 24µ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 | |||||
| 1759 | 1 | 22µs | 1 | 196ms | $c->finalize_body; # spent 196ms making 1 call to Catalyst::Plugin::Session::finalize_body |
| 1760 | } | ||||
| 1761 | |||||
| 1762 | 1 | 46µs | 1 | 8.53ms | $c->log_response; # spent 8.53ms making 1 call to Catalyst::log_response |
| 1763 | |||||
| 1764 | 1 | 8µs | 1 | 4µs | if ($c->use_stats) { # spent 4µs making 1 call to Epoll::use_stats |
| 1765 | 1 | 43µs | 2 | 51µ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 |
| 1766 | 1 | 8µs | my $av = $elapsed == 0 ? '??' : sprintf '%.3f', 1 / $elapsed; | ||
| 1767 | 1 | 23µs | 4 | 2.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 | |||||
| 1771 | 1 | 16µs | 2 | 12µ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 | |||||
| 1776 | Finalizes body. | ||||
| 1777 | |||||
| 1778 | =cut | ||||
| 1779 | |||||
| 1780 | 2 | 41µs | 2 | 162ms | # 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 # 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 | |||||
| 1784 | Finalizes cookies. | ||||
| 1785 | |||||
| 1786 | =cut | ||||
| 1787 | |||||
| 1788 | 2 | 43µs | 2 | 1.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 # 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 | |||||
| 1792 | Finalizes error. | ||||
| 1793 | |||||
| 1794 | =cut | ||||
| 1795 | |||||
| 1796 | sub finalize_error { my $c = shift; $c->engine->finalize_error( $c, @_ ) } | ||||
| 1797 | |||||
| 1798 | =head2 $c->finalize_headers | ||||
| 1799 | |||||
| 1800 | Finalizes 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 | ||||
| 1805 | 1 | 3µs | my $c = shift; | ||
| 1806 | |||||
| 1807 | 1 | 11µs | 1 | 15µ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 | ||||
| 1810 | 1 | 11µs | 1 | 12µs | return if $response->finalized_headers; # spent 12µs making 1 call to Catalyst::Response::finalized_headers |
| 1811 | |||||
| 1812 | # Handle redirects | ||||
| 1813 | 1 | 74µs | 1 | 104µ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 | ||||
| 1826 | 1 | 697µs | 2 | 3.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 | ||||
| 1829 | 1 | 32µs | 2 | 4.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 | ||||
| 1841 | 1 | 21µs | 2 | 2.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 | ||||
| 1846 | 1 | 41µs | 2 | 27µ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 | |||||
| 1851 | 1 | 65µs | 1 | 1.92ms | $c->finalize_cookies; # spent 1.92ms making 1 call to Catalyst::finalize_cookies |
| 1852 | |||||
| 1853 | 1 | 18µs | 2 | 3.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 | ||||
| 1856 | 1 | 23µs | 1 | 12µs | $response->finalized_headers(1); # spent 12µs making 1 call to Catalyst::Response::finalized_headers |
| 1857 | } | ||||
| 1858 | |||||
| 1859 | =head2 $c->finalize_output | ||||
| 1860 | |||||
| 1861 | An alias for finalize_body. | ||||
| 1862 | |||||
| 1863 | =head2 $c->finalize_read | ||||
| 1864 | |||||
| 1865 | Finalizes the input after reading is complete. | ||||
| 1866 | |||||
| 1867 | =cut | ||||
| 1868 | |||||
| 1869 | sub finalize_read { my $c = shift; $c->engine->finalize_read( $c, @_ ) } | ||||
| 1870 | |||||
| 1871 | =head2 $c->finalize_uploads | ||||
| 1872 | |||||
| 1873 | Finalizes uploads. Cleans up any temporary files. | ||||
| 1874 | |||||
| 1875 | =cut | ||||
| 1876 | |||||
| 1877 | 2 | 39µs | 2 | 158µs | # spent 376µs (218+158) within Catalyst::finalize_uploads which was called
# once (218µs+158µs) by Catalyst::finalize at line 1745 # 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 | |||||
| 1881 | Gets an action in a given namespace. | ||||
| 1882 | |||||
| 1883 | =cut | ||||
| 1884 | |||||
| 1885 | 14 | 199µs | 14 | 805µ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 # 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 | |||||
| 1889 | Gets all actions of a given name in a namespace and all parent | ||||
| 1890 | namespaces. | ||||
| 1891 | |||||
| 1892 | =cut | ||||
| 1893 | |||||
| 1894 | 6 | 80µs | 6 | 1.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 # 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 | |||||
| 1898 | Called 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 | ||||
| 1903 | 1 | 3µs | my ( $class, @arguments ) = @_; | ||
| 1904 | |||||
| 1905 | # Always expect worst case! | ||||
| 1906 | 1 | 1µs | my $status = -1; | ||
| 1907 | 1 | 142µs | 13 | 71µ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 |
| 1908 | 1 | 6µs | 1 | 4µs | if ($class->debug) { # spent 4µs making 1 call to Epoll::debug |
| 1909 | 1 | 3µs | my $secs = time - $START || 1; | ||
| 1910 | 1 | 41µs | my $av = sprintf '%.3f', $COUNT / $secs; | ||
| 1911 | 1 | 27µs | my $time = localtime time; | ||
| 1912 | 1 | 16µs | 2 | 106µ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 | |||||
| 1915 | 1 | 15µs | 1 | 203ms | my $c = $class->prepare(@arguments); # spent 203ms making 1 call to Catalyst::Plugin::Session::Store::DBI::prepare |
| 1916 | 1 | 13µs | 1 | 19.0s | $c->dispatch; # spent 19.0s making 1 call to Epoll::dispatch |
| 1917 | 1 | 52µs | 1 | 254ms | $status = $c->finalize; # spent 254ms making 1 call to Epoll::finalize |
| 1918 | }; | ||||
| 1919 | |||||
| 1920 | 1 | 19µs | 1 | 12µ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 | |||||
| 1925 | 1 | 900ns | $COUNT++; | ||
| 1926 | |||||
| 1927 | 1 | 23µs | 4 | 215µ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 | } | ||||
| 1930 | 1 | 7µs | return $status; | ||
| 1931 | } | ||||
| 1932 | |||||
| 1933 | =head2 $c->prepare( @arguments ) | ||||
| 1934 | |||||
| 1935 | Creates a Catalyst context from an engine-specific request (Apache, CGI, | ||||
| 1936 | etc.). | ||||
| 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 | ||||
| 1941 | 1 | 6µ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. | ||||
| 1946 | 1 | 49µs | 2 | 513µ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 | |||||
| 1948 | 1 | 19µs | 2 | 935µ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 | ||||
| 1951 | 1 | 103µs | 2 | 1.15ms | $c->request->_context($c); # spent 1.12ms making 1 call to Catalyst::request
# spent 34µs making 1 call to Catalyst::Request::_context |
| 1952 | 1 | 49µs | 2 | 738µ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... | ||||
| 1955 | 1 | 168µs | 5 | 1.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 |
| 1956 | 1 | 12µs | 1 | 7µs | if ( $c->debug ) { # spent 7µs making 1 call to Epoll::debug |
| 1957 | 1 | 53µs | 3 | 533µ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) | ||||
| 1962 | 1 | 56µs | 2 | 83µ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 { | ||||
| 1966 | 1 | 38µs | 1 | 142µs | $c->prepare_request(@arguments); # spent 142µs making 1 call to Catalyst::prepare_request |
| 1967 | 1 | 37µs | 1 | 834µs | $c->prepare_connection; # spent 834µs making 1 call to Catalyst::prepare_connection |
| 1968 | 1 | 41µs | 1 | 184µs | $c->prepare_query_parameters; # spent 184µs making 1 call to Catalyst::prepare_query_parameters |
| 1969 | 1 | 48µs | 1 | 3.07ms | $c->prepare_headers; # spent 3.07ms making 1 call to Catalyst::prepare_headers |
| 1970 | 1 | 41µs | 1 | 1.71ms | $c->prepare_cookies; # spent 1.71ms making 1 call to Catalyst::prepare_cookies |
| 1971 | 1 | 44µs | 1 | 3.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 | ||||
| 1975 | 1 | 45µs | 1 | 660µ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 | ||||
| 1978 | 1 | 51µs | 2 | 5.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 | |||||
| 1983 | 1 | 25µs | 2 | 69µ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 |
| 1984 | 1 | 17µs | 2 | 640µ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 |
| 1985 | 1 | 2µs | $path = '/' unless length $path; | ||
| 1986 | 1 | 17µs | 2 | 37µ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 | |||||
| 1988 | 1 | 54µs | 1 | 44.1ms | $c->log_request; # spent 44.1ms making 1 call to Catalyst::log_request |
| 1989 | |||||
| 1990 | 1 | 24µs | 1 | 3.35ms | $c->prepare_action; # spent 3.35ms making 1 call to Epoll::prepare_action |
| 1991 | |||||
| 1992 | 1 | 18µs | return $c; | ||
| 1993 | } | ||||
| 1994 | |||||
| 1995 | =head2 $c->prepare_action | ||||
| 1996 | |||||
| 1997 | Prepares action. See L<Catalyst::Dispatcher>. | ||||
| 1998 | |||||
| 1999 | =cut | ||||
| 2000 | |||||
| 2001 | 2 | 30µs | 2 | 2.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 # 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 | |||||
| 2005 | Prepares 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 | ||||
| 2010 | 30 | 53µs | my $c = shift; | ||
| 2011 | |||||
| 2012 | 30 | 553µs | 60 | 481µ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 | ||||
| 2015 | 1 | 25µs | 2 | 2.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 |
| 2016 | 1 | 43µs | 1 | 1.36ms | $c->prepare_parameters; # spent 1.36ms making 1 call to Catalyst::prepare_parameters |
| 2017 | 1 | 46µs | 1 | 566µs | $c->prepare_uploads; # spent 566µs making 1 call to Catalyst::prepare_uploads |
| 2018 | } | ||||
| 2019 | |||||
| 2020 | =head2 $c->prepare_body_chunk( $chunk ) | ||||
| 2021 | |||||
| 2022 | Prepares a chunk of data before sending it to L<HTTP::Body>. | ||||
| 2023 | |||||
| 2024 | See 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 | ||||
| 2029 | 1 | 2µs | my $c = shift; | ||
| 2030 | 1 | 33µs | 2 | 628µ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 | |||||
| 2035 | Prepares 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 | ||||
| 2040 | 1 | 2µs | my $c = shift; | ||
| 2041 | 1 | 33µs | 2 | 496µ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 | |||||
| 2046 | Prepares 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 | ||||
| 2051 | 1 | 2µs | my $c = shift; | ||
| 2052 | 1 | 33µs | 2 | 788µ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 | |||||
| 2057 | Prepares cookies. | ||||
| 2058 | |||||
| 2059 | =cut | ||||
| 2060 | |||||
| 2061 | 2 | 214µs | 2 | 1.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 # 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 | |||||
| 2065 | Prepares headers. | ||||
| 2066 | |||||
| 2067 | =cut | ||||
| 2068 | |||||
| 2069 | 2 | 34µs | 2 | 3.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 # 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 | |||||
| 2073 | Prepares 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 | ||||
| 2078 | 1 | 2µs | my $c = shift; | ||
| 2079 | 1 | 34µs | 1 | 536µs | $c->prepare_body_parameters; # spent 536µs making 1 call to Catalyst::prepare_body_parameters |
| 2080 | 1 | 36µs | 2 | 702µ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 | |||||
| 2085 | Prepares path and base. | ||||
| 2086 | |||||
| 2087 | =cut | ||||
| 2088 | |||||
| 2089 | 2 | 32µs | 2 | 3.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 # 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 | |||||
| 2093 | Prepares 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 | ||||
| 2098 | 1 | 2µs | my $c = shift; | ||
| 2099 | |||||
| 2100 | 1 | 33µs | 2 | 139µ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 | |||||
| 2105 | Writes 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 | ||||
| 2122 | 1 | 2µs | my $c = shift; | ||
| 2123 | |||||
| 2124 | 1 | 8µs | 1 | 6µs | return unless $c->debug; # spent 6µs making 1 call to Epoll::debug |
| 2125 | |||||
| 2126 | 1 | 39µs | 1 | 41.0ms | my($dump) = grep {$_->[0] eq 'Request' } $c->dump_these; # spent 41.0ms making 1 call to Catalyst::Plugin::Session::dump_these |
| 2127 | 1 | 2µs | my $request = $dump->[1]; | ||
| 2128 | |||||
| 2129 | 1 | 29µs | 3 | 76µ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 |
| 2130 | 1 | 1µs | $method ||= ''; | ||
| 2131 | 1 | 2µs | $path = '/' unless length $path; | ||
| 2132 | 1 | 1µs | $address ||= ''; | ||
| 2133 | 1 | 24µs | 2 | 238µ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 | |||||
| 2135 | 1 | 60µs | 2 | 22µ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 | |||||
| 2137 | 1 | 10µs | 1 | 10µ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 | |||||
| 2141 | 1 | 61µs | 3 | 2.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 | |||||
| 2143 | 1 | 56µs | 1 | 57µ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 | |||||
| 2148 | Writes information about the response to the debug logs by calling | ||||
| 2149 | C<< $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 | ||||
| 2154 | 1 | 2µs | my $c = shift; | ||
| 2155 | |||||
| 2156 | 1 | 5µs | 1 | 4µs | return unless $c->debug; # spent 4µs making 1 call to Epoll::debug |
| 2157 | |||||
| 2158 | 1 | 15µs | 1 | 7.67ms | my($dump) = grep {$_->[0] eq 'Response' } $c->dump_these; # spent 7.67ms making 1 call to Catalyst::Plugin::Session::dump_these |
| 2159 | 1 | 800ns | my $response = $dump->[1]; | ||
| 2160 | |||||
| 2161 | 1 | 34µs | 1 | 742µs | $c->log_response_status_line($response); # spent 742µs making 1 call to Catalyst::log_response_status_line |
| 2162 | 1 | 35µs | 2 | 8µ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 | |||||
| 2167 | Writes 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 | ||||
| 2182 | 1 | 1µs | my ($c, $response) = @_; | ||
| 2183 | |||||
| 2184 | 1 | 43µs | 7 | 682µ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 | |||||
| 2196 | Hook method which can be wrapped by plugins to log the responseheaders. | ||||
| 2197 | No-op in the default implementation. | ||||
| 2198 | |||||
| 2199 | =cut | ||||
| 2200 | |||||
| 2201 | 1 | 6µs | # spent 3µs within Catalyst::log_response_headers which was called
# once (3µs+0s) by Catalyst::log_response at line 2162 | ||
| 2202 | |||||
| 2203 | =head2 $c->log_request_parameters( query => {}, body => {} ) | ||||
| 2204 | |||||
| 2205 | Logs 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 | ||||
| 2210 | 1 | 2µs | my $c = shift; | ||
| 2211 | 1 | 8µs | my %all_params = @_; | ||
| 2212 | |||||
| 2213 | 1 | 8µs | 1 | 6µs | return unless $c->debug; # spent 6µs making 1 call to Epoll::debug |
| 2214 | |||||
| 2215 | 1 | 11µs | 1 | 8µs | my $column_width = Catalyst::Utils::term_width() - 44; # spent 8µs making 1 call to Catalyst::Utils::term_width |
| 2216 | 1 | 18µs | foreach my $type (qw(query body)) { | ||
| 2217 | 2 | 4µs | my $params = $all_params{$type}; | ||
| 2218 | 2 | 6µs | next if ! keys %$params; | ||
| 2219 | 1 | 34µs | 1 | 718µs | my $t = Text::SimpleTable->new( [ 35, 'Parameter' ], [ $column_width, 'Value' ] ); # spent 718µs making 1 call to Text::SimpleTable::new |
| 2220 | 1 | 76µs | 1 | 8µs | for my $key ( sort keys %$params ) { # spent 8µs making 1 call to Catalyst::CORE:sort |
| 2221 | 2 | 8µs | my $param = $params->{$key}; | ||
| 2222 | 2 | 4µs | my $value = defined($param) ? $param : ''; | ||
| 2223 | 2 | 25µs | 2 | 591µ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 | } | ||||
| 2225 | 1 | 42µs | 3 | 575µ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 | |||||
| 2231 | Logs file uploads included in the request to the debug logs. | ||||
| 2232 | The parameter name, filename, file type, and file size are all included in | ||||
| 2233 | the 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 | ||||
| 2238 | 1 | 2µs | my $c = shift; | ||
| 2239 | 1 | 2µs | my $request = shift; | ||
| 2240 | 1 | 7µs | 1 | 5µs | return unless $c->debug; # spent 5µs making 1 call to Epoll::debug |
| 2241 | 1 | 9µs | 1 | 11µs | my $uploads = $request->uploads; # spent 11µs making 1 call to Catalyst::Request::uploads |
| 2242 | 1 | 13µ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 | |||||
| 2261 | Hook method which can be wrapped by plugins to log the request headers. | ||||
| 2262 | No-op in the default implementation. | ||||
| 2263 | |||||
| 2264 | =cut | ||||
| 2265 | |||||
| 2266 | 1 | 11µs | # spent 6µs within Catalyst::log_request_headers which was called
# once (6µs+0s) by Catalyst::log_request at line 2135 | ||
| 2267 | |||||
| 2268 | =head2 $c->log_headers($type => $headers) | ||||
| 2269 | |||||
| 2270 | Logs L<HTTP::Headers> (either request or response) to the debug logs. | ||||
| 2271 | |||||
| 2272 | =cut | ||||
| 2273 | |||||
| 2274 | sub 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 | |||||
| 2295 | Prepares the input for reading. | ||||
| 2296 | |||||
| 2297 | =cut | ||||
| 2298 | |||||
| 2299 | 2 | 185µs | 2 | 628µs | # spent 660µs (32+628) within Catalyst::prepare_read which was called
# once (32µs+628µs) by Catalyst::prepare at line 1975 # 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 | |||||
| 2303 | Prepares the engine request. | ||||
| 2304 | |||||
| 2305 | =cut | ||||
| 2306 | |||||
| 2307 | 2 | 33µs | 2 | 102µs | # spent 142µs (40+102) within Catalyst::prepare_request which was called
# once (40µs+102µs) by Catalyst::prepare at line 1966 # 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 | |||||
| 2311 | Prepares 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 | ||||
| 2316 | 1 | 3µs | my $c = shift; | ||
| 2317 | |||||
| 2318 | 1 | 33µs | 2 | 521µ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 | |||||
| 2323 | Prepares the output for writing. | ||||
| 2324 | |||||
| 2325 | =cut | ||||
| 2326 | |||||
| 2327 | sub prepare_write { my $c = shift; $c->engine->prepare_write( $c, @_ ) } | ||||
| 2328 | |||||
| 2329 | =head2 $c->request_class | ||||
| 2330 | |||||
| 2331 | Returns or sets the request class. | ||||
| 2332 | |||||
| 2333 | =head2 $c->response_class | ||||
| 2334 | |||||
| 2335 | Returns or sets the response class. | ||||
| 2336 | |||||
| 2337 | =head2 $c->read( [$maxlength] ) | ||||
| 2338 | |||||
| 2339 | Reads a chunk of data from the request body. This method is designed to | ||||
| 2340 | be used in a while loop, reading C<$maxlength> bytes on every call. | ||||
| 2341 | C<$maxlength> defaults to the size of the request if not specified. | ||||
| 2342 | |||||
| 2343 | You have to set C<< MyApp->config(parse_on_demand => 1) >> to use this | ||||
| 2344 | directly. | ||||
| 2345 | |||||
| 2346 | Warning: If you use read(), Catalyst will not process the body, | ||||
| 2347 | so 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 | |||||
| 2352 | sub read { my $c = shift; return $c->engine->read( $c, @_ ) } | ||||
| 2353 | |||||
| 2354 | =head2 $c->run | ||||
| 2355 | |||||
| 2356 | Starts the engine. | ||||
| 2357 | |||||
| 2358 | =cut | ||||
| 2359 | |||||
| 2360 | 2 | 114µs | 1 | 50µs | sub 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 | |||||
| 2364 | Sets an action in a given namespace. | ||||
| 2365 | |||||
| 2366 | =cut | ||||
| 2367 | |||||
| 2368 | sub set_action { my $c = shift; $c->dispatcher->set_action( $c, @_ ) } | ||||
| 2369 | |||||
| 2370 | =head2 $c->setup_actions($component) | ||||
| 2371 | |||||
| 2372 | Sets up actions for a component. | ||||
| 2373 | |||||
| 2374 | =cut | ||||
| 2375 | |||||
| 2376 | 2 | 34µs | 2 | 512ms | # spent 512ms (94µs+512) within Catalyst::setup_actions which was called
# once (94µs+512ms) by Catalyst::setup at line 1161 # 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 | |||||
| 2380 | This method is called internally to set up the application's components. | ||||
| 2381 | |||||
| 2382 | It finds modules by calling the L<locate_components> method, expands them to | ||||
| 2383 | package names with the L<expand_component_module> method, and then installs | ||||
| 2384 | each component into the application. | ||||
| 2385 | |||||
| 2386 | The C<setup_components> config option is passed to both of the above methods. | ||||
| 2387 | |||||
| 2388 | Installation of each component is performed by the L<setup_component> method, | ||||
| 2389 | below. | ||||
| 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 | ||||
| 2394 | 1 | 2µs | my $class = shift; | ||
| 2395 | |||||
| 2396 | 1 | 32µs | 1 | 389µs | my $config = $class->config->{ setup_components }; # spent 389µs making 1 call to Catalyst::config |
| 2397 | |||||
| 2398 | 1 | 88µs | 2 | 35.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); | ||||
| 2400 | 1 | 29µs | my %comps = map { $_ => 1 } @comps; | ||
| 2401 | |||||
| 2402 | 12 | 136µs | 11 | 40µs | my $deprecatedcatalyst_component_names = grep { /::[CMV]::/ } @comps; # spent 40µs making 11 calls to Catalyst::CORE:match, avg 4µs/call |
| 2403 | 1 | 2µ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 | |||||
| 2407 | 1 | 4µ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 | |||||
| 2413 | 11 | 183µs | 11 | 961ms | 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.. | ||||
| 2417 | 11 | 217µs | 11 | 1.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 | |||||
| 2420 | 1 | 17µs | for my $component (@comps) { | ||
| 2421 | 11 | 303µs | 22 | 376ms | 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 |
| 2422 | 11 | 424µs | 22 | 3.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 ); | ||||
| 2425 | 11 | 50µ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 | |||||
| 2435 | This method is meant to provide a list of component modules that should be | ||||
| 2436 | setup for the application. By default, it will use L<Module::Pluggable>. | ||||
| 2437 | |||||
| 2438 | Specify a C<setup_components> config option to pass additional options directly | ||||
| 2439 | to L<Module::Pluggable>. To add additional search paths, specify a key named | ||||
| 2440 | C<search_extra> as an array reference. Items in the array beginning with C<::> | ||||
| 2441 | will 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 | ||||
| 2446 | 1 | 2µs | my $class = shift; | ||
| 2447 | 1 | 2µs | my $config = shift; | ||
| 2448 | |||||
| 2449 | 1 | 8µs | my @paths = qw( ::Controller ::C ::Model ::M ::View ::V ); | ||
| 2450 | 1 | 4µs | my $extra = delete $config->{ search_extra } || []; | ||
| 2451 | |||||
| 2452 | 1 | 2µs | push @paths, @$extra; | ||
| 2453 | |||||
| 2454 | 6 | 90µs | 6 | 44µs | my $locator = Module::Pluggable::Object->new( # spent 44µs making 6 calls to Catalyst::CORE:subst, avg 7µs/call |
| 2455 | 7 | 53µs | 1 | 22µs | search_path => [ map { s/^(?=::)/$class/; $_; } @paths ], # spent 22µs making 1 call to Module::Pluggable::Object::new |
| 2456 | %$config | ||||
| 2457 | ); | ||||
| 2458 | |||||
| 2459 | 1 | 21µs | 1 | 35.2ms | my @comps = $locator->plugins; # spent 35.2ms making 1 call to Module::Pluggable::Object::plugins |
| 2460 | |||||
| 2461 | 1 | 32µs | return @comps; | ||
| 2462 | } | ||||
| 2463 | |||||
| 2464 | =head2 $c->expand_component_module( $component, $setup_component_config ) | ||||
| 2465 | |||||
| 2466 | Components found by C<locate_components> will be passed to this method, which | ||||
| 2467 | is expected to return a list of component (package) names to be set up. | ||||
| 2468 | |||||
| 2469 | =cut | ||||
| 2470 | |||||
| 2471 | sub 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 | ||||
| 2485 | 11 | 42µs | my ($app_class, $component) = @_; | ||
| 2486 | 11 | 340µs | 11 | 73µs | return unless $component->isa('Catalyst::Controller'); # spent 73µs making 11 calls to UNIVERSAL::isa, avg 7µs/call |
| 2487 | 6 | 295µs | 6 | 28µ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 |
| 2488 | 30 | 281µs | 30 | 864µ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 | ||||
| 2494 | 11 | 27µs | my( $class, $component ) = @_; | ||
| 2495 | |||||
| 2496 | 11 | 389µs | 11 | 101µs | unless ( $component->can( 'COMPONENT' ) ) { # spent 101µs making 11 calls to UNIVERSAL::can, avg 9µs/call |
| 2497 | return $component; | ||||
| 2498 | } | ||||
| 2499 | |||||
| 2500 | 11 | 66µs | 11 | 949µs | my $suffix = Catalyst::Utils::class2classsuffix( $component ); # spent 949µs making 11 calls to Catalyst::Utils::class2classsuffix, avg 86µs/call |
| 2501 | 11 | 93µs | 11 | 2.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. | ||||
| 2505 | 11 | 43µs | local $config->{catalyst_component_name} = $component; | ||
| 2506 | |||||
| 2507 | 22 | 155µs | 11 | 370ms | my $instance = eval { $component->COMPONENT( $class, $config ); }; # spent 370ms making 11 calls to Catalyst::Component::COMPONENT, avg 33.7ms/call |
| 2508 | |||||
| 2509 | 11 | 16µs | if ( my $error = $@ ) { | ||
| 2510 | chomp $error; | ||||
| 2511 | Catalyst::Exception->throw( | ||||
| 2512 | message => qq/Couldn't instantiate component "$component", "$error"/ | ||||
| 2513 | ); | ||||
| 2514 | } | ||||
| 2515 | |||||
| 2516 | 11 | 114µs | 11 | 51µ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 | } | ||||
| 2526 | 11 | 113µs | return $instance; | ||
| 2527 | } | ||||
| 2528 | |||||
| 2529 | =head2 $c->setup_dispatcher | ||||
| 2530 | |||||
| 2531 | Sets 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 | ||||
| 2536 | 1 | 3µs | my ( $class, $dispatcher ) = @_; | ||
| 2537 | |||||
| 2538 | 1 | 2µs | if ($dispatcher) { | ||
| 2539 | $dispatcher = 'Catalyst::Dispatcher::' . $dispatcher; | ||||
| 2540 | } | ||||
| 2541 | |||||
| 2542 | 1 | 141µs | 1 | 271µ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 | |||||
| 2546 | 1 | 44µs | 1 | 401µs | unless ($dispatcher) { # spent 401µs making 1 call to Catalyst::_dispatcher_class_accessor |
| 2547 | $dispatcher = $class->dispatcher_class; | ||||
| 2548 | } | ||||
| 2549 | |||||
| 2550 | 1 | 9µs | 1 | 467ms | Class::MOP::load_class($dispatcher); # spent 467ms making 1 call to Class::MOP::load_class |
| 2551 | |||||
| 2552 | # dispatcher instance | ||||
| 2553 | 1 | 81µs | 2 | 1.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 | |||||
| 2558 | Sets 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 | ||||
| 2563 | 1 | 3µs | my ( $class, $engine ) = @_; | ||
| 2564 | |||||
| 2565 | 1 | 2µs | if ($engine) { | ||
| 2566 | $engine = 'Catalyst::Engine::' . $engine; | ||||
| 2567 | } | ||||
| 2568 | |||||
| 2569 | 1 | 12µs | 1 | 76µ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 | |||||
| 2573 | 1 | 4µ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 | |||||
| 2630 | 1 | 1µs | unless ($engine) { | ||
| 2631 | $engine = $class->engine_class; | ||||
| 2632 | } | ||||
| 2633 | |||||
| 2634 | 1 | 75µs | 1 | 326µ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 | ||||
| 2637 | 1 | 2µs | my $old_engine; | ||
| 2638 | 1 | 141µs | 4 | 88µ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 | |||||
| 2662 | 1 | 2µ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 | ||||
| 2669 | 1 | 72µs | 2 | 4.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 | |||||
| 2674 | Sets up the home directory. | ||||
| 2675 | |||||
| 2676 | =cut | ||||
| 2677 | |||||
| 2678 | sub setup_home { | ||||
| 2679 | 2 | 5µs | my ( $class, $home ) = @_; | ||
| 2680 | |||||
| 2681 | 2 | 13µs | 2 | 116µ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 | |||||
| 2685 | 2 | 17µs | 2 | 28.3ms | $home ||= Catalyst::Utils::home($class); # spent 28.3ms making 2 calls to Catalyst::Utils::home, avg 14.2ms/call |
| 2686 | |||||
| 2687 | 2 | 20µs | if ($home) { | ||
| 2688 | #I remember recently being scolded for assigning config values like this | ||||
| 2689 | 2 | 30µs | 2 | 1.92ms | $class->config->{home} ||= $home; # spent 1.92ms making 2 calls to Catalyst::config, avg 960µs/call |
| 2690 | 2 | 37µs | 5 | 3.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 | |||||
| 2696 | Sets up log by instantiating a L<Catalyst::Log|Catalyst::Log> object and | ||||
| 2697 | passing it to C<log()>. Pass in a comma-delimited list of levels to set the | ||||
| 2698 | log to. | ||||
| 2699 | |||||
| 2700 | This method also installs a C<debug> method that returns a true value into the | ||||
| 2701 | catalyst subclass if the "debug" level is passed in the comma-delimited list, | ||||
| 2702 | or if the C<$CATALYST_DEBUG> environment variable is set to a true value. | ||||
| 2703 | |||||
| 2704 | Note that if the log has already been setup, by either a previous call to | ||||
| 2705 | C<setup_log> or by a call such as C<< __PACKAGE__->log( MyLogger->new ) >>, | ||||
| 2706 | that 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 | ||||
| 2711 | 1 | 2µs | my ( $class, $levels ) = @_; | ||
| 2712 | |||||
| 2713 | 1 | 1µs | $levels ||= ''; | ||
| 2714 | 1 | 10µs | 1 | 1µs | $levels =~ s/^\s+//; # spent 1µs making 1 call to Catalyst::CORE:subst |
| 2715 | 1 | 5µs | 1 | 1µs | $levels =~ s/\s+$//; # spent 1µs making 1 call to Catalyst::CORE:subst |
| 2716 | 1 | 3µs | my %levels = map { $_ => 1 } split /\s*,\s*/, $levels; | ||
| 2717 | |||||
| 2718 | 1 | 4µs | 1 | 31µs | my $env_debug = Catalyst::Utils::env_value( $class, 'DEBUG' ); # spent 31µs making 1 call to Catalyst::Utils::env_value |
| 2719 | 1 | 2µs | if ( defined $env_debug ) { | ||
| 2720 | 1 | 2µs | $levels{debug} = 1 if $env_debug; # Ugly! | ||
| 2721 | 1 | 700ns | delete($levels{debug}) unless $env_debug; | ||
| 2722 | } | ||||
| 2723 | |||||
| 2724 | 1 | 50µs | 3 | 1.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 | |||||
| 2728 | 1 | 8µs | if ( $levels{debug} ) { | ||
| 2729 | 29 | 462µs | 2 | 95µ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 |
| 2730 | 1 | 8µs | 2 | 145µ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 | |||||
| 2736 | Sets up plugins. | ||||
| 2737 | |||||
| 2738 | =cut | ||||
| 2739 | |||||
| 2740 | =head2 $c->setup_stats | ||||
| 2741 | |||||
| 2742 | Sets 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 | ||||
| 2747 | 1 | 4µs | my ( $class, $stats ) = @_; | ||
| 2748 | |||||
| 2749 | 1 | 107µs | 2 | 64.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 | |||||
| 2751 | 1 | 10µs | 1 | 72µs | my $env = Catalyst::Utils::env_value( $class, 'STATS' ); # spent 72µs making 1 call to Catalyst::Utils::env_value |
| 2752 | 1 | 25µs | 1 | 7µs | if ( defined($env) ? $env : ($stats || $class->debug ) ) { # spent 7µs making 1 call to Epoll::debug |
| 2753 | 29 | 250µs | 2 | 227µ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 |
| 2754 | 1 | 59µs | 2 | 252µ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 | |||||
| 2761 | Returns a sorted list of the plugins which have either been stated in the | ||||
| 2762 | import list or which have been added via C<< MyApp->plugin(@args); >>. | ||||
| 2763 | |||||
| 2764 | If passed a given plugin name, it will report a boolean value indicating | ||||
| 2765 | whether or not that plugin is loaded. A fully qualified name is required if | ||||
| 2766 | the 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 | |||||
| 2776 | 1 | 2µs | # spent 247µs (160+87) within Catalyst::registered_plugins which was called
# once (160µs+87µs) by Catalyst::setup at line 1109 | ||
| 2777 | 1 | 2µs | my $proto = shift; | ||
| 2778 | 1 | 176µs | 2 | 88µ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 | ||||
| 2785 | 6 | 179µs | my ( $proto, $plugin, $instant ) = @_; | ||
| 2786 | 6 | 13µs | my $class = ref $proto || $proto; | ||
| 2787 | |||||
| 2788 | 6 | 101µs | 6 | 1.21ms | Class::MOP::load_class( $plugin ); # spent 1.21ms making 6 calls to Class::MOP::load_class, avg 202µs/call |
| 2789 | 6 | 170µs | 6 | 57µ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' ); | ||||
| 2791 | 6 | 235µs | 6 | 424µs | $proto->_plugins->{$plugin} = 1; # spent 424µs making 6 calls to Catalyst::Component::__plugins_accessor, avg 71µs/call |
| 2792 | 6 | 24µs | unless ($instant) { | ||
| 2793 | 3 | 565µs | 2 | 94µ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 # spent 58µs making 1 call to Catalyst::BEGIN@2793
# spent 36µs making 1 call to strict::unimport |
| 2794 | 6 | 63µs | 6 | 42µ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 |
| 2795 | 6 | 177µs | 6 | 1.01ms | my @superclasses = ($plugin, $meta->superclasses ); # spent 1.01ms making 6 calls to Moose::Meta::Class::superclasses, avg 169µs/call |
| 2796 | 6 | 67µs | 6 | 55.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 | } | ||||
| 2801 | 6 | 63µ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 | ||||
| 2805 | 1 | 2µs | my ( $class, $plugins ) = @_; | ||
| 2806 | |||||
| 2807 | 1 | 14µs | 2 | 150µs | $class->_plugins( {} ) unless $class->_plugins; # spent 150µs making 2 calls to Catalyst::Component::__plugins_accessor, avg 75µs/call |
| 2808 | 1 | 700ns | $plugins ||= []; | ||
| 2809 | |||||
| 2810 | 1 | 18µs | 1 | 206µs | my @plugins = Catalyst::Utils::resolve_namespace($class . '::Plugin', 'Catalyst::Plugin', @$plugins); # spent 206µs making 1 call to Catalyst::Utils::resolve_namespace |
| 2811 | |||||
| 2812 | 1 | 5µs | for my $plugin ( reverse @plugins ) { | ||
| 2813 | 7 | 54µs | 7 | 701ms | Class::MOP::load_class($plugin); # spent 701ms making 7 calls to Class::MOP::load_class, avg 100ms/call |
| 2814 | 7 | 255µs | 7 | 543µs | my $meta = find_meta($plugin); # spent 543µs making 7 calls to Moose::Util::find_meta, avg 78µs/call |
| 2815 | 7 | 64µs | 3 | 24µs | next if $meta && $meta->isa('Moose::Meta::Role'); # spent 24µs making 3 calls to UNIVERSAL::isa, avg 8µs/call |
| 2816 | |||||
| 2817 | 6 | 310µs | 6 | 59.3ms | $class->_register_plugin($plugin); # spent 59.3ms making 6 calls to Catalyst::_register_plugin, avg 9.88ms/call |
| 2818 | } | ||||
| 2819 | |||||
| 2820 | 1 | 19µs | 1 | 5µs | my @roles = # spent 5µs making 1 call to Class::MOP::Package::name |
| 2821 | 7 | 226µs | 14 | 121µ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 |
| 2822 | 7 | 58µs | 7 | 227µs | grep { $_ && blessed($_) && $_->isa('Moose::Meta::Role') } # spent 227µs making 7 calls to Moose::Util::find_meta, avg 32µs/call |
| 2823 | 1 | 37µs | map { find_meta($_) } | ||
| 2824 | @plugins; | ||||
| 2825 | |||||
| 2826 | 1 | 24µs | 1 | 85.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 | |||||
| 2834 | Returns an arrayref of the internal execution stack (actions that are | ||||
| 2835 | currently executing). | ||||
| 2836 | |||||
| 2837 | =head2 $c->stats_class | ||||
| 2838 | |||||
| 2839 | Returns or sets the stats (timing statistics) class. | ||||
| 2840 | |||||
| 2841 | =head2 $c->use_stats | ||||
| 2842 | |||||
| 2843 | Returns 1 when stats collection is enabled. Stats collection is enabled | ||||
| 2844 | when the -Stats options is set, debug is on or when the <MYAPP>_STATS | ||||
| 2845 | environment variable is set. | ||||
| 2846 | |||||
| 2847 | Note that this is a static method, not an accessor and should be overridden | ||||
| 2848 | by declaring C<sub use_stats { 1 }> in your MyApp.pm, not by calling C<< $c->use_stats(1) >>. | ||||
| 2849 | |||||
| 2850 | =cut | ||||
| 2851 | |||||
| 2852 | sub use_stats { 0 } | ||||
| 2853 | |||||
| 2854 | |||||
| 2855 | =head2 $c->write( $data ) | ||||
| 2856 | |||||
| 2857 | Writes $data to the output stream. When using this method directly, you | ||||
| 2858 | will need to manually set the C<Content-Length> header to the length of | ||||
| 2859 | your output data, if known. | ||||
| 2860 | |||||
| 2861 | =cut | ||||
| 2862 | |||||
| 2863 | sub 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 | |||||
| 2874 | Returns the Catalyst version number. Mostly useful for "powered by" | ||||
| 2875 | messages in template systems. | ||||
| 2876 | |||||
| 2877 | =cut | ||||
| 2878 | |||||
| 2879 | sub version { return $Catalyst::VERSION } | ||||
| 2880 | |||||
| 2881 | =head1 CONFIGURATION | ||||
| 2882 | |||||
| 2883 | There are a number of 'base' config variables which can be set: | ||||
| 2884 | |||||
| 2885 | =over | ||||
| 2886 | |||||
| 2887 | =item * | ||||
| 2888 | |||||
| 2889 | C<default_model> - The default model picked if you say C<< $c->model >>. See L<< /$c->model($name) >>. | ||||
| 2890 | |||||
| 2891 | =item * | ||||
| 2892 | |||||
| 2893 | C<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 | |||||
| 2897 | C<disable_component_resolution_regex_fallback> - Turns | ||||
| 2898 | off the deprecated component resolution functionality so | ||||
| 2899 | that if any of the component methods (e.g. C<< $c->controller('Foo') >>) | ||||
| 2900 | are called then regex search will not be attempted on string values and | ||||
| 2901 | instead C<undef> will be returned. | ||||
| 2902 | |||||
| 2903 | =item * | ||||
| 2904 | |||||
| 2905 | C<home> - The application home directory. In an uninstalled application, | ||||
| 2906 | this is the top level application directory. In an installed application, | ||||
| 2907 | this will be the directory containing C<< MyApp.pm >>. | ||||
| 2908 | |||||
| 2909 | =item * | ||||
| 2910 | |||||
| 2911 | C<ignore_frontend_proxy> - See L</PROXY SUPPORT> | ||||
| 2912 | |||||
| 2913 | =item * | ||||
| 2914 | |||||
| 2915 | C<name> - The name of the application in debug messages and the debug and | ||||
| 2916 | welcome screens | ||||
| 2917 | |||||
| 2918 | =item * | ||||
| 2919 | |||||
| 2920 | C<parse_on_demand> - The request body (for example file uploads) will not be parsed | ||||
| 2921 | until it is accessed. This allows you to (for example) check authentication (and reject | ||||
| 2922 | the upload) before actually recieving all the data. See L</ON-DEMAND PARSER> | ||||
| 2923 | |||||
| 2924 | =item * | ||||
| 2925 | |||||
| 2926 | C<root> - The root directory for templates. Usually this is just a | ||||
| 2927 | subdirectory of the home directory, but you can set it to change the | ||||
| 2928 | templates to a different directory. | ||||
| 2929 | |||||
| 2930 | =item * | ||||
| 2931 | |||||
| 2932 | C<search_extra> - Array reference passed to Module::Pluggable to for additional | ||||
| 2933 | namespaces from which components will be loaded (and constructed and stored in | ||||
| 2934 | C<< $c->components >>). | ||||
| 2935 | |||||
| 2936 | =item * | ||||
| 2937 | |||||
| 2938 | C<show_internal_actions> - If true, causes internal actions such as C<< _DISPATCH >> | ||||
| 2939 | to be shown in hit debug tables in the test server. | ||||
| 2940 | |||||
| 2941 | =item * | ||||
| 2942 | |||||
| 2943 | C<using_frontend_proxy> - See L</PROXY SUPPORT>. | ||||
| 2944 | |||||
| 2945 | =back | ||||
| 2946 | |||||
| 2947 | =head1 INTERNAL ACTIONS | ||||
| 2948 | |||||
| 2949 | Catalyst uses internal actions like C<_DISPATCH>, C<_BEGIN>, C<_AUTO>, | ||||
| 2950 | C<_ACTION>, and C<_END>. These are by default not shown in the private | ||||
| 2951 | action 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 | |||||
| 2957 | The request body is usually parsed at the beginning of a request, | ||||
| 2958 | but if you want to handle input yourself, you can enable on-demand | ||||
| 2959 | parsing with a config parameter. | ||||
| 2960 | |||||
| 2961 | MyApp->config(parse_on_demand => 1); | ||||
| 2962 | |||||
| 2963 | =head1 PROXY SUPPORT | ||||
| 2964 | |||||
| 2965 | Many production servers operate using the common double-server approach, | ||||
| 2966 | with a lightweight frontend web server passing requests to a larger | ||||
| 2967 | backend server. An application running on the backend server must deal | ||||
| 2968 | with two problems: the remote user always appears to be C<127.0.0.1> and | ||||
| 2969 | the server's hostname will appear to be C<localhost> regardless of the | ||||
| 2970 | virtual host that the user connected through. | ||||
| 2971 | |||||
| 2972 | Catalyst will automatically detect this situation when you are running | ||||
| 2973 | the frontend and backend servers on the same machine. The following | ||||
| 2974 | changes 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 | |||||
| 2982 | Additionally, you may be running your backend application on an insecure | ||||
| 2983 | connection (port 80) while your frontend proxy is running under SSL. If there | ||||
| 2984 | is a discrepancy in the ports, use the HTTP header C<X-Forwarded-Port> to | ||||
| 2985 | tell Catalyst what port the frontend listens on. This will allow all URIs to | ||||
| 2986 | be created properly. | ||||
| 2987 | |||||
| 2988 | In the case of passing in: | ||||
| 2989 | |||||
| 2990 | X-Forwarded-Port: 443 | ||||
| 2991 | |||||
| 2992 | All calls to C<uri_for> will result in an https link, as is expected. | ||||
| 2993 | |||||
| 2994 | Obviously, your web server must support these headers for this to work. | ||||
| 2995 | |||||
| 2996 | In a more complex server farm environment where you may have your | ||||
| 2997 | frontend proxy server(s) on different machines, you will need to set a | ||||
| 2998 | configuration option to tell Catalyst to read the proxied data from the | ||||
| 2999 | headers. | ||||
| 3000 | |||||
| 3001 | MyApp->config(using_frontend_proxy => 1); | ||||
| 3002 | |||||
| 3003 | If 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 | |||||
| 3009 | Catalyst has been tested under Apache 2's threading C<mpm_worker>, | ||||
| 3010 | C<mpm_winnt>, and the standalone forking HTTP server on Windows. We | ||||
| 3011 | believe the Catalyst core to be thread-safe. | ||||
| 3012 | |||||
| 3013 | If you plan to operate in a threaded environment, remember that all other | ||||
| 3014 | modules you are using must also be thread-safe. Some modules, most notably | ||||
| 3015 | L<DBD::SQLite>, are not thread-safe. | ||||
| 3016 | |||||
| 3017 | =head1 SUPPORT | ||||
| 3018 | |||||
| 3019 | IRC: | ||||
| 3020 | |||||
| 3021 | Join #catalyst on irc.perl.org. | ||||
| 3022 | |||||
| 3023 | Mailing 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 | |||||
| 3028 | Web: | ||||
| 3029 | |||||
| 3030 | http://catalyst.perl.org | ||||
| 3031 | |||||
| 3032 | Wiki: | ||||
| 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 | |||||
| 3056 | sri: Sebastian Riedel <sri@cpan.org> | ||||
| 3057 | |||||
| 3058 | =head1 CONTRIBUTORS | ||||
| 3059 | |||||
| 3060 | abw: Andy Wardley | ||||
| 3061 | |||||
| 3062 | acme: Leon Brocard <leon@astray.com> | ||||
| 3063 | |||||
| 3064 | abraxxa: Alexander Hartmaier <abraxxa@cpan.org> | ||||
| 3065 | |||||
| 3066 | Andrew Bramble | ||||
| 3067 | |||||
| 3068 | Andrew Ford E<lt>A.Ford@ford-mason.co.ukE<gt> | ||||
| 3069 | |||||
| 3070 | Andrew Ruthven | ||||
| 3071 | |||||
| 3072 | andyg: Andy Grundman <andy@hybridized.org> | ||||
| 3073 | |||||
| 3074 | audreyt: Audrey Tang | ||||
| 3075 | |||||
| 3076 | bricas: Brian Cassidy <bricas@cpan.org> | ||||
| 3077 | |||||
| 3078 | Caelum: Rafael Kitover <rkitover@io.com> | ||||
| 3079 | |||||
| 3080 | chansen: Christian Hansen | ||||
| 3081 | |||||
| 3082 | chicks: Christopher Hicks | ||||
| 3083 | |||||
| 3084 | Chisel Wright C<pause@herlpacker.co.uk> | ||||
| 3085 | |||||
| 3086 | Danijel Milicevic C<me@danijel.de> | ||||
| 3087 | |||||
| 3088 | David Kamholz E<lt>dkamholz@cpan.orgE<gt> | ||||
| 3089 | |||||
| 3090 | David Naughton, C<naughton@umn.edu> | ||||
| 3091 | |||||
| 3092 | David E. Wheeler | ||||
| 3093 | |||||
| 3094 | dhoss: Devin Austin <dhoss@cpan.org> | ||||
| 3095 | |||||
| 3096 | dkubb: Dan Kubb <dan.kubb-cpan@onautopilot.com> | ||||
| 3097 | |||||
| 3098 | Drew Taylor | ||||
| 3099 | |||||
| 3100 | dwc: Daniel Westermann-Clark <danieltwc@cpan.org> | ||||
| 3101 | |||||
| 3102 | esskar: Sascha Kiefer | ||||
| 3103 | |||||
| 3104 | fireartist: Carl Franks <cfranks@cpan.org> | ||||
| 3105 | |||||
| 3106 | frew: Arthur Axel "fREW" Schmidt <frioux@gmail.com> | ||||
| 3107 | |||||
| 3108 | gabb: Danijel Milicevic | ||||
| 3109 | |||||
| 3110 | Gary Ashton Jones | ||||
| 3111 | |||||
| 3112 | Gavin Henry C<ghenry@perl.me.uk> | ||||
| 3113 | |||||
| 3114 | Geoff Richards | ||||
| 3115 | |||||
| 3116 | groditi: Guillermo Roditi <groditi@gmail.com> | ||||
| 3117 | |||||
| 3118 | hobbs: Andrew Rodland <andrew@cleverdomain.org> | ||||
| 3119 | |||||
| 3120 | ilmari: Dagfinn Ilmari Mannsåker <ilmari@ilmari.org> | ||||
| 3121 | |||||
| 3122 | jcamacho: Juan Camacho | ||||
| 3123 | |||||
| 3124 | jester: Jesse Sheidlower C<jester@panix.com> | ||||
| 3125 | |||||
| 3126 | jhannah: Jay Hannah <jay@jays.net> | ||||
| 3127 | |||||
| 3128 | Jody Belka | ||||
| 3129 | |||||
| 3130 | Johan Lindstrom | ||||
| 3131 | |||||
| 3132 | jon: Jon Schutz <jjschutz@cpan.org> | ||||
| 3133 | |||||
| 3134 | Jonathan Rockway C<< <jrockway@cpan.org> >> | ||||
| 3135 | |||||
| 3136 | Kieren Diment C<kd@totaldatasolution.com> | ||||
| 3137 | |||||
| 3138 | konobi: Scott McWhirter <konobi@cpan.org> | ||||
| 3139 | |||||
| 3140 | marcus: Marcus Ramberg <mramberg@cpan.org> | ||||
| 3141 | |||||
| 3142 | miyagawa: Tatsuhiko Miyagawa <miyagawa@bulknews.net> | ||||
| 3143 | |||||
| 3144 | mst: Matt S. Trout <mst@shadowcatsystems.co.uk> | ||||
| 3145 | |||||
| 3146 | mugwump: Sam Vilain | ||||
| 3147 | |||||
| 3148 | naughton: David Naughton | ||||
| 3149 | |||||
| 3150 | ningu: David Kamholz <dkamholz@cpan.org> | ||||
| 3151 | |||||
| 3152 | nothingmuch: Yuval Kogman <nothingmuch@woobling.org> | ||||
| 3153 | |||||
| 3154 | numa: Dan Sully <daniel@cpan.org> | ||||
| 3155 | |||||
| 3156 | obra: Jesse Vincent | ||||
| 3157 | |||||
| 3158 | Octavian Rasnita | ||||
| 3159 | |||||
| 3160 | omega: Andreas Marienborg | ||||
| 3161 | |||||
| 3162 | Oleg Kostyuk <cub.uanic@gmail.com> | ||||
| 3163 | |||||
| 3164 | phaylon: Robert Sedlacek <phaylon@dunkelheit.at> | ||||
| 3165 | |||||
| 3166 | rafl: Florian Ragwitz <rafl@debian.org> | ||||
| 3167 | |||||
| 3168 | random: Roland Lammel <lammel@cpan.org> | ||||
| 3169 | |||||
| 3170 | Robert Sedlacek C<< <rs@474.at> >> | ||||
| 3171 | |||||
| 3172 | sky: Arthur Bergman | ||||
| 3173 | |||||
| 3174 | szbalint: Balint Szilakszi <szbalint@cpan.org> | ||||
| 3175 | |||||
| 3176 | t0m: Tomas Doran <bobtfish@bobtfish.net> | ||||
| 3177 | |||||
| 3178 | Ulf Edvinsson | ||||
| 3179 | |||||
| 3180 | Viljo Marrandi C<vilts@yahoo.com> | ||||
| 3181 | |||||
| 3182 | Will Hawes C<info@whawes.co.uk> | ||||
| 3183 | |||||
| 3184 | willert: Sebastian Willert <willert@cpan.org> | ||||
| 3185 | |||||
| 3186 | Yuval Kogman, C<nothingmuch@woobling.org> | ||||
| 3187 | |||||
| 3188 | =head1 LICENSE | ||||
| 3189 | |||||
| 3190 | This library is free software. You can redistribute it and/or modify it under | ||||
| 3191 | the same terms as Perl itself. | ||||
| 3192 | |||||
| 3193 | =cut | ||||
| 3194 | |||||
| 3195 | 3 | 229µs | 2 | 468µ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 # 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 | |||||
| 3197 | 1 | 10µs | 2 | 8.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 | |||||
| 3199 | 1 | 69µs | 1; | ||
# 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 | |||||
# 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 | |||||
# 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 | |||||
# 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 | |||||
# 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 |