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 exception_format
192 my $format = $app->exception_format;
193 $app = $app->exception_format('txt');
194
195 Format for HTTP exceptions ("html", "json", or "txt"), defaults to
196 "html".
197
198 home
199 my $home = $app->home;
200 $app = $app->home(Mojo::Home->new);
201
202 The home directory of your application, defaults to a Mojo::Home object
203 which stringifies to the actual path.
204
205 # Portably generate path relative to home directory
206 my $path = $app->home->child('data', 'important.txt');
207
208 log
209 my $log = $app->log;
210 $app = $app->log(Mojo::Log->new);
211
212 The logging layer of your application, defaults to a Mojo::Log object.
213 The level will default to either the "MOJO_LOG_LEVEL" environment
214 variable, "trace" if the "mode" is "development", or "info" otherwise.
215 All messages will be written to "STDERR" by default.
216
217 # Log debug message
218 $app->log->debug('It works');
219
220 max_request_size
221 my $max = $app->max_request_size;
222 $app = $app->max_request_size(16777216);
223
224 Maximum request size in bytes, defaults to the value of
225 "max_message_size" in Mojo::Message. Setting the value to 0 will allow
226 requests of indefinite size. Note that increasing this value can also
227 drastically increase memory usage, should you for example attempt to
228 parse an excessively large request body with the methods "dom" in
229 Mojo::Message or "json" in Mojo::Message.
230
231 mode
232 my $mode = $app->mode;
233 $app = $app->mode('production');
234
235 The operating mode for your application, defaults to a value from the
236 "MOJO_MODE" and "PLACK_ENV" environment variables or "development".
237
238 moniker
239 my $moniker = $app->moniker;
240 $app = $app->moniker('foo_bar');
241
242 Moniker of this application, often used as default filename for
243 configuration files and the like, defaults to decamelizing the
244 application class with "decamelize" in Mojo::Util.
245
246 plugins
247 my $plugins = $app->plugins;
248 $app = $app->plugins(Mojolicious::Plugins->new);
249
250 The plugin manager, defaults to a Mojolicious::Plugins object. See the
251 "plugin" method below if you want to load a plugin.
252
253 # Add another namespace to load plugins from
254 push @{$app->plugins->namespaces}, 'MyApp::Plugin';
255
256 preload_namespaces
257 my $namespaces = $app->preload_namespaces;
258 $app = $app->preload_namespaces(['MyApp::Controller']);
259
260 Namespaces to preload classes from during application startup.
261
262 renderer
263 my $renderer = $app->renderer;
264 $app = $app->renderer(Mojolicious::Renderer->new);
265
266 Used to render content, defaults to a Mojolicious::Renderer object. For
267 more information about how to generate content see
268 Mojolicious::Guides::Rendering.
269
270 # Enable compression
271 $app->renderer->compress(1);
272
273 # Add another "templates" directory
274 push @{$app->renderer->paths}, '/home/sri/templates';
275
276 # Add another "templates" directory with higher precedence
277 unshift @{$app->renderer->paths}, '/home/sri/themes/blue/templates';
278
279 # Add another class with templates in DATA section
280 push @{$app->renderer->classes}, 'Mojolicious::Plugin::Fun';
281
282 routes
283 my $routes = $app->routes;
284 $app = $app->routes(Mojolicious::Routes->new);
285
286 The router, defaults to a Mojolicious::Routes object. You use this in
287 your startup method to define the url endpoints for your application.
288
289 # Add routes
290 my $r = $app->routes;
291 $r->get('/foo/bar')->to('test#foo', title => 'Hello Mojo!');
292 $r->post('/baz')->to('test#baz');
293
294 # Add another namespace to load controllers from
295 push @{$app->routes->namespaces}, 'MyApp::MyController';
296
297 secrets
298 my $secrets = $app->secrets;
299 $app = $app->secrets([$bytes]);
300
301 Secret passphrases used for signed cookies and the like, defaults to
302 the "moniker" of this application, which is not very secure, so you
303 should change it!!! As long as you are using the insecure default there
304 will be debug messages in the log file reminding you to change your
305 passphrase. Only the first passphrase is used to create new signatures,
306 but all of them for verification. So you can increase security without
307 invalidating all your existing signed cookies by rotating passphrases,
308 just add new ones to the front and remove old ones from the back.
309
310 # Rotate passphrases
311 $app->secrets(['new_passw0rd', 'old_passw0rd', 'very_old_passw0rd']);
312
313 sessions
314 my $sessions = $app->sessions;
315 $app = $app->sessions(Mojolicious::Sessions->new);
316
317 Signed cookie based session manager, defaults to a
318 Mojolicious::Sessions object. You can usually leave this alone, see
319 "session" in Mojolicious::Controller for more information about working
320 with session data.
321
322 # Change name of cookie used for all sessions
323 $app->sessions->cookie_name('mysession');
324
325 # Disable SameSite feature
326 $app->sessions->samesite(undef);
327
328 static
329 my $static = $app->static;
330 $app = $app->static(Mojolicious::Static->new);
331
332 For serving static files from your "public" directories, defaults to a
333 Mojolicious::Static object.
334
335 # Serve static files only with a "/static" prefix
336 $app->static->prefix('/static');
337
338 # Add another "public" directory
339 push @{$app->static->paths}, '/home/sri/public';
340
341 # Add another "public" directory with higher precedence
342 unshift @{$app->static->paths}, '/home/sri/themes/blue/public';
343
344 # Add another class with static files in DATA section
345 push @{$app->static->classes}, 'Mojolicious::Plugin::Fun';
346
347 # Remove built-in favicon
348 delete $app->static->extra->{'favicon.ico'};
349
350 types
351 my $types = $app->types;
352 $app = $app->types(Mojolicious::Types->new);
353
354 Responsible for connecting file extensions with MIME types, defaults to
355 a Mojolicious::Types object.
356
357 # Add custom MIME type
358 $app->types->type(twt => 'text/tweet');
359
360 ua
361 my $ua = $app->ua;
362 $app = $app->ua(Mojo::UserAgent->new);
363
364 A full featured HTTP user agent for use in your applications, defaults
365 to a Mojo::UserAgent object.
366
367 # Perform blocking request
368 say $app->ua->get('example.com')->result->body;
369
370 validator
371 my $validator = $app->validator;
372 $app = $app->validator(Mojolicious::Validator->new);
373
374 Validate values, defaults to a Mojolicious::Validator object.
375
376 # Add validation check
377 $app->validator->add_check(foo => sub ($v, $name, $value) {
378 return $value ne 'foo';
379 });
380
381 # Add validation filter
382 $app->validator->add_filter(quotemeta => sub ($v, $name, $value) {
383 return quotemeta $value;
384 });
385
387 Mojolicious inherits all methods from Mojo::Base and implements the
388 following new ones.
389
390 build_controller
391 my $c = $app->build_controller;
392 my $c = $app->build_controller(Mojo::Transaction::HTTP->new);
393 my $c = $app->build_controller(Mojolicious::Controller->new);
394
395 Build default controller object with "controller_class".
396
397 # Render template from application
398 my $foo = $app->build_controller->render_to_string(template => 'foo');
399
400 build_tx
401 my $tx = $app->build_tx;
402
403 Build Mojo::Transaction::HTTP object and emit "after_build_tx" hook.
404
405 config
406 my $hash = $app->config;
407 my $foo = $app->config('foo');
408 $app = $app->config({foo => 'bar', baz => 23});
409 $app = $app->config(foo => 'bar', baz => 23);
410
411 Application configuration.
412
413 # Remove value
414 my $foo = delete $app->config->{foo};
415
416 # Assign multiple values at once
417 $app->config(foo => 'test', bar => 23);
418
419 defaults
420 my $hash = $app->defaults;
421 my $foo = $app->defaults('foo');
422 $app = $app->defaults({foo => 'bar', baz => 23});
423 $app = $app->defaults(foo => 'bar', baz => 23);
424
425 Default values for "stash" in Mojolicious::Controller, assigned for
426 every new request.
427
428 # Remove value
429 my $foo = delete $app->defaults->{foo};
430
431 # Assign multiple values at once
432 $app->defaults(foo => 'test', bar => 23);
433
434 dispatch
435 $app->dispatch(Mojolicious::Controller->new);
436
437 The heart of every Mojolicious application, calls the "static" and
438 "routes" dispatchers for every request and passes them a
439 Mojolicious::Controller object.
440
441 handler
442 $app->handler(Mojo::Transaction::HTTP->new);
443 $app->handler(Mojolicious::Controller->new);
444
445 Sets up the default controller and emits the "around_dispatch" hook for
446 every request.
447
448 helper
449 $app->helper(foo => sub {...});
450
451 Add or replace a helper that will be available as a method of the
452 controller object and the application object, as well as a function in
453 "ep" templates. For a full list of helpers that are available by
454 default see Mojolicious::Plugin::DefaultHelpers and
455 Mojolicious::Plugin::TagHelpers.
456
457 # Helper
458 $app->helper(cache => sub { state $cache = {} });
459
460 # Application
461 $app->cache->{foo} = 'bar';
462 my $result = $app->cache->{foo};
463
464 # Controller
465 $c->cache->{foo} = 'bar';
466 my $result = $c->cache->{foo};
467
468 # Template
469 % cache->{foo} = 'bar';
470 %= cache->{foo}
471
472 hook
473 $app->hook(after_dispatch => sub {...});
474
475 Extend Mojolicious with hooks, which allow code to be shared with all
476 requests indiscriminately, for a full list of available hooks see
477 "HOOKS".
478
479 # Dispatchers will not run if there's already a response code defined
480 $app->hook(before_dispatch => sub ($c) {
481 $c->render(text => 'Skipped static file server and router!')
482 if $c->req->url->path->to_route =~ /do_not_dispatch/;
483 });
484
485 new
486 my $app = Mojolicious->new;
487 my $app = Mojolicious->new(moniker => 'foo_bar');
488 my $app = Mojolicious->new({moniker => 'foo_bar'});
489
490 Construct a new Mojolicious application and call "startup". Will
491 automatically detect your home directory. Also sets up the renderer,
492 static file server, a default set of plugins and an "around_dispatch"
493 hook with the default exception handling.
494
495 plugin
496 $app->plugin('some_thing');
497 $app->plugin('some_thing', foo => 23);
498 $app->plugin('some_thing', {foo => 23});
499 $app->plugin('SomeThing');
500 $app->plugin('SomeThing', foo => 23);
501 $app->plugin('SomeThing', {foo => 23});
502 $app->plugin('MyApp::Plugin::SomeThing');
503 $app->plugin('MyApp::Plugin::SomeThing', foo => 23);
504 $app->plugin('MyApp::Plugin::SomeThing', {foo => 23});
505
506 Load a plugin, for a full list of example plugins included in the
507 Mojolicious distribution see "PLUGINS" in Mojolicious::Plugins.
508
509 server
510 $app->server(Mojo::Server->new);
511
512 Emits the "before_server_start" hook.
513
514 start
515 $app->start;
516 $app->start(@ARGV);
517
518 Start the command line interface for your application. For a full list
519 of commands that are available by default see "COMMANDS" in
520 Mojolicious::Commands. Note that the options "-h"/"--help", "--home"
521 and "-m"/"--mode", which are shared by all commands, will be parsed
522 from @ARGV during compile time.
523
524 # Always start daemon
525 $app->start('daemon', '-l', 'http://*:8080');
526
527 startup
528 $app->startup;
529
530 This is your main hook into the application, it will be called at
531 application startup. Meant to be overloaded in a subclass.
532
533 sub startup ($self) {...}
534
535 warmup
536 $app->warmup;
537
538 Preload classes from "preload_namespaces" for future use.
539
541 In addition to the "ATTRIBUTES" and "METHODS" above you can also call
542 helpers on Mojolicious objects. This includes all helpers from
543 Mojolicious::Plugin::DefaultHelpers and
544 Mojolicious::Plugin::TagHelpers. Note that application helpers are
545 always called with a new default controller object, so they can't
546 depend on or change controller state, which includes request, response
547 and stash.
548
549 # Call helper
550 say $app->dumper({foo => 'bar'});
551
552 # Longer version
553 say $app->build_controller->helpers->dumper({foo => 'bar'});
554
556 The Mojolicious distribution includes a few files with different
557 licenses that have been bundled for internal use.
558
559 Mojolicious Artwork
560 Copyright (C) 2010-2023, Sebastian Riedel.
561
562 Licensed under the CC-SA License, Version 4.0
563 <http://creativecommons.org/licenses/by-sa/4.0>.
564
565 jQuery
566 Copyright (C) jQuery Foundation.
567
568 Licensed under the MIT License,
569 <http://creativecommons.org/licenses/MIT>.
570
571 highlight.js
572 Copyright (C) 2006, Ivan Sagalaev.
573
574 Licensed under the BSD License,
575 <https://github.com/highlightjs/highlight.js/blob/master/LICENSE>.
576
577 Bootstrap
578 Copyright 2011-2020 The Bootstrap Authors.
579 Copyright 2011-2020 Twitter, Inc.
580
581 Licensed under the MIT License,
582 <http://creativecommons.org/licenses/MIT>.
583
584 Font Awesome
585 Licensed under the CC-BY License, Version 4.0
586 <https://creativecommons.org/licenses/by/4.0/> and SIL OFL, Version 1.1
587 <https://opensource.org/licenses/OFL-1.1>.
588
590 Every major release of Mojolicious has a code name, these are the ones
591 that have been used in the past.
592
593 9.0, "Waffle" (U+1F9C7)
594
595 8.0, "Supervillain" (U+1F9B9)
596
597 7.0, "Doughnut" (U+1F369)
598
599 6.0, "Clinking Beer Mugs" (U+1F37B)
600
601 5.0, "Tiger Face" (U+1F42F)
602
603 4.0, "Top Hat" (U+1F3A9)
604
605 3.0, "Rainbow" (U+1F308)
606
607 2.0, "Leaf Fluttering In Wind" (U+1F343)
608
609 1.0, "Snowflake" (U+2744)
610
612 • Stix <https://stix.no> sponsored the creation of the Mojolicious logo
613 (designed by Nicolai Graesdal) and transferred its copyright to
614 Sebastian Riedel.
615
616 • Some of the work on this distribution has been sponsored by The Perl
617 Foundation <https://www.perlfoundation.org>.
618
620 Mojolicious is an open source project that relies on the tireless
621 support of its contributors.
622
623 Project Founder
624 Sebastian Riedel, "kraih@mojolicious.org"
625
626 Core Developers
627 Current voting members of the core team in alphabetical order:
628
629 CandyAngel, "candyangel@mojolicious.org"
630
631 Christopher Rasch-Olsen Raa, "christopher@mojolicious.org"
632
633 Dan Book, "grinnz@mojolicious.org"
634
635 Jan Henning Thorsen, "batman@mojolicious.org"
636
637 Joel Berger, "jberger@mojolicious.org"
638
639 Marcus Ramberg, "marcus@mojolicious.org"
640
641 The following members of the core team are currently on hiatus:
642
643 Abhijit Menon-Sen, "ams@cpan.org"
644
645 Glen Hinkle, "tempire@cpan.org"
646
647 Contributors
648 In alphabetical order:
649
650 Adam Kennedy
651
652 Adriano Ferreira
653
654 Al Newkirk
655
656 Alex Efros
657
658 Alex Salimon
659
660 Alexander Karelas
661
662 Alexey Likhatskiy
663
664 Anatoly Sharifulin
665
666 Andre Parker
667
668 Andre Vieth
669
670 Andreas Guldstrand
671
672 Andreas Jaekel
673
674 Andreas Koenig
675
676 Andrew Fresh
677
678 Andrew Nugged
679
680 Andrey Khozov
681
682 Andrey Kuzmin
683
684 Andy Grundman
685
686 Andy Lester
687
688 Aristotle Pagaltzis
689
690 Ashley Dev
691
692 Ask Bjoern Hansen
693
694 Audrey Tang
695
696 Ben Tyler
697
698 Ben van Staveren
699
700 Benjamin Erhart
701
702 Bernhard Graf
703
704 Breno G. de Oliveira
705
706 Brian Duggan
707
708 Brian Medley
709
710 Burak Gursoy
711
712 Ch Lamprecht
713
714 Charlie Brady
715
716 Chas. J. Owens IV
717
718 Chase Whitener
719
720 Chris Scheller
721
722 Christian Hansen
723
724 chromatic
725
726 Curt Tilmes
727
728 Daniel Kimsey
729
730 Daniel Mantovani
731
732 Danijel Tasov
733
734 Dagfinn Ilmari Manns�ker
735
736 Danny Thomas
737
738 David Davis
739
740 David Webb
741
742 Diego Kuperman
743
744 Dmitriy Shalashov
745
746 Dmitry Konstantinov
747
748 Dominik Jarmulowicz
749
750 Dominique Dumont
751
752 Dotan Dimet
753
754 Douglas Christopher Wilson
755
756 Elmar S. Heeb
757
758 Ettore Di Giacinto
759
760 Eugen Konkov
761
762 Eugene Toropov
763
764 Flavio Poletti
765
766 Gisle Aas
767
768 Graham Barr
769
770 Graham Knop
771
772 Heiko Jansen
773
774 Henry Tang
775
776 Hideki Yamamura
777
778 Hiroki Toyokawa
779
780 Ian Goodacre
781
782 Ilya Chesnokov
783
784 Ilya Rassadin
785
786 James Duncan
787
788 Jan Jona Javorsek
789
790 Jan Schmidt
791
792 Jaroslav Muhin
793
794 Jesse Vincent
795
796 Johannes Plunien
797
798 John Kingsley
799
800 Jonathan Yu
801
802 Josh Leder
803
804 Kamen Naydenov
805
806 Karen Etheridge
807
808 Kazuhiro Shibuya
809
810 Kevin Old
811
812 Kitamura Akatsuki
813
814 Klaus S. Madsen
815
816 Knut Arne Bjorndal
817
818 Lars Balker Rasmussen
819
820 Lee Johnson
821
822 Leon Brocard
823
824 Lukas Mai
825
826 Magnus Holm
827
828 Maik Fischer
829
830 Mark Fowler
831
832 Mark Grimes
833
834 Mark Stosberg
835
836 Martin McGrath
837
838 Marty Tennison
839
840 Matt S Trout
841
842 Matthew Lineen
843
844 Maksym Komar
845
846 Maxim Vuets
847
848 Michael Gregorowicz
849
850 Michael Harris
851
852 Michael Jemmeson
853
854 Mike Magowan
855
856 Mirko Westermeier
857
858 Mons Anderson
859
860 Moritz Lenz
861
862 Neil Watkiss
863
864 Nic Sandfield
865
866 Nils Diewald
867
868 Oleg Zhelo
869
870 Olivier Mengue
871
872 Pascal Gaudette
873
874 Paul Evans
875
876 Paul Robins
877
878 Paul Tomlin
879
880 Pavel Shaydo
881
882 Pedro Melo
883
884 Peter Edwards
885
886 Pierre-Yves Ritschard
887
888 Piotr Roszatycki
889
890 Quentin Carbonneaux
891
892 Rafal Pocztarski
893
894 Randal Schwartz
895
896 Rawley Fowler
897
898 Richard Elberger
899
900 Rick Delaney
901
902 Robert Hicks
903
904 Robert Rothenberg
905
906 Robin Lee
907
908 Roland Lammel
909
910 Roy Storey
911
912 Ryan Jendoubi
913
914 Salvador Fandino
915
916 Santiago Zarate
917
918 Sascha Kiefer
919
920 Scott Wiersdorf
921
922 Sebastian Paaske Torholm
923
924 Sergey Zasenko
925
926 Simon Bertrang
927
928 Simone Tampieri
929
930 Shoichi Kaji
931
932 Shu Cho
933
934 Skye Shaw
935
936 Stanis Trendelenburg
937
938 Stefan Adams
939
940 Steffen Ullrich
941
942 Stephan Kulow
943
944 Stephane Este-Gracias
945
946 Stevan Little
947
948 Steve Atkins
949
950 Tatsuhiko Miyagawa
951
952 Terrence Brannon
953
954 Tianon Gravi
955
956 Tomas Znamenacek
957
958 Tudor Constantin
959
960 Ulrich Habel
961
962 Ulrich Kautz
963
964 Uwe Voelker
965
966 Veesh Goldman
967
968 Viacheslav Tykhanovskyi
969
970 Victor Engmark
971
972 Viliam Pucik
973
974 Wes Cravens
975
976 William Lindley
977
978 Yaroslav Korshak
979
980 Yuki Kimoto
981
982 Zak B. Elep
983
984 Zoffix Znet
985
987 Copyright (C) 2008-2023, Sebastian Riedel and others.
988
989 This program is free software, you can redistribute it and/or modify it
990 under the terms of the Artistic License version 2.0.
991
993 <https://github.com/mojolicious/mojo>, Mojolicious::Guides,
994 <https://mojolicious.org>.
995
996
997
998perl v5.38.0 2023-09-11 Mojolicious(3)