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

DESCRIPTION

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

HOOKS

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

ATTRIBUTES

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

METHODS

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

HELPERS

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

BUNDLED FILES

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

CODE NAMES

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

SPONSORS

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

PROJECT FOUNDER

625       Sebastian Riedel, "kraih@mojolicious.org"
626

CORE DEVELOPERS

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

CREDITS

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         Marty Tennison
828
829         Matt S Trout
830
831         Matthew Lineen
832
833         Maksym Komar
834
835         Maxim Vuets
836
837         Michael Gregorowicz
838
839         Michael Harris
840
841         Michael Jemmeson
842
843         Mike Magowan
844
845         Mirko Westermeier
846
847         Mons Anderson
848
849         Moritz Lenz
850
851         Neil Watkiss
852
853         Nic Sandfield
854
855         Nils Diewald
856
857         Oleg Zhelo
858
859         Olivier Mengue
860
861         Pascal Gaudette
862
863         Paul Evans
864
865         Paul Robins
866
867         Paul Tomlin
868
869         Pavel Shaydo
870
871         Pedro Melo
872
873         Peter Edwards
874
875         Pierre-Yves Ritschard
876
877         Piotr Roszatycki
878
879         Quentin Carbonneaux
880
881         Rafal Pocztarski
882
883         Randal Schwartz
884
885         Richard Elberger
886
887         Rick Delaney
888
889         Robert Hicks
890
891         Robin Lee
892
893         Roland Lammel
894
895         Roy Storey
896
897         Ryan Jendoubi
898
899         Salvador Fandino
900
901         Santiago Zarate
902
903         Sascha Kiefer
904
905         Scott Wiersdorf
906
907         Sergey Zasenko
908
909         Simon Bertrang
910
911         Simone Tampieri
912
913         Shoichi Kaji
914
915         Shu Cho
916
917         Skye Shaw
918
919         Stanis Trendelenburg
920
921         Stefan Adams
922
923         Steffen Ullrich
924
925         Stephan Kulow
926
927         Stephane Este-Gracias
928
929         Stevan Little
930
931         Steve Atkins
932
933         Tatsuhiko Miyagawa
934
935         Terrence Brannon
936
937         Tianon Gravi
938
939         Tomas Znamenacek
940
941         Tudor Constantin
942
943         Ulrich Habel
944
945         Ulrich Kautz
946
947         Uwe Voelker
948
949         Viacheslav Tykhanovskyi
950
951         Victor Engmark
952
953         Viliam Pucik
954
955         Wes Cravens
956
957         William Lindley
958
959         Yaroslav Korshak
960
961         Yuki Kimoto
962
963         Zak B. Elep
964
965         Zoffix Znet
966
968       Copyright (C) 2008-2020, Sebastian Riedel and others.
969
970       This program is free software, you can redistribute it and/or modify it
971       under the terms of the Artistic License version 2.0.
972

SEE ALSO

974       <https://github.com/mojolicious/mojo>, Mojolicious::Guides,
975       <https://mojolicious.org>.
976
977
978
979perl v5.30.1                      2020-01-30                    Mojolicious(3)
Impressum