1Mojolicious(3)        User Contributed Perl Documentation       Mojolicious(3)
2
3
4

NAME

6       Mojolicious - Real-time web framework
7

SYNOPSIS

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

DESCRIPTION

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

HOOKS

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

ATTRIBUTES

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

METHODS

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

HELPERS

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

BUNDLED FILES

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

CODE NAMES

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

SPONSORS

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

AUTHORS

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

SEE ALSO

970       <https://github.com/mojolicious/mojo>, Mojolicious::Guides,
971       <https://mojolicious.org>.
972
973
974
975perl v5.34.0                      2021-07-22                    Mojolicious(3)
Impressum