<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<!--
This file was generated by Devel::Cover Version 1.26
Devel::Cover is copyright 2001-2012, Paul Johnson (paul@pjcj.net)
Devel::Cover is free. It is licensed under the same terms as Perl itself.
The latest version of Devel::Cover should be available from my homepage:
http://www.pjcj.net
-->
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"></meta>
<meta http-equiv="Content-Language" content="en-us"></meta>
<link rel="stylesheet" type="text/css" href="cover.css"></link>
<link rel="stylesheet" type="text/css" href="cover.css"></link>
<title>File Coverage: lib/Yukki/Web.pm</title>
</head>
<body>
<h1>File Coverage</h1>
<table>
<tr><td class="h" align="right">File:</td><td align="left">lib/Yukki/Web.pm</td></tr>
<tr><td class="h" align="right">Coverage:</td><td align="left" class="c1">81.3%</td></tr>
</table>
<div><br/></div>
<table>
<tr><th>line</th><th>stmt</th><th>bran</th><th>cond</th><th>sub</th><th>pod</th><th>time</th><th>code</th></tr>
<tr><td class="h">1</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">package Yukki::Web;</td></tr>
<tr><td class="h">2</td><td colspan="7"></td></tr><tr><td class="h">3</td><td><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L3">1</a></div></td><td></td><td><div>7</div><div>2</div></td><td class="s">use v5.24;</td></tr>
<tr><td class="h">4</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L4">1</a></div></td><td></td><td><div>3</div><div>1</div><div>4</div></td><td class="s">use utf8;</td></tr>
<tr><td class="h">5</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L5">1</a></div></td><td></td><td><div>217</div><div>2891</div><div>2</div></td><td class="s">use Moo;</td></tr>
<tr><td class="h">6</td><td colspan="7"></td></tr><tr><td class="h">7</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">extends qw( Yukki );</td></tr>
<tr><td class="h">8</td><td colspan="7"></td></tr><tr><td class="h">9</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L9">1</a></div></td><td></td><td><div>789</div><div>1349</div><div>26</div></td><td class="s">use Class::Load;</td></tr>
<tr><td class="h">10</td><td colspan="7"></td></tr><tr><td class="h">11</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L11">1</a></div></td><td></td><td><div>176</div><div>2</div><div>3</div></td><td class="s">use Yukki::Error qw( http_throw http_exception );</td></tr>
<tr><td class="h">12</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L12">1</a></div></td><td></td><td><div>373</div><div>3</div><div>5</div></td><td class="s">use Yukki::Types qw( PluginList YukkiWebSettings );</td></tr>
<tr><td class="h">13</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L13">1</a></div></td><td></td><td><div>610</div><div>3</div><div>17</div></td><td class="s">use Yukki::Web::Context;</td></tr>
<tr><td class="h">14</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L14">1</a></div></td><td></td><td><div>182</div><div>4</div><div>16</div></td><td class="s">use Yukki::Web::Router;</td></tr>
<tr><td class="h">15</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L15">1</a></div></td><td></td><td><div>184</div><div>2</div><div>17</div></td><td class="s">use Yukki::Web::Settings;</td></tr>
<tr><td class="h">16</td><td colspan="7"></td></tr><tr><td class="h">17</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L17">1</a></div></td><td></td><td><div>2937</div><div>11730</div><div>19</div></td><td class="s">use CHI;</td></tr>
<tr><td class="h">18</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L18">1</a></div></td><td></td><td><div>190</div><div>9001</div><div>33</div></td><td class="s">use LWP::MediaTypes qw( add_type );</td></tr>
<tr><td class="h">19</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L19">1</a></div></td><td></td><td><div>156</div><div>474</div><div>14</div></td><td class="s">use Plack::Session::Store::Cache;</td></tr>
<tr><td class="h">20</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L20">1</a></div></td><td></td><td><div>3</div><div>1</div><div>24</div></td><td class="s">use Scalar::Util qw( blessed weaken );</td></tr>
<tr><td class="h">21</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L21">1</a></div></td><td></td><td><div>3</div><div>1</div><div>22</div></td><td class="s">use Try::Tiny;</td></tr>
<tr><td class="h">22</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L22">1</a></div></td><td></td><td><div>3</div><div>1</div><div>6</div></td><td class="s">use Type::Utils;</td></tr>
<tr><td class="h">23</td><td colspan="7"></td></tr><tr><td class="h">24</td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L24">1</a></div></td><td></td><td><div>904</div><div>1</div><div>5</div></td><td class="s">use namespace::clean;</td></tr>
<tr><td class="h">25</td><td colspan="7"></td></tr><tr><td class="h">26</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"># ABSTRACT: the Yukki web server</td></tr>
<tr><td class="h">27</td><td colspan="7"></td></tr><tr><td class="h">28 - 35</td><td colspan="6"></td><td class="s"><pre>=head1 DESCRIPTION
This class handles the work of dispatching incoming requests to the various
controllers.
=head1 ATTRIBUTES
=cut</pre></td></tr>
<tr><td class="h">36</td><td colspan="7"></td></tr><tr><td class="h">37</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">has '+settings' => (</td></tr>
<tr><td class="h">38</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> isa => YukkiWebSettings,</td></tr>
<tr><td class="h">39</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> coerce => 1,</td></tr>
<tr><td class="h">40</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">41</td><td colspan="7"></td></tr><tr><td class="h">42 - 47</td><td colspan="6"></td><td class="s"><pre>=head2 router
This is the L<Path::Router> that will determine where incoming requests are
sent. It is automatically set to a L<Yukki::Web::Router> instance.
=cut</pre></td></tr>
<tr><td class="h">48</td><td colspan="7"></td></tr><tr><td class="h">49</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">has router => (</td></tr>
<tr><td class="h">50</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> is => 'ro',</td></tr>
<tr><td class="h">51</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> isa => class_type('Path::Router'),</td></tr>
<tr><td class="h">52</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> required => 1,</td></tr>
<tr><td class="h">53</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> lazy => 1,</td></tr>
<tr><td class="h">54</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> builder => '_build_router',</td></tr>
<tr><td class="h">55</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">56</td><td colspan="7"></td></tr><tr><td class="h">57</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub _build_router {</td></tr>
<tr><td class="h">58</td><td><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L58">1</a></div></td><td></td><td><div>9</div></td><td class="s"> my $self = shift;</td></tr>
<tr><td class="h">59</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>6</div></td><td class="s"> Yukki::Web::Router->new( app => $self );</td></tr>
<tr><td class="h">60</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">61</td><td colspan="7"></td></tr><tr><td class="h">62 - 70</td><td colspan="6"></td><td class="s"><pre>=head2 plugins
my @plugins = $app->all_plugins;
my @format_helpers = $app->format_helper_plugins;
my @formatters = $app->format_plugins;
This attribute stores all the loaded plugins.
=cut</pre></td></tr>
<tr><td class="h">71</td><td colspan="7"></td></tr><tr><td class="h">72</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">has plugins => (</td></tr>
<tr><td class="h">73</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> is => 'ro',</td></tr>
<tr><td class="h">74</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> isa => PluginList,</td></tr>
<tr><td class="h">75</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> required => 1,</td></tr>
<tr><td class="h">76</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> lazy => 1,</td></tr>
<tr><td class="h">77</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> builder => '_build_plugins',</td></tr>
<tr><td class="h">78</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">79</td><td colspan="7"></td></tr><tr><td class="h">80</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub all_plugins {</td></tr>
<tr><td class="h">81</td><td><div class="c0">0</div></td><td></td><td></td><td><div class="c0"><a href="lib-Yukki-Web-pm--subroutine.html#L81">0</a></div></td><td><div class="c3">1</div></td><td><div>0</div></td><td class="s"> my $self = shift;</td></tr>
<tr><td class="h">82</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s"> $self->plugins->@*;</td></tr>
<tr><td class="h">83</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">84</td><td colspan="7"></td></tr><tr><td class="h">85</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub format_helper_plugins {</td></tr>
<tr><td class="h">86</td><td><div class="c0">0</div></td><td></td><td></td><td><div class="c0"><a href="lib-Yukki-Web-pm--subroutine.html#L86">0</a></div></td><td><div class="c3">1</div></td><td><div>0</div></td><td class="s"> my $self = shift;</td></tr>
<tr><td class="h">87</td><td><div class="c0">0</div><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div><div>0</div></td><td class="s"> grep { $_->does('Yukki::Web::Plugin::Role::FormatHelper') }</td></tr>
<tr><td class="h">88</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> $self->plugins->@*;</td></tr>
<tr><td class="h">89</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">90</td><td colspan="7"></td></tr><tr><td class="h">91</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub formatter_plugins {</td></tr>
<tr><td class="h">92</td><td><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L92">1</a></div></td><td><div class="c3">1</div></td><td><div>5</div></td><td class="s"> my $self = shift;</td></tr>
<tr><td class="h">93</td><td><div class="c3">1</div><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>22</div><div>269</div></td><td class="s"> grep { $_->does('Yukki::Web::Plugin::Role::Formatter') }</td></tr>
<tr><td class="h">94</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> $self->plugins->@*;</td></tr>
<tr><td class="h">95</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">96</td><td colspan="7"></td></tr><tr><td class="h">97</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub _build_plugins {</td></tr>
<tr><td class="h">98</td><td><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L98">1</a></div></td><td></td><td><div>11</div></td><td class="s"> my $self = shift;</td></tr>
<tr><td class="h">99</td><td colspan="7"></td></tr><tr><td class="h">100</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>3</div></td><td class="s"> my @plugins;</td></tr>
<tr><td class="h">101</td><td><div class="c3">1</div><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>2</div><div>21</div></td><td class="s"> for my $plugin_settings (@{ $self->settings->plugins }) {</td></tr>
<tr><td class="h">102</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>68</div></td><td class="s"> my $module = $plugin_settings->{module};</td></tr>
<tr><td class="h">103</td><td colspan="7"></td></tr><tr><td class="h">104</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>6</div></td><td class="s"> my $class = $module;</td></tr>
<tr><td class="h">105</td><td><div class="c3">3</div></td><td><div class="c0" title="T/-"><a href="lib-Yukki-Web-pm--branch.html#L105">50</a></div></td><td></td><td></td><td></td><td><div>14</div></td><td class="s"> $class = "Yukki::Web::Plugin::$class" unless $class =~ s/^\+//;</td></tr>
<tr><td class="h">106</td><td colspan="7"></td></tr><tr><td class="h">107</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>17</div></td><td class="s"> Class::Load::load_class($class);</td></tr>
<tr><td class="h">108</td><td colspan="7"></td></tr><tr><td class="h">109</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>88</div></td><td class="s"> push @plugins, $class->new(%$plugin_settings, app => $self);</td></tr>
<tr><td class="h">110</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> }</td></tr>
<tr><td class="h">111</td><td colspan="7"></td></tr><tr><td class="h">112</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>36</div></td><td class="s"> return \@plugins;</td></tr>
<tr><td class="h">113</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">114</td><td colspan="7"></td></tr><tr><td class="h">115 - 117</td><td colspan="6"></td><td class="s"><pre>=head1 METHODS
=cut</pre></td></tr>
<tr><td class="h">118</td><td colspan="7"></td></tr><tr><td class="h">119</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub BUILD {</td></tr>
<tr><td class="h">120</td><td><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L120">1</a></div></td><td><div class="c0">0</div></td><td><div>5889</div></td><td class="s"> my $self = shift;</td></tr>
<tr><td class="h">121</td><td colspan="7"></td></tr><tr><td class="h">122</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>29</div></td><td class="s"> my $types = $self->settings->media_types;</td></tr>
<tr><td class="h">123</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>1700</div></td><td class="s"> while (my ($mime_type, $ext) = each %$types) {</td></tr>
<tr><td class="h">124</td><td><div class="c3">1</div></td><td><div class="c0" title="-/F"><a href="lib-Yukki-Web-pm--branch.html#L124">50</a></div></td><td></td><td></td><td></td><td><div>3</div></td><td class="s"> my @ext = ref $ext ? @$ext : ($ext);</td></tr>
<tr><td class="h">125</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>4</div></td><td class="s"> add_type($mime_type, @ext);</td></tr>
<tr><td class="h">126</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> }</td></tr>
<tr><td class="h">127</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">};</td></tr>
<tr><td class="h">128</td><td colspan="7"></td></tr><tr><td class="h">129 - 133</td><td colspan="6"></td><td class="s"><pre>=head2 component
Helper method used by L</controller> and L</view>.
=cut</pre></td></tr>
<tr><td class="h">134</td><td colspan="7"></td></tr><tr><td class="h">135</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub component {</td></tr>
<tr><td class="h">136</td><td><div class="c3">9</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L136">9</a></div></td><td><div class="c3">1</div></td><td><div>20</div></td><td class="s"> my ($self, $type, $name) = @_;</td></tr>
<tr><td class="h">137</td><td><div class="c3">9</div></td><td></td><td></td><td></td><td></td><td><div>30</div></td><td class="s"> my $class_name = join '::', 'Yukki::Web', $type, $name;</td></tr>
<tr><td class="h">138</td><td><div class="c3">9</div></td><td></td><td></td><td></td><td></td><td><div>29</div></td><td class="s"> Class::Load::load_class($class_name);</td></tr>
<tr><td class="h">139</td><td><div class="c3">9</div></td><td></td><td></td><td></td><td></td><td><div>278</div></td><td class="s"> return $class_name->new(app => $self);</td></tr>
<tr><td class="h">140</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">141</td><td colspan="7"></td></tr><tr><td class="h">142 - 148</td><td colspan="6"></td><td class="s"><pre>=head2 controller
my $controller = $app->controller($name);
Returns an instance of the named L<Yukki::Web::Controller>.
=cut</pre></td></tr>
<tr><td class="h">149</td><td colspan="7"></td></tr><tr><td class="h">150</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub controller {</td></tr>
<tr><td class="h">151</td><td><div class="c3">8</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L151">8</a></div></td><td><div class="c3">1</div></td><td><div>753</div></td><td class="s"> my ($self, $name) = @_;</td></tr>
<tr><td class="h">152</td><td><div class="c3">8</div></td><td></td><td></td><td></td><td></td><td><div>24</div></td><td class="s"> return $self->component(Controller => $name);</td></tr>
<tr><td class="h">153</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">154</td><td colspan="7"></td></tr><tr><td class="h">155 - 161</td><td colspan="6"></td><td class="s"><pre>=head2 view
my $view = $app->view($name);
Returns an instance of the named L<Yukki::Web::View>.
=cut</pre></td></tr>
<tr><td class="h">162</td><td colspan="7"></td></tr><tr><td class="h">163</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub view {</td></tr>
<tr><td class="h">164</td><td><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L164">1</a></div></td><td><div class="c3">1</div></td><td><div>442</div></td><td class="s"> my ($self, $name) = @_;</td></tr>
<tr><td class="h">165</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>10</div></td><td class="s"> return $self->component(View => $name);</td></tr>
<tr><td class="h">166</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">167</td><td colspan="7"></td></tr><tr><td class="h">168 - 176</td><td colspan="6"></td><td class="s"><pre>=head2 dispatch
my $response = $app->dispatch($env);
This is a PSGI application in a method call. Given a L<PSGI> environment, maps
that to the appropriate controller and fires it. Whether successful or failure,
it returns a PSGI response.
=cut</pre></td></tr>
<tr><td class="h">177</td><td colspan="7"></td></tr><tr><td class="h">178</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub dispatch {</td></tr>
<tr><td class="h">179</td><td><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L179">3</a></div></td><td><div class="c3">1</div></td><td><div>5</div></td><td class="s"> my ($self, $env) = @_;</td></tr>
<tr><td class="h">180</td><td colspan="7"></td></tr><tr><td class="h">181</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>66</div></td><td class="s"> my $ctx = Yukki::Web::Context->new(env => $env);</td></tr>
<tr><td class="h">182</td><td colspan="7"></td></tr><tr><td class="h">183</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>64</div></td><td class="s"> $env->{'yukki.app'} = $self;</td></tr>
<tr><td class="h">184</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>45</div></td><td class="s"> $env->{'yukki.settings'} = $self->settings;</td></tr>
<tr><td class="h">185</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>22</div></td><td class="s"> $env->{'yukki.ctx'} = $ctx;</td></tr>
<tr><td class="h">186</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>11</div></td><td class="s"> weaken $env->{'yukki.ctx'};</td></tr>
<tr><td class="h">187</td><td colspan="7"></td></tr><tr><td class="h">188</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>6</div></td><td class="s"> my $response;</td></tr>
<tr><td class="h">189</td><td colspan="7"></td></tr><tr><td class="h">190</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> try {</td></tr>
<tr><td class="h">191</td><td><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L191">3</a></div></td><td></td><td><div>142</div></td><td class="s"> my $match = $self->router->match($ctx->request->path);</td></tr>
<tr><td class="h">192</td><td colspan="7"></td></tr><tr><td class="h">193</td><td><div class="c3">3</div></td><td><div class="c0" title="-/F"><a href="lib-Yukki-Web-pm--branch.html#L193">50</a></div></td><td></td><td></td><td></td><td><div>45</div></td><td class="s"> http_throw('No action found matching that URL.', {</td></tr>
<tr><td class="h">194</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> status => 'NotFound',</td></tr>
<tr><td class="h">195</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> }) unless $match;</td></tr>
<tr><td class="h">196</td><td colspan="7"></td></tr><tr><td class="h">197</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>42</div></td><td class="s"> $ctx->request->path_parameters($match->mapping);</td></tr>
<tr><td class="h">198</td><td colspan="7"></td></tr><tr><td class="h">199</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>123</div></td><td class="s"> my $access_level_needed = $match->access_level;</td></tr>
<tr><td class="h">200</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> http_throw('You are not authorized to run this action.', {</td></tr>
<tr><td class="h">201</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> status => 'Forbidden',</td></tr>
<tr><td class="h">202</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> }) unless $self->check_access(</td></tr>
<tr><td class="h">203</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> user => $ctx->session->{user},</td></tr>
<tr><td class="h">204</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> repository => $match->mapping->{repository} // '-',</td></tr>
<tr><td class="h">205</td><td><div class="c3">3</div></td><td><div class="c0" title="-/F"><a href="lib-Yukki-Web-pm--branch.html#L205">50</a></div></td><td><div class="c0"><a href="lib-Yukki-Web-pm--condition.html#L205">50</a></div><div class="c3"><a href="lib-Yukki-Web-pm--condition.html#L205">100</a></div></td><td></td><td></td><td><div>60</div></td><td class="s"> special => $match->mapping->{special} // '-',</td></tr>
<tr><td class="h">206</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> needs => $access_level_needed,</td></tr>
<tr><td class="h">207</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> );</td></tr>
<tr><td class="h">208</td><td colspan="7"></td></tr><tr><td class="h">209</td><td><div class="c3">3</div></td><td><div class="c0" title="-/F"><a href="lib-Yukki-Web-pm--branch.html#L209">50</a></div></td><td></td><td></td><td></td><td><div>57</div></td><td class="s"> if ($ctx->session->{user}) {</td></tr>
<tr><td class="h">210</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> $ctx->response->add_navigation_item(user => {</td></tr>
<tr><td class="h">211</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> label => $ctx->session->{user}{name},</td></tr>
<tr><td class="h">212</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s"> href => 'profile',</td></tr>
<tr><td class="h">213</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> sort => 200,</td></tr>
<tr><td class="h">214</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> });</td></tr>
<tr><td class="h">215</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s"> $ctx->response->add_navigation_item(user => {</td></tr>
<tr><td class="h">216</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> label => 'Sign out',</td></tr>
<tr><td class="h">217</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> href => 'logout',</td></tr>
<tr><td class="h">218</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> sort => 100,</td></tr>
<tr><td class="h">219</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> });</td></tr>
<tr><td class="h">220</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> }</td></tr>
<tr><td class="h">221</td><td colspan="7"></td></tr><tr><td class="h">222</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> else {</td></tr>
<tr><td class="h">223</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>200</div></td><td class="s"> $ctx->response->add_navigation_item(user => {</td></tr>
<tr><td class="h">224</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> label => 'Sign in',</td></tr>
<tr><td class="h">225</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> href => 'login',</td></tr>
<tr><td class="h">226</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> sort => 100,</td></tr>
<tr><td class="h">227</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> });</td></tr>
<tr><td class="h">228</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> }</td></tr>
<tr><td class="h">229</td><td colspan="7"></td></tr><tr><td class="h">230</td><td><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>16</div><div>39</div></td><td class="s"> for my $repository (keys %{ $self->settings->repositories }) {</td></tr>
<tr><td class="h">231</td><td><div class="c3">6</div></td><td></td><td></td><td></td><td></td><td><div>100</div></td><td class="s"> my $config = $self->settings->repositories->{$repository};</td></tr>
<tr><td class="h">232</td><td colspan="7"></td></tr><tr><td class="h">233</td><td><div class="c3">6</div></td><td></td><td></td><td></td><td></td><td><div>39</div></td><td class="s"> my $name = $config->name;</td></tr>
<tr><td class="h">234</td><td><div class="c3">6</div></td><td></td><td></td><td></td><td></td><td><div>66</div></td><td class="s"> $ctx->response->add_navigation_item(repository => {</td></tr>
<tr><td class="h">235</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> label => $name,</td></tr>
<tr><td class="h">236</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> href => join('/', 'page/view', $repository),</td></tr>
<tr><td class="h">237</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> sort => $config->sort,</td></tr>
<tr><td class="h">238</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> });</td></tr>
<tr><td class="h">239</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> }</td></tr>
<tr><td class="h">240</td><td colspan="7"></td></tr><tr><td class="h">241</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>54</div></td><td class="s"> my $controller = $match->target;</td></tr>
<tr><td class="h">242</td><td colspan="7"></td></tr><tr><td class="h">243</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>78</div></td><td class="s"> $controller->fire($ctx);</td></tr>
<tr><td class="h">244</td><td><div class="c3">2</div></td><td></td><td></td><td></td><td></td><td><div>227</div></td><td class="s"> $response = $ctx->response->finalize;</td></tr>
<tr><td class="h">245</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> }</td></tr>
<tr><td class="h">246</td><td colspan="7"></td></tr><tr><td class="h">247</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> catch {</td></tr>
<tr><td class="h">248</td><td colspan="7"></td></tr><tr><td class="h">249</td><td><div class="c3">1</div></td><td><div class="c0" title="T/-"><a href="lib-Yukki-Web-pm--branch.html#L249">50</a></div></td><td><div class="c0"><a href="lib-Yukki-Web-pm--condition.html#L249">33</a></div></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L249">1</a></div></td><td></td><td><div>214</div></td><td class="s"> if (blessed $_ and $_->isa('Yukki::Error')) {</td></tr>
<tr><td class="h">250</td><td colspan="7"></td></tr><tr><td class="h">251</td><td><div class="c3">1</div></td><td><div class="c0" title="-/F"><a href="lib-Yukki-Web-pm--branch.html#L251">50</a></div></td><td><div class="c0"><a href="lib-Yukki-Web-pm--condition.html#L251">33</a></div></td><td></td><td></td><td><div>4</div></td><td class="s"> if ($_->does('HTTP::Throwable::Role::Status::Forbidden')</td></tr>
<tr><td class="h">252</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> and not $ctx->session->{user}) {</td></tr>
<tr><td class="h">253</td><td colspan="7"></td></tr><tr><td class="h">254</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s"> $response = http_exception('Please login first.', {</td></tr>
<tr><td class="h">255</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> status => 'Found',</td></tr>
<tr><td class="h">256</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> location => ''.$ctx->rebase_url('login'),</td></tr>
<tr><td class="h">257</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> })->as_psgi($env);</td></tr>
<tr><td class="h">258</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> }</td></tr>
<tr><td class="h">259</td><td colspan="7"></td></tr><tr><td class="h">260</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> else {</td></tr>
<tr><td class="h">261</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>48</div></td><td class="s"> $response = $_->as_psgi($env);</td></tr>
<tr><td class="h">262</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> }</td></tr>
<tr><td class="h">263</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> }</td></tr>
<tr><td class="h">264</td><td colspan="7"></td></tr><tr><td class="h">265</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> else {</td></tr>
<tr><td class="h">266</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s"> warn "ISE: $_";</td></tr>
<tr><td class="h">267</td><td colspan="7"></td></tr><tr><td class="h">268</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td><div>0</div></td><td class="s"> $response = http_exception("Oh darn. Something went wrong.", {</td></tr>
<tr><td class="h">269</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> status => 'InternalServerError',</td></tr>
<tr><td class="h">270</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> show_stack_trace => 0,</td></tr>
<tr><td class="h">271</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> })->as_psgi($env);</td></tr>
<tr><td class="h">272</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> }</td></tr>
<tr><td class="h">273</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>23</div></td><td class="s"> };</td></tr>
<tr><td class="h">274</td><td colspan="7"></td></tr><tr><td class="h">275</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>414</div></td><td class="s"> return $response;</td></tr>
<tr><td class="h">276</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">277</td><td colspan="7"></td></tr><tr><td class="h">278 - 284</td><td colspan="6"></td><td class="s"><pre>=head2 session_middleware
enable $app->session_middleware;
Returns the setup for the PSGI session middleware.
=cut</pre></td></tr>
<tr><td class="h">285</td><td colspan="7"></td></tr><tr><td class="h">286</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub session_middleware {</td></tr>
<tr><td class="h">287</td><td><div class="c3">1</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-pm--subroutine.html#L287">1</a></div></td><td><div class="c3">1</div></td><td><div>2</div></td><td class="s"> my $self = shift;</td></tr>
<tr><td class="h">288</td><td colspan="7"></td></tr><tr><td class="h">289</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> # TODO Make this configurable</td></tr>
<tr><td class="h">290</td><td><div class="c3">1</div></td><td></td><td></td><td></td><td></td><td><div>5</div></td><td class="s"> return ('Session',</td></tr>
<tr><td class="h">291</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> store => Plack::Session::Store::Cache->new(</td></tr>
<tr><td class="h">292</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> cache => CHI->new(driver => 'FastMmap'),</td></tr>
<tr><td class="h">293</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> ),</td></tr>
<tr><td class="h">294</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"> );</td></tr>
<tr><td class="h">295</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">296</td><td colspan="7"></td></tr><tr><td class="h">297 - 303</td><td colspan="6"></td><td class="s"><pre>=head2 munge_label
my $link = $app->munch_label("This is a label");
Turns some label into a link slug using the standard means for doing so.
=cut</pre></td></tr>
<tr><td class="h">304</td><td colspan="7"></td></tr><tr><td class="h">305</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub munge_label {</td></tr>
<tr><td class="h">306</td><td><div class="c0">0</div></td><td></td><td></td><td><div class="c0"><a href="lib-Yukki-Web-pm--subroutine.html#L306">0</a></div></td><td><div class="c3">1</div></td><td></td><td class="s"> my ($self, $link) = @_;</td></tr>
<tr><td class="h">307</td><td colspan="7"></td></tr><tr><td class="h">308</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td></td><td class="s"> $link =~ m{([^/]+)$};</td></tr>
<tr><td class="h">309</td><td colspan="7"></td></tr><tr><td class="h">310</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td></td><td class="s"> $link =~ s{([a-zA-Z])'([a-zA-Z])}{$1$2}g; # foo's -> foos, isn't -> isnt</td></tr>
<tr><td class="h">311</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td></td><td class="s"> $link =~ s{[^a-zA-Z0-9-_./]+}{-}g;</td></tr>
<tr><td class="h">312</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td></td><td class="s"> $link =~ s{-+}{-}g;</td></tr>
<tr><td class="h">313</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td></td><td class="s"> $link =~ s{^-}{};</td></tr>
<tr><td class="h">314</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td></td><td class="s"> $link =~ s{-$}{};</td></tr>
<tr><td class="h">315</td><td colspan="7"></td></tr><tr><td class="h">316</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td></td><td class="s"> $link .= '.yukki';</td></tr>
<tr><td class="h">317</td><td colspan="7"></td></tr><tr><td class="h">318</td><td><div class="c0">0</div></td><td></td><td></td><td></td><td></td><td></td><td class="s"> return $link;</td></tr>
<tr><td class="h">319</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">320</td><td colspan="7"></td></tr><tr><td class="h">321 - 339</td><td colspan="6"></td><td class="s"><pre>=head2 all_plugins
A convenience accessor that returns C<plugins> as a list.
=head2 format_helper_plugins
Returns all the format helper plugins as a list.
=head2 formatter_plugins
Returns all the formatter plugins as a list.
=begin Pod::Coverage
BUILD
=end Pod::Coverage
=cut</pre></td></tr>
<tr><td class="h">340</td><td colspan="7"></td></tr><tr><td class="h">341</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">1;</td></tr>
</table>
</body>
</html>