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, "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

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         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

SEE ALSO

972       <https://github.com/mojolicious/mojo>, Mojolicious::Guides,
973       <https://mojolicious.org>.
974
975
976
977perl v5.34.0                      2022-01-21                    Mojolicious(3)
Impressum