1Mojolicious(3) User Contributed Perl Documentation Mojolicious(3)
2
3
4
6 Mojolicious - Real-time web framework
7
9 # Application
10 package MyApp;
11 use Mojo::Base 'Mojolicious', -signatures;
12
13 # Route
14 sub startup ($self) {
15 $self->routes->get('/hello')->to('foo#hello');
16 }
17
18 # Controller
19 package MyApp::Controller::Foo;
20 use Mojo::Base 'Mojolicious::Controller', -signatures;
21
22 # Action
23 sub hello ($self) {
24 $self->render(text => 'Hello World!');
25 }
26
28 An amazing real-time web framework built on top of the powerful Mojo
29 web development toolkit. With support for RESTful routes, plugins,
30 commands, Perl-ish templates, content negotiation, session management,
31 form validation, testing framework, static file server, "CGI"/"PSGI"
32 detection, first class Unicode support and much more for you to
33 discover.
34
35 Take a look at our excellent documentation in Mojolicious::Guides!
36
38 Mojolicious will emit the following hooks in the listed order.
39
40 before_command
41 Emitted right before the application runs a command through the command
42 line interface.
43
44 $app->hook(before_command => sub ($command, $args) {...});
45
46 Useful for reconfiguring the application before running a command or to
47 modify the behavior of a command. (Passed the command object and the
48 command arguments)
49
50 before_server_start
51 Emitted right before the application server is started, for web servers
52 that support it, which includes all the built-in ones.
53
54 $app->hook(before_server_start => sub ($server, $app) {...});
55
56 Useful for reconfiguring application servers dynamically or collecting
57 server diagnostics information. (Passed the server and application
58 objects)
59
60 after_build_tx
61 Emitted right after the transaction is built and before the HTTP
62 request gets parsed.
63
64 $app->hook(after_build_tx => sub ($tx, $app) {...});
65
66 This is a very powerful hook and should not be used lightly, it makes
67 some rather advanced features such as upload progress bars possible.
68 Note that this hook will not work for embedded applications, because
69 only the host application gets to build transactions. (Passed the
70 transaction and application objects)
71
72 around_dispatch
73 Emitted right after a new request has been received and wraps around
74 the whole dispatch process, so you have to manually forward to the next
75 hook if you want to continue the chain. Default exception handling with
76 "reply->exception" in Mojolicious::Plugin::DefaultHelpers is the first
77 hook in the chain and a call to "dispatch" the last, yours will be in
78 between.
79
80 $app->hook(around_dispatch => sub ($next, $c) {
81 ...
82 $next->();
83 ...
84 });
85
86 This is a very powerful hook and should not be used lightly, it allows
87 you to, for example, customize application-wide exception handling,
88 consider it the sledgehammer in your toolbox. (Passed a callback
89 leading to the next hook and the default controller object)
90
91 before_dispatch
92 Emitted right before the static file server and router start their
93 work.
94
95 $app->hook(before_dispatch => sub ($c) {...});
96
97 Very useful for rewriting incoming requests and other preprocessing
98 tasks. (Passed the default controller object)
99
100 after_static
101 Emitted after a static file response has been generated by the static
102 file server.
103
104 $app->hook(after_static => sub ($c) {...});
105
106 Mostly used for post-processing static file responses. (Passed the
107 default controller object)
108
109 before_routes
110 Emitted after the static file server determined if a static file should
111 be served and before the router starts its work.
112
113 $app->hook(before_routes => sub ($c) {...});
114
115 Mostly used for custom dispatchers and collecting metrics. (Passed the
116 default controller object)
117
118 around_action
119 Emitted right before an action gets executed and wraps around it, so
120 you have to manually forward to the next hook if you want to continue
121 the chain. Default action dispatching is the last hook in the chain,
122 yours will run before it.
123
124 $app->hook(around_action => sub ($next, $c, $action, $last) {
125 ...
126 return $next->();
127 });
128
129 This is a very powerful hook and should not be used lightly, it allows
130 you for example to pass additional arguments to actions or handle
131 return values differently. Note that this hook can trigger more than
132 once for the same request if there are nested routes. (Passed a
133 callback leading to the next hook, the current controller object, the
134 action callback and a flag indicating if this action is an endpoint)
135
136 before_render
137 Emitted before content is generated by the renderer. Note that this
138 hook can trigger out of order due to its dynamic nature, and with
139 embedded applications will only work for the application that is
140 rendering.
141
142 $app->hook(before_render => sub ($c, $args) {...});
143
144 Mostly used for pre-processing arguments passed to the renderer.
145 (Passed the current controller object and the render arguments)
146
147 after_render
148 Emitted after content has been generated by the renderer that will be
149 assigned to the response. Note that this hook can trigger out of order
150 due to its dynamic nature, and with embedded applications will only
151 work for the application that is rendering.
152
153 $app->hook(after_render => sub ($c, $output, $format) {...});
154
155 Mostly used for post-processing dynamically generated content. (Passed
156 the current controller object, a reference to the content and the
157 format)
158
159 after_dispatch
160 Emitted in reverse order after a response has been generated. Note that
161 this hook can trigger out of order due to its dynamic nature, and with
162 embedded applications will only work for the application that is
163 generating the response.
164
165 $app->hook(after_dispatch => sub ($c) {...});
166
167 Useful for rewriting outgoing responses and other post-processing
168 tasks. (Passed the current controller object)
169
171 Mojolicious implements the following attributes.
172
173 commands
174 my $commands = $app->commands;
175 $app = $app->commands(Mojolicious::Commands->new);
176
177 Command line interface for your application, defaults to a
178 Mojolicious::Commands object.
179
180 # Add another namespace to load commands from
181 push @{$app->commands->namespaces}, 'MyApp::Command';
182
183 controller_class
184 my $class = $app->controller_class;
185 $app = $app->controller_class('Mojolicious::Controller');
186
187 Class to be used for the default controller, defaults to
188 Mojolicious::Controller. Note that this class needs to have already
189 been loaded before the first request arrives.
190
191 exception_format
192 my $format = $app->exception_format;
193 $app = $app->exception_format('txt');
194
195 Format for HTTP exceptions ("html", "json", or "txt"), defaults to
196 "html".
197
198 home
199 my $home = $app->home;
200 $app = $app->home(Mojo::Home->new);
201
202 The home directory of your application, defaults to a Mojo::Home object
203 which stringifies to the actual path.
204
205 # Portably generate path relative to home directory
206 my $path = $app->home->child('data', 'important.txt');
207
208 log
209 my $log = $app->log;
210 $app = $app->log(Mojo::Log->new);
211
212 The logging layer of your application, defaults to a Mojo::Log object.
213 The level will default to either the "MOJO_LOG_LEVEL" environment
214 variable, "trace" if the "mode" is "development", or "info" otherwise.
215 All messages will be written to "STDERR" by default.
216
217 # Log debug message
218 $app->log->debug('It works');
219
220 max_request_size
221 my $max = $app->max_request_size;
222 $app = $app->max_request_size(16777216);
223
224 Maximum request size in bytes, defaults to the value of
225 "max_message_size" in Mojo::Message. Setting the value to 0 will allow
226 requests of indefinite size. Note that increasing this value can also
227 drastically increase memory usage, should you for example attempt to
228 parse an excessively large request body with the methods "dom" in
229 Mojo::Message or "json" in Mojo::Message.
230
231 mode
232 my $mode = $app->mode;
233 $app = $app->mode('production');
234
235 The operating mode for your application, defaults to a value from the
236 "MOJO_MODE" and "PLACK_ENV" environment variables or "development".
237
238 moniker
239 my $moniker = $app->moniker;
240 $app = $app->moniker('foo_bar');
241
242 Moniker of this application, often used as default filename for
243 configuration files and the like, defaults to decamelizing the
244 application class with "decamelize" in Mojo::Util.
245
246 plugins
247 my $plugins = $app->plugins;
248 $app = $app->plugins(Mojolicious::Plugins->new);
249
250 The plugin manager, defaults to a Mojolicious::Plugins object. See the
251 "plugin" method below if you want to load a plugin.
252
253 # Add another namespace to load plugins from
254 push @{$app->plugins->namespaces}, 'MyApp::Plugin';
255
256 preload_namespaces
257 my $namespaces = $app->preload_namespaces;
258 $app = $app->preload_namespaces(['MyApp::Controller']);
259
260 Namespaces to preload classes from during application startup.
261
262 renderer
263 my $renderer = $app->renderer;
264 $app = $app->renderer(Mojolicious::Renderer->new);
265
266 Used to render content, defaults to a Mojolicious::Renderer object. For
267 more information about how to generate content see
268 Mojolicious::Guides::Rendering.
269
270 # Enable compression
271 $app->renderer->compress(1);
272
273 # Add another "templates" directory
274 push @{$app->renderer->paths}, '/home/sri/templates';
275
276 # Add another "templates" directory with higher precedence
277 unshift @{$app->renderer->paths}, '/home/sri/themes/blue/templates';
278
279 # Add another class with templates in DATA section
280 push @{$app->renderer->classes}, 'Mojolicious::Plugin::Fun';
281
282 routes
283 my $routes = $app->routes;
284 $app = $app->routes(Mojolicious::Routes->new);
285
286 The router, defaults to a Mojolicious::Routes object. You use this in
287 your startup method to define the url endpoints for your application.
288
289 # Add routes
290 my $r = $app->routes;
291 $r->get('/foo/bar')->to('test#foo', title => 'Hello Mojo!');
292 $r->post('/baz')->to('test#baz');
293
294 # Add another namespace to load controllers from
295 push @{$app->routes->namespaces}, 'MyApp::MyController';
296
297 secrets
298 my $secrets = $app->secrets;
299 $app = $app->secrets([$bytes]);
300
301 Secret passphrases used for signed cookies and the like, defaults to
302 the "moniker" of this application, which is not very secure, so you
303 should change it!!! As long as you are using the insecure default there
304 will be debug messages in the log file reminding you to change your
305 passphrase. Only the first passphrase is used to create new signatures,
306 but all of them for verification. So you can increase security without
307 invalidating all your existing signed cookies by rotating passphrases,
308 just add new ones to the front and remove old ones from the back.
309
310 # Rotate passphrases
311 $app->secrets(['new_passw0rd', 'old_passw0rd', 'very_old_passw0rd']);
312
313 sessions
314 my $sessions = $app->sessions;
315 $app = $app->sessions(Mojolicious::Sessions->new);
316
317 Signed cookie based session manager, defaults to a
318 Mojolicious::Sessions object. You can usually leave this alone, see
319 "session" in Mojolicious::Controller for more information about working
320 with session data.
321
322 # Change name of cookie used for all sessions
323 $app->sessions->cookie_name('mysession');
324
325 # Disable SameSite feature
326 $app->sessions->samesite(undef);
327
328 static
329 my $static = $app->static;
330 $app = $app->static(Mojolicious::Static->new);
331
332 For serving static files from your "public" directories, defaults to a
333 Mojolicious::Static object.
334
335 # Add another "public" directory
336 push @{$app->static->paths}, '/home/sri/public';
337
338 # Add another "public" directory with higher precedence
339 unshift @{$app->static->paths}, '/home/sri/themes/blue/public';
340
341 # Add another class with static files in DATA section
342 push @{$app->static->classes}, 'Mojolicious::Plugin::Fun';
343
344 # Remove built-in favicon
345 delete $app->static->extra->{'favicon.ico'};
346
347 types
348 my $types = $app->types;
349 $app = $app->types(Mojolicious::Types->new);
350
351 Responsible for connecting file extensions with MIME types, defaults to
352 a Mojolicious::Types object.
353
354 # Add custom MIME type
355 $app->types->type(twt => 'text/tweet');
356
357 ua
358 my $ua = $app->ua;
359 $app = $app->ua(Mojo::UserAgent->new);
360
361 A full featured HTTP user agent for use in your applications, defaults
362 to a Mojo::UserAgent object.
363
364 # Perform blocking request
365 say $app->ua->get('example.com')->result->body;
366
367 validator
368 my $validator = $app->validator;
369 $app = $app->validator(Mojolicious::Validator->new);
370
371 Validate values, defaults to a Mojolicious::Validator object.
372
373 # Add validation check
374 $app->validator->add_check(foo => sub ($v, $name, $value) {
375 return $value ne 'foo';
376 });
377
378 # Add validation filter
379 $app->validator->add_filter(quotemeta => sub ($v, $name, $value) {
380 return quotemeta $value;
381 });
382
384 Mojolicious inherits all methods from Mojo::Base and implements the
385 following new ones.
386
387 build_controller
388 my $c = $app->build_controller;
389 my $c = $app->build_controller(Mojo::Transaction::HTTP->new);
390 my $c = $app->build_controller(Mojolicious::Controller->new);
391
392 Build default controller object with "controller_class".
393
394 # Render template from application
395 my $foo = $app->build_controller->render_to_string(template => 'foo');
396
397 build_tx
398 my $tx = $app->build_tx;
399
400 Build Mojo::Transaction::HTTP object and emit "after_build_tx" hook.
401
402 config
403 my $hash = $app->config;
404 my $foo = $app->config('foo');
405 $app = $app->config({foo => 'bar', baz => 23});
406 $app = $app->config(foo => 'bar', baz => 23);
407
408 Application configuration.
409
410 # Remove value
411 my $foo = delete $app->config->{foo};
412
413 # Assign multiple values at once
414 $app->config(foo => 'test', bar => 23);
415
416 defaults
417 my $hash = $app->defaults;
418 my $foo = $app->defaults('foo');
419 $app = $app->defaults({foo => 'bar', baz => 23});
420 $app = $app->defaults(foo => 'bar', baz => 23);
421
422 Default values for "stash" in Mojolicious::Controller, assigned for
423 every new request.
424
425 # Remove value
426 my $foo = delete $app->defaults->{foo};
427
428 # Assign multiple values at once
429 $app->defaults(foo => 'test', bar => 23);
430
431 dispatch
432 $app->dispatch(Mojolicious::Controller->new);
433
434 The heart of every Mojolicious application, calls the "static" and
435 "routes" dispatchers for every request and passes them a
436 Mojolicious::Controller object.
437
438 handler
439 $app->handler(Mojo::Transaction::HTTP->new);
440 $app->handler(Mojolicious::Controller->new);
441
442 Sets up the default controller and emits the "around_dispatch" hook for
443 every request.
444
445 helper
446 $app->helper(foo => sub {...});
447
448 Add or replace a helper that will be available as a method of the
449 controller object and the application object, as well as a function in
450 "ep" templates. For a full list of helpers that are available by
451 default see Mojolicious::Plugin::DefaultHelpers and
452 Mojolicious::Plugin::TagHelpers.
453
454 # Helper
455 $app->helper(cache => sub { state $cache = {} });
456
457 # Application
458 $app->cache->{foo} = 'bar';
459 my $result = $app->cache->{foo};
460
461 # Controller
462 $c->cache->{foo} = 'bar';
463 my $result = $c->cache->{foo};
464
465 # Template
466 % cache->{foo} = 'bar';
467 %= cache->{foo}
468
469 hook
470 $app->hook(after_dispatch => sub {...});
471
472 Extend Mojolicious with hooks, which allow code to be shared with all
473 requests indiscriminately, for a full list of available hooks see
474 "HOOKS".
475
476 # Dispatchers will not run if there's already a response code defined
477 $app->hook(before_dispatch => sub ($c) {
478 $c->render(text => 'Skipped static file server and router!')
479 if $c->req->url->path->to_route =~ /do_not_dispatch/;
480 });
481
482 new
483 my $app = Mojolicious->new;
484 my $app = Mojolicious->new(moniker => 'foo_bar');
485 my $app = Mojolicious->new({moniker => 'foo_bar'});
486
487 Construct a new Mojolicious application and call "startup". Will
488 automatically detect your home directory. Also sets up the renderer,
489 static file server, a default set of plugins and an "around_dispatch"
490 hook with the default exception handling.
491
492 plugin
493 $app->plugin('some_thing');
494 $app->plugin('some_thing', foo => 23);
495 $app->plugin('some_thing', {foo => 23});
496 $app->plugin('SomeThing');
497 $app->plugin('SomeThing', foo => 23);
498 $app->plugin('SomeThing', {foo => 23});
499 $app->plugin('MyApp::Plugin::SomeThing');
500 $app->plugin('MyApp::Plugin::SomeThing', foo => 23);
501 $app->plugin('MyApp::Plugin::SomeThing', {foo => 23});
502
503 Load a plugin, for a full list of example plugins included in the
504 Mojolicious distribution see "PLUGINS" in Mojolicious::Plugins.
505
506 server
507 $app->server(Mojo::Server->new);
508
509 Emits the "before_server_start" hook.
510
511 start
512 $app->start;
513 $app->start(@ARGV);
514
515 Start the command line interface for your application. For a full list
516 of commands that are available by default see "COMMANDS" in
517 Mojolicious::Commands. Note that the options "-h"/"--help", "--home"
518 and "-m"/"--mode", which are shared by all commands, will be parsed
519 from @ARGV during compile time.
520
521 # Always start daemon
522 $app->start('daemon', '-l', 'http://*:8080');
523
524 startup
525 $app->startup;
526
527 This is your main hook into the application, it will be called at
528 application startup. Meant to be overloaded in a subclass.
529
530 sub startup ($self) {...}
531
532 warmup
533 $app->warmup;
534
535 Preload classes from "preload_namespaces" for future use.
536
538 In addition to the "ATTRIBUTES" and "METHODS" above you can also call
539 helpers on Mojolicious objects. This includes all helpers from
540 Mojolicious::Plugin::DefaultHelpers and
541 Mojolicious::Plugin::TagHelpers. Note that application helpers are
542 always called with a new default controller object, so they can't
543 depend on or change controller state, which includes request, response
544 and stash.
545
546 # Call helper
547 say $app->dumper({foo => 'bar'});
548
549 # Longer version
550 say $app->build_controller->helpers->dumper({foo => 'bar'});
551
553 The Mojolicious distribution includes a few files with different
554 licenses that have been bundled for internal use.
555
556 Mojolicious Artwork
557 Copyright (C) 2010-2022, Sebastian Riedel.
558
559 Licensed under the CC-SA License, Version 4.0
560 <http://creativecommons.org/licenses/by-sa/4.0>.
561
562 jQuery
563 Copyright (C) jQuery Foundation.
564
565 Licensed under the MIT License,
566 <http://creativecommons.org/licenses/MIT>.
567
568 highlight.js
569 Copyright (C) 2006, Ivan Sagalaev.
570
571 Licensed under the BSD License,
572 <https://github.com/highlightjs/highlight.js/blob/master/LICENSE>.
573
574 Bootstrap
575 Copyright 2011-2020 The Bootstrap Authors.
576 Copyright 2011-2020 Twitter, Inc.
577
578 Licensed under the MIT License,
579 <http://creativecommons.org/licenses/MIT>.
580
582 Every major release of Mojolicious has a code name, these are the ones
583 that have been used in the past.
584
585 9.0, "Waffle" (U+1F9C7)
586
587 8.0, "Supervillain" (U+1F9B9)
588
589 7.0, "Doughnut" (U+1F369)
590
591 6.0, "Clinking Beer Mugs" (U+1F37B)
592
593 5.0, "Tiger Face" (U+1F42F)
594
595 4.0, "Top Hat" (U+1F3A9)
596
597 3.0, "Rainbow" (U+1F308)
598
599 2.0, "Leaf Fluttering In Wind" (U+1F343)
600
601 1.0, "Snowflake" (U+2744)
602
604 • Stix <https://stix.no> sponsored the creation of the Mojolicious logo
605 (designed by Nicolai Graesdal) and transferred its copyright to
606 Sebastian Riedel.
607
608 • Some of the work on this distribution has been sponsored by The Perl
609 Foundation <https://www.perlfoundation.org>.
610
612 Mojolicious is an open source project that relies on the tireless
613 support of its contributors.
614
615 Project Founder
616 Sebastian Riedel, "kraih@mojolicious.org"
617
618 Core Developers
619 Current voting members of the core team in alphabetical order:
620
621 CandyAngel, "candyangel@mojolicious.org"
622
623 Christopher Rasch-Olsen Raa, "christopher@mojolicious.org"
624
625 Dan Book, "grinnz@mojolicious.org"
626
627 Jan Henning Thorsen, "batman@mojolicious.org"
628
629 Joel Berger, "jberger@mojolicious.org"
630
631 Marcus Ramberg, "marcus@mojolicious.org"
632
633 The following members of the core team are currently on hiatus:
634
635 Abhijit Menon-Sen, "ams@cpan.org"
636
637 Glen Hinkle, "tempire@cpan.org"
638
639 Contributors
640 In alphabetical order:
641
642 Adam Kennedy
643
644 Adriano Ferreira
645
646 Al Newkirk
647
648 Alex Efros
649
650 Alex Salimon
651
652 Alexander Karelas
653
654 Alexey Likhatskiy
655
656 Anatoly Sharifulin
657
658 Andre Parker
659
660 Andre Vieth
661
662 Andreas Guldstrand
663
664 Andreas Jaekel
665
666 Andreas Koenig
667
668 Andrew Fresh
669
670 Andrew Nugged
671
672 Andrey Khozov
673
674 Andrey Kuzmin
675
676 Andy Grundman
677
678 Andy Lester
679
680 Aristotle Pagaltzis
681
682 Ashley Dev
683
684 Ask Bjoern Hansen
685
686 Audrey Tang
687
688 Ben Tyler
689
690 Ben van Staveren
691
692 Benjamin Erhart
693
694 Bernhard Graf
695
696 Breno G. de Oliveira
697
698 Brian Duggan
699
700 Brian Medley
701
702 Burak Gursoy
703
704 Ch Lamprecht
705
706 Charlie Brady
707
708 Chas. J. Owens IV
709
710 Chase Whitener
711
712 Chris Scheller
713
714 Christian Hansen
715
716 chromatic
717
718 Curt Tilmes
719
720 Daniel Kimsey
721
722 Daniel Mantovani
723
724 Danijel Tasov
725
726 Dagfinn Ilmari Manns�ker
727
728 Danny Thomas
729
730 David Davis
731
732 David Webb
733
734 Diego Kuperman
735
736 Dmitriy Shalashov
737
738 Dmitry Konstantinov
739
740 Dominik Jarmulowicz
741
742 Dominique Dumont
743
744 Dotan Dimet
745
746 Douglas Christopher Wilson
747
748 Elmar S. Heeb
749
750 Ettore Di Giacinto
751
752 Eugen Konkov
753
754 Eugene Toropov
755
756 Flavio Poletti
757
758 Gisle Aas
759
760 Graham Barr
761
762 Graham Knop
763
764 Heiko Jansen
765
766 Henry Tang
767
768 Hideki Yamamura
769
770 Hiroki Toyokawa
771
772 Ian Goodacre
773
774 Ilya Chesnokov
775
776 Ilya Rassadin
777
778 James Duncan
779
780 Jan Jona Javorsek
781
782 Jan Schmidt
783
784 Jaroslav Muhin
785
786 Jesse Vincent
787
788 Johannes Plunien
789
790 John Kingsley
791
792 Jonathan Yu
793
794 Josh Leder
795
796 Kamen Naydenov
797
798 Karen Etheridge
799
800 Kazuhiro Shibuya
801
802 Kevin Old
803
804 Kitamura Akatsuki
805
806 Klaus S. Madsen
807
808 Knut Arne Bjorndal
809
810 Lars Balker Rasmussen
811
812 Lee Johnson
813
814 Leon Brocard
815
816 Magnus Holm
817
818 Maik Fischer
819
820 Mark Fowler
821
822 Mark Grimes
823
824 Mark Stosberg
825
826 Martin McGrath
827
828 Marty Tennison
829
830 Matt S Trout
831
832 Matthew Lineen
833
834 Maksym Komar
835
836 Maxim Vuets
837
838 Michael Gregorowicz
839
840 Michael Harris
841
842 Michael Jemmeson
843
844 Mike Magowan
845
846 Mirko Westermeier
847
848 Mons Anderson
849
850 Moritz Lenz
851
852 Neil Watkiss
853
854 Nic Sandfield
855
856 Nils Diewald
857
858 Oleg Zhelo
859
860 Olivier Mengue
861
862 Pascal Gaudette
863
864 Paul Evans
865
866 Paul Robins
867
868 Paul Tomlin
869
870 Pavel Shaydo
871
872 Pedro Melo
873
874 Peter Edwards
875
876 Pierre-Yves Ritschard
877
878 Piotr Roszatycki
879
880 Quentin Carbonneaux
881
882 Rafal Pocztarski
883
884 Randal Schwartz
885
886 Richard Elberger
887
888 Rick Delaney
889
890 Robert Hicks
891
892 Robert Rothenberg
893
894 Robin Lee
895
896 Roland Lammel
897
898 Roy Storey
899
900 Ryan Jendoubi
901
902 Salvador Fandino
903
904 Santiago Zarate
905
906 Sascha Kiefer
907
908 Scott Wiersdorf
909
910 Sebastian Paaske Torholm
911
912 Sergey Zasenko
913
914 Simon Bertrang
915
916 Simone Tampieri
917
918 Shoichi Kaji
919
920 Shu Cho
921
922 Skye Shaw
923
924 Stanis Trendelenburg
925
926 Stefan Adams
927
928 Steffen Ullrich
929
930 Stephan Kulow
931
932 Stephane Este-Gracias
933
934 Stevan Little
935
936 Steve Atkins
937
938 Tatsuhiko Miyagawa
939
940 Terrence Brannon
941
942 Tianon Gravi
943
944 Tomas Znamenacek
945
946 Tudor Constantin
947
948 Ulrich Habel
949
950 Ulrich Kautz
951
952 Uwe Voelker
953
954 Veesh Goldman
955
956 Viacheslav Tykhanovskyi
957
958 Victor Engmark
959
960 Viliam Pucik
961
962 Wes Cravens
963
964 William Lindley
965
966 Yaroslav Korshak
967
968 Yuki Kimoto
969
970 Zak B. Elep
971
972 Zoffix Znet
973
975 Copyright (C) 2008-2022, Sebastian Riedel and others.
976
977 This program is free software, you can redistribute it and/or modify it
978 under the terms of the Artistic License version 2.0.
979
981 <https://github.com/mojolicious/mojo>, Mojolicious::Guides,
982 <https://mojolicious.org>.
983
984
985
986perl v5.36.0 2023-01-20 Mojolicious(3)