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