File Coverage

blib/lib/Dancer2.pm
Criterion Covered Total %
statement 77 77 100.0
branch 13 14 92.8
condition 9 13 69.2
subroutine 20 20 100.0
pod 0 3 0.0
total 119 127 93.7


line stmt bran cond sub pod time code
1             package Dancer2;
2             $Dancer2::VERSION = '1.0.0';
3             # ABSTRACT: Lightweight yet powerful web application framework
4              
5 143     143   10734338 use 5.12.0;
  143         1204  
6 143     143   855 use strict;
  143         322  
  143         3194  
7 143     143   709 use warnings;
  143         291  
  143         4378  
8 143     143   2574 use List::Util 'first';
  143         353  
  143         17189  
9 143     143   63107 use Module::Runtime 'use_module';
  143         216488  
  143         942  
10 143     143   70501 use Import::Into;
  143         68989  
  143         4902  
11 143     143   49590 use Dancer2::Core;
  143         373  
  143         4108  
12 143     143   88524 use Dancer2::Core::App;
  143         619  
  143         6475  
13 143     143   72803 use Dancer2::Core::Runner;
  143         690  
  143         5391  
14 143     143   1122 use Dancer2::FileUtils;
  143         380  
  143         88063  
15              
16             our $AUTHORITY = 'SUKRIA';
17              
18 857 50   857 0 40366 sub VERSION { shift->SUPER::VERSION(@_) || '0.000000_000' }
19              
20             our $runner;
21              
22 3437     3437 0 110633 sub runner {$runner}
23 30     30 0 30502 sub psgi_app { shift->runner->psgi_app(@_) }
24              
25             sub import {
26 214     214   55006 my ($class, @args) = @_;
27 214         906 my ($caller, $script) = caller;
28              
29 214         582 my @final_args;
30             my $clean_import;
31 214         680 foreach my $arg (@args) {
32              
33             # ignore, no longer necessary
34             # in the future these will warn as deprecated
35 39 100       193 grep +($arg eq $_), qw<:script :syntax :tests>
36             and next;
37              
38 36 100       155 if ($arg eq ':nopragmas') {
39 1         1 $clean_import++;
40 1         3 next;
41             }
42              
43 35 100       130 if (substr($arg, 0, 1) eq '!') {
44 9         37 push @final_args, $arg, 1;
45             }
46             else {
47 26         64 push @final_args, $arg;
48             }
49             }
50              
51             $clean_import
52             or $_->import::into($caller)
53 214   66     2526 for qw<strict warnings utf8>;
54              
55 214 100       208652 scalar @final_args % 2
56             and die q{parameters must be key/value pairs or '!keyword'};
57              
58 212         705 my %final_args = @final_args;
59              
60 212         584 my $appname = delete $final_args{appname};
61 212   66     1616 $appname ||= $caller;
62              
63             # never instantiated the runner, should do it now
64 212 100       808 if (not defined $runner) {
65 137         1045 $runner = Dancer2::Core::Runner->new();
66             }
67              
68             # Search through registered apps, creating a new app object
69             # if we do not find one with the same name.
70 212         555 my $app;
71 212     189   1041 ($app) = first { $_->name eq $appname } @{$runner->apps};
  189         551  
  212         1814  
72              
73 212 100       1227 if (!$app) {
74              
75             # populating with the server's postponed hooks in advance
76             $app = Dancer2::Core::App->new(
77             name => $appname,
78             caller => $script,
79             environment => $runner->environment,
80 201   50     4343 postponed_hooks => $runner->postponed_hooks->{$appname} || {},
81             );
82              
83             # register the app within the runner instance
84 200         4242 $runner->register_application($app);
85             }
86              
87 211         1203 _set_import_method_to_caller($caller);
88              
89             # use config dsl class, must extend Dancer2::Core::DSL
90 211   100     1353 my $config_dsl = $app->setting('dsl_class') || 'Dancer2::Core::DSL';
91 211   66     7727 $final_args{dsl} ||= $config_dsl;
92              
93             # load the DSL, defaulting to Dancer2::Core::DSL
94 211         954 my $dsl = use_module($final_args{dsl})->new(app => $app);
95 211         2795 $dsl->export_symbols_to($caller, \%final_args);
96             }
97              
98             sub _set_import_method_to_caller {
99 211     211   672 my ($caller) = @_;
100              
101             my $import = sub {
102 11     11   1351 my ($self, %options) = @_;
        8      
103              
104 11         40 my $with = $options{with};
105 11         4706 for my $key (keys %$with) {
106 5         28 $self->dancer_app->setting($key => $with->{$key});
107             }
108 211         1395 };
109              
110             {
111             ## no critic
112 143     143   1328 no strict 'refs';
  143         485  
  143         6673  
  211         499  
113 143     143   1122 no warnings 'redefine';
  143         492  
  143         13857  
114 211         425 *{"${caller}::import"} = $import;
  211         1755  
115             }
116             }
117              
118             1;
119              
120             __END__
121              
122             =pod
123              
124             =encoding UTF-8
125              
126             =head1 NAME
127              
128             Dancer2 - Lightweight yet powerful web application framework
129              
130             =head1 VERSION
131              
132             version 1.0.0
133              
134             =head1 DESCRIPTION
135              
136             Dancer2 is the new generation of L<Dancer>, the lightweight web-framework for
137             Perl. Dancer2 is a complete rewrite based on L<Moo>.
138              
139             Dancer2 can optionally use XS modules for speed, but at its core remains
140             fatpackable (packable by L<App::FatPacker>) so you could easily deploy Dancer2
141             applications on hosts that do not support custom CPAN modules.
142              
143             Dancer2 is easy and fun:
144              
145             use Dancer2;
146             get '/' => sub { "Hello World" };
147             dance;
148              
149             This is the main module for the Dancer2 distribution. It contains logic for
150             creating a new Dancer2 application.
151              
152             =head2 Documentation Index
153              
154             Documentation on Dancer2 is split into several sections. Below is a
155             complete outline on where to go for help.
156              
157             =over 4
158              
159             =item * Dancer2 Tutorial
160              
161             If you are new to the Dancer approach, you should start by reading
162             our L<Dancer2::Tutorial>.
163              
164             =item * Dancer2 Manual
165              
166             L<Dancer2::Manual> is the reference for Dancer2. Here you will find
167             information on the concepts of Dancer2 application development and
168             a comprehensive reference to the Dancer2 domain specific
169             language.
170              
171             =item * Dancer2 Keywords
172              
173             The keywords for Dancer2 can be found under L<DSL Keywords|Dancer2::Manual/DSL KEYWORDS>.
174              
175             =item * Dancer2 Deployment
176              
177             For configuration examples of different deployment solutions involving
178             Dancer2 and Plack, refer to L<Dancer2::Manual::Deployment>.
179              
180             =item * Dancer2 Cookbook
181              
182             Specific examples of code for real-life problems and some 'tricks' for
183             applications in Dancer can be found in L<Dancer2::Cookbook>
184              
185             =item * Dancer2 Config
186              
187             For configuration file details refer to L<Dancer2::Config>. It is a
188             complete list of all configuration options.
189              
190             =item * Dancer2 Plugins
191              
192             Refer to L<Dancer2::Plugins> for a partial list of available Dancer2
193             plugins. Note that although we try to keep this list up to date we
194             expect plugin authors to tell us about new modules.
195              
196             For information on how to author a plugin, see L<Dancer2::Plugin/Writing the plugin>.
197              
198             =item * Dancer2 Migration guide
199              
200             L<Dancer2::Manual::Migration> provides the most up-to-date instruction on
201             how to convert a Dancer (1) based application to Dancer2.
202              
203             =back
204              
205             =head3 Other Documentation
206              
207             =over
208              
209             =item * Core and Community Policy, and Standards of Conduct
210              
211             The L<Dancer core and community policy, and standards of conduct|Dancer2::Policy> defines
212             what constitutes acceptable behavior in our community, what behavior is considered
213             abusive and unacceptable, and what steps will be taken to remediate inappropriate
214             and abusive behavior. By participating in any public forum for Dancer or its
215             community, you are agreeing to the terms of this policy.
216              
217             =item * GitHub Wiki
218              
219             Our L<GitHub wiki|https://github.com/PerlDancer/Dancer2/wiki> has community-contributed
220             documentation, as well as other information that doesn't quite fit within
221             this manual.
222              
223             =item * Contributing
224              
225             The L<contribution guidelines|https://github.com/PerlDancer/Dancer2/blob/master/Contributing.md> describe
226             how to set up your development environment to contribute to the development of Dancer2,
227             Dancer2's Git workflow, submission guidelines, and various coding standards.
228              
229             =item * Deprecation Policy
230              
231             The L<deprecation policy|Dancer2::DeprecationPolicy> defines the process for removing old,
232             broken, unused, or outdated code from the Dancer2 codebase. This policy is critical
233             for guiding and shaping future development of Dancer2.
234              
235             =back
236              
237             =head1 SECURITY REPORTS
238              
239             If you need to report a security vulnerability in Dancer2, send all pertinent
240             information to L<dancer-security@dancer.pm|mailto:dancer-security@dancer.pm>. These matters are taken
241             extremely seriously, and will be addressed in the earliest timeframe possible.
242              
243             =head1 SUPPORT
244              
245             You are welcome to join our mailing list.
246             For subscription information, mail address and archives see
247             L<http://lists.preshweb.co.uk/mailman/listinfo/dancer-users>.
248              
249             We are also on IRC: #dancer on irc.perl.org.
250              
251             =head1 AUTHORS
252              
253             =head2 CORE DEVELOPERS
254              
255             Alberto Simões
256             Alexis Sukrieh
257             D Ruth Holloway (GeekRuthie)
258             Damien Krotkine
259             David Precious
260             Franck Cuny
261             Jason A. Crome
262             Mickey Nasriachi
263             Peter Mottram (SysPete)
264             Russell Jenkins
265             Sawyer X
266             Stefan Hornburg (Racke)
267             Yanick Champoux
268              
269             =head2 CORE DEVELOPERS EMERITUS
270              
271             David Golden
272             Steven Humphrey
273              
274             =head2 CONTRIBUTORS
275              
276             A. Sinan Unur
277             Abdullah Diab
278             Achyut Kumar Panda
279             Ahmad M. Zawawi
280             Alex Beamish
281             Alexander Karelas
282             Alexander Pankoff
283             Alexandr Ciornii
284             Andrew Beverley
285             Andrew Grangaard
286             Andrew Inishev
287             Andrew Solomon
288             Andy Jack
289             Ashvini V
290             B10m
291             Bas Bloemsaat
292             baynes
293             Ben Hutton
294             Ben Kaufman
295             biafra
296             Blabos de Blebe
297             Breno G. de Oliveira
298             cdmalon
299             Celogeek
300             Cesare Gargano
301             Charlie Gonzalez
302             chenchen000
303             Chi Trinh
304             Christian Walde
305             Christopher White
306             cloveistaken
307             Colin Kuskie
308             cym0n
309             Dale Gallagher
310             Dan Book (Grinnz)
311             Daniel Böhmer
312             Daniel Muey
313             Daniel Perrett
314             Dave Jacoby
315             Dave Webb
316             David (sbts)
317             David Steinbrunner
318             David Zurborg
319             Davs
320             Deirdre Moran
321             Dennis Lichtenthäler
322             Dinis Rebolo
323             dtcyganov
324             Elliot Holden
325             Emil Perhinschi
326             Erik Smit
327             Fayland Lam
328             ferki
329             Gabor Szabo
330             GeekRuthie
331             geistteufel
332             Gideon D'souza
333             Gil Magno
334             Glenn Fowler
335             Graham Knop
336             Gregor Herrmann
337             Grzegorz Rożniecki
338             Hobbestigrou
339             Hunter McMillen
340             ice-lenor
341             Ivan Bessarabov
342             Ivan Kruglov
343             JaHIY
344             Jakob Voss
345             James Aitken
346             James Raspass
347             James McCoy
348             Jason Lewis
349             Javier Rojas
350             Jean Stebens
351             Jens Rehsack
352             Joel Berger
353             Johannes Piehler
354             Jonathan Cast
355             Jonathan Scott Duff
356             Joseph Frazer
357             Julien Fiegehenn (simbabque)
358             Julio Fraire
359             Kaitlyn Parkhurst (SYMKAT)
360             kbeyazli
361             Keith Broughton
362             lbeesley
363             Lennart Hengstmengel
364             Ludovic Tolhurst-Cleaver
365             Mario Zieschang
366             Mark A. Stratman
367             Marketa Wachtlova
368             Masaaki Saito
369             Mateu X Hunter
370             Matt Phillips
371             Matt S Trout
372             mauke
373             Maurice
374             MaxPerl
375             Ma_Sys.ma
376             Menno Blom
377             Michael Kröll
378             Michał Wojciechowski
379             Mike Katasonov
380             Mohammad S Anwar
381             mokko
382             Nick Patch
383             Nick Tonkin
384             Nigel Gregoire
385             Nikita K
386             Nuno Carvalho
387             Olaf Alders
388             Olivier Mengué
389             Omar M. Othman
390             pants
391             Patrick Zimmermann
392             Pau Amma
393             Paul Clements
394             Paul Cochrane
395             Paul Williams
396             Pedro Bruno
397             Pedro Melo
398             Philippe Bricout
399             Ricardo Signes
400             Rick Yakubowski
401             Ruben Amortegui
402             Sakshee Vijay (sakshee3)
403             Sam Kington
404             Samit Badle
405             Sebastien Deseille (sdeseille)
406             Sergiy Borodych
407             Shlomi Fish
408             Slava Goltser
409             Snigdha
410             Steve Bertrand
411             Steve Dondley
412             Steven Humphrey
413             Tatsuhiko Miyagawa
414             Timothy Alexis Vass
415             Tina Müller
416             Tom Hukins
417             Upasana Shukla
418             Utkarsh Gupta
419             Vernon Lyon
420             Victor Adam
421             Vince Willems
422             Vincent Bachelier
423             xenu
424             Yves Orton
425              
426             =head1 AUTHOR
427              
428             Dancer Core Developers
429              
430             =head1 COPYRIGHT AND LICENSE
431              
432             This software is copyright (c) 2023 by Alexis Sukrieh.
433              
434             This is free software; you can redistribute it and/or modify it under
435             the same terms as the Perl 5 programming language system itself.
436              
437             =cut