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