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, "debug" 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 Christopher Rasch-Olsen Raa, "christopher@mojolicious.org"
615
616 Dan Book, "grinnz@mojolicious.org"
617
618 Jan Henning Thorsen, "batman@mojolicious.org"
619
620 Joel Berger, "jberger@mojolicious.org"
621
622 Marcus Ramberg, "marcus@mojolicious.org"
623
624 The following members of the core team are currently on hiatus:
625
626 Abhijit Menon-Sen, "ams@cpan.org"
627
628 CandyAngel, "candyangel@mojolicious.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 Aristotle Pagaltzis
672
673 Ashley Dev
674
675 Ask Bjoern Hansen
676
677 Audrey Tang
678
679 Ben Tyler
680
681 Ben van Staveren
682
683 Benjamin Erhart
684
685 Bernhard Graf
686
687 Breno G. de Oliveira
688
689 Brian Duggan
690
691 Brian Medley
692
693 Burak Gursoy
694
695 Ch Lamprecht
696
697 Charlie Brady
698
699 Chas. J. Owens IV
700
701 Chase Whitener
702
703 Chris Scheller
704
705 Christian Hansen
706
707 chromatic
708
709 Curt Tilmes
710
711 Daniel Kimsey
712
713 Daniel Mantovani
714
715 Danijel Tasov
716
717 Dagfinn Ilmari Manns�ker
718
719 Danny Thomas
720
721 David Davis
722
723 David Webb
724
725 Diego Kuperman
726
727 Dmitriy Shalashov
728
729 Dmitry Konstantinov
730
731 Dominik Jarmulowicz
732
733 Dominique Dumont
734
735 Dotan Dimet
736
737 Douglas Christopher Wilson
738
739 Elmar S. Heeb
740
741 Ettore Di Giacinto
742
743 Eugen Konkov
744
745 Eugene Toropov
746
747 Flavio Poletti
748
749 Gisle Aas
750
751 Graham Barr
752
753 Graham Knop
754
755 Henry Tang
756
757 Hideki Yamamura
758
759 Hiroki Toyokawa
760
761 Ian Goodacre
762
763 Ilya Chesnokov
764
765 Ilya Rassadin
766
767 James Duncan
768
769 Jan Jona Javorsek
770
771 Jan Schmidt
772
773 Jaroslav Muhin
774
775 Jesse Vincent
776
777 Johannes Plunien
778
779 John Kingsley
780
781 Jonathan Yu
782
783 Josh Leder
784
785 Kamen Naydenov
786
787 Karen Etheridge
788
789 Kazuhiro Shibuya
790
791 Kevin Old
792
793 Kitamura Akatsuki
794
795 Klaus S. Madsen
796
797 Knut Arne Bjorndal
798
799 Lars Balker Rasmussen
800
801 Lee Johnson
802
803 Leon Brocard
804
805 Magnus Holm
806
807 Maik Fischer
808
809 Mark Fowler
810
811 Mark Grimes
812
813 Mark Stosberg
814
815 Martin McGrath
816
817 Marty Tennison
818
819 Matt S Trout
820
821 Matthew Lineen
822
823 Maksym Komar
824
825 Maxim Vuets
826
827 Michael Gregorowicz
828
829 Michael Harris
830
831 Michael Jemmeson
832
833 Mike Magowan
834
835 Mirko Westermeier
836
837 Mons Anderson
838
839 Moritz Lenz
840
841 Neil Watkiss
842
843 Nic Sandfield
844
845 Nils Diewald
846
847 Oleg Zhelo
848
849 Olivier Mengue
850
851 Pascal Gaudette
852
853 Paul Evans
854
855 Paul Robins
856
857 Paul Tomlin
858
859 Pavel Shaydo
860
861 Pedro Melo
862
863 Peter Edwards
864
865 Pierre-Yves Ritschard
866
867 Piotr Roszatycki
868
869 Quentin Carbonneaux
870
871 Rafal Pocztarski
872
873 Randal Schwartz
874
875 Richard Elberger
876
877 Rick Delaney
878
879 Robert Hicks
880
881 Robert Rothenberg
882
883 Robin Lee
884
885 Roland Lammel
886
887 Roy Storey
888
889 Ryan Jendoubi
890
891 Salvador Fandino
892
893 Santiago Zarate
894
895 Sascha Kiefer
896
897 Scott Wiersdorf
898
899 Sebastian Paaske Torholm
900
901 Sergey Zasenko
902
903 Simon Bertrang
904
905 Simone Tampieri
906
907 Shoichi Kaji
908
909 Shu Cho
910
911 Skye Shaw
912
913 Stanis Trendelenburg
914
915 Stefan Adams
916
917 Steffen Ullrich
918
919 Stephan Kulow
920
921 Stephane Este-Gracias
922
923 Stevan Little
924
925 Steve Atkins
926
927 Tatsuhiko Miyagawa
928
929 Terrence Brannon
930
931 Tianon Gravi
932
933 Tomas Znamenacek
934
935 Tudor Constantin
936
937 Ulrich Habel
938
939 Ulrich Kautz
940
941 Uwe Voelker
942
943 Veesh Goldman
944
945 Viacheslav Tykhanovskyi
946
947 Victor Engmark
948
949 Viliam Pucik
950
951 Wes Cravens
952
953 William Lindley
954
955 Yaroslav Korshak
956
957 Yuki Kimoto
958
959 Zak B. Elep
960
961 Zoffix Znet
962
964 Copyright (C) 2008-2021, Sebastian Riedel and others.
965
966 This program is free software, you can redistribute it and/or modify it
967 under the terms of the Artistic License version 2.0.
968
970 <https://github.com/mojolicious/mojo>, Mojolicious::Guides,
971 <https://mojolicious.org>.
972
973
974
975perl v5.34.0 2021-07-22 Mojolicious(3)