The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
<!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 &#39;+settings&#39; =&gt; (</td></tr>
<tr><td class="h">38</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; YukkiWebSettings,</td></tr>
<tr><td class="h">39</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;coerce&nbsp;&nbsp;&nbsp;&nbsp;=&gt; 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&lt;Path::Router&gt; that will determine where incoming requests are
sent. It is automatically set to a L&lt;Yukki::Web::Router&gt; 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 =&gt; (</td></tr>
<tr><td class="h">50</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; &#39;ro&#39;,</td></tr>
<tr><td class="h">51</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; class_type(&#39;Path::Router&#39;),</td></tr>
<tr><td class="h">52</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;required&nbsp;&nbsp;&nbsp;&nbsp;=&gt; 1,</td></tr>
<tr><td class="h">53</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;lazy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; 1,</td></tr>
<tr><td class="h">54</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;builder&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; &#39;_build_router&#39;,</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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;Yukki::Web::Router-&gt;new( app =&gt; $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

&nbsp;&nbsp;my @plugins&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= $app-&gt;all_plugins;
&nbsp;&nbsp;my @format_helpers = $app-&gt;format_helper_plugins;
&nbsp;&nbsp;my @formatters&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= $app-&gt;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 =&gt; (</td></tr>
<tr><td class="h">73</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;is&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; &#39;ro&#39;,</td></tr>
<tr><td class="h">74</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;isa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; PluginList,</td></tr>
<tr><td class="h">75</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;required&nbsp;&nbsp;&nbsp;&nbsp;=&gt; 1,</td></tr>
<tr><td class="h">76</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;lazy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; 1,</td></tr>
<tr><td class="h">77</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;builder&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; &#39;_build_plugins&#39;,</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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;plugins-&gt;@*;</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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;grep { $_-&gt;does(&#39;Yukki::Web::Plugin::Role::FormatHelper&#39;) }</td></tr>
<tr><td class="h">88</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;plugins-&gt;@*;</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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;grep { $_-&gt;does(&#39;Yukki::Web::Plugin::Role::Formatter&#39;) }</td></tr>
<tr><td class="h">94</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$self-&gt;plugins-&gt;@*;</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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;for my $plugin_settings (@{ $self-&gt;settings-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $module = $plugin_settings-&gt;{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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $class&nbsp;&nbsp;= $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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$class&nbsp;&nbsp;= &quot;Yukki::Web::Plugin::$class&quot; 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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;push @plugins, $class-&gt;new(%$plugin_settings, app =&gt; $self);</td></tr>
<tr><td class="h">110</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;my $types = $self-&gt;settings-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;}</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&lt;/controller&gt; and L&lt;/view&gt;.

=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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;my $class_name = join &#39;::&#39;, &#39;Yukki::Web&#39;, $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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;return $class_name-&gt;new(app =&gt; $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

&nbsp;&nbsp;my $controller = $app-&gt;controller($name);

Returns an instance of the named L&lt;Yukki::Web::Controller&gt;.

=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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;return $self-&gt;component(Controller =&gt; $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

&nbsp;&nbsp;my $view = $app-&gt;view($name);

Returns an instance of the named L&lt;Yukki::Web::View&gt;.

=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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;return $self-&gt;component(View =&gt; $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

&nbsp;&nbsp;my $response = $app-&gt;dispatch($env);

This is a PSGI application in a method call. Given a L&lt;PSGI&gt; 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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;my $ctx = Yukki::Web::Context-&gt;new(env =&gt; $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">&nbsp;&nbsp;&nbsp;&nbsp;$env-&gt;{&#39;yukki.app&#39;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= $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">&nbsp;&nbsp;&nbsp;&nbsp;$env-&gt;{&#39;yukki.settings&#39;} = $self-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;$env-&gt;{&#39;yukki.ctx&#39;}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= $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">&nbsp;&nbsp;&nbsp;&nbsp;weaken $env-&gt;{&#39;yukki.ctx&#39;};</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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $match = $self-&gt;router-&gt;match($ctx-&gt;request-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http_throw(&#39;No action found matching that URL.&#39;, {</td></tr>
<tr><td class="h">194</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status =&gt; &#39;NotFound&#39;,</td></tr>
<tr><td class="h">195</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}) 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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ctx-&gt;request-&gt;path_parameters($match-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $access_level_needed = $match-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;http_throw(&#39;You are not authorized to run this action.&#39;, {</td></tr>
<tr><td class="h">201</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status =&gt; &#39;Forbidden&#39;,</td></tr>
<tr><td class="h">202</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}) unless $self-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;user&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; $ctx-&gt;session-&gt;{user},</td></tr>
<tr><td class="h">204</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;repository =&gt; $match-&gt;mapping-&gt;{repository} // &#39;-&#39;,</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;special&nbsp;&nbsp;&nbsp;&nbsp;=&gt; $match-&gt;mapping-&gt;{special} // &#39;-&#39;,</td></tr>
<tr><td class="h">206</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;needs&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; $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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;);</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($ctx-&gt;session-&gt;{user}) {</td></tr>
<tr><td class="h">210</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ctx-&gt;response-&gt;add_navigation_item(user =&gt; {</td></tr>
<tr><td class="h">211</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label =&gt; $ctx-&gt;session-&gt;{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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;href&nbsp;&nbsp;=&gt; &#39;profile&#39;,</td></tr>
<tr><td class="h">213</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort&nbsp;&nbsp;=&gt; 200,</td></tr>
<tr><td class="h">214</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ctx-&gt;response-&gt;add_navigation_item(user =&gt; {</td></tr>
<tr><td class="h">216</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label =&gt; &#39;Sign out&#39;,</td></tr>
<tr><td class="h">217</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;href&nbsp;&nbsp;=&gt; &#39;logout&#39;,</td></tr>
<tr><td class="h">218</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort&nbsp;&nbsp;=&gt; 100,</td></tr>
<tr><td class="h">219</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</td></tr>
<tr><td class="h">220</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ctx-&gt;response-&gt;add_navigation_item(user =&gt; {</td></tr>
<tr><td class="h">224</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label =&gt; &#39;Sign in&#39;,</td></tr>
<tr><td class="h">225</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;href&nbsp;&nbsp;=&gt; &#39;login&#39;,</td></tr>
<tr><td class="h">226</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort&nbsp;&nbsp;=&gt; 100,</td></tr>
<tr><td class="h">227</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</td></tr>
<tr><td class="h">228</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for my $repository (keys %{ $self-&gt;settings-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $config = $self-&gt;settings-&gt;repositories-&gt;{$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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $name = $config-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$ctx-&gt;response-&gt;add_navigation_item(repository =&gt; {</td></tr>
<tr><td class="h">235</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;label =&gt; $name,</td></tr>
<tr><td class="h">236</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;href&nbsp;&nbsp;=&gt; join(&#39;/&#39;, &#39;page/view&#39;,&nbsp;&nbsp;$repository),</td></tr>
<tr><td class="h">237</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sort&nbsp;&nbsp;=&gt; $config-&gt;sort,</td></tr>
<tr><td class="h">238</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</td></tr>
<tr><td class="h">239</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $controller = $match-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$controller-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$response = $ctx-&gt;response-&gt;finalize;</td></tr>
<tr><td class="h">245</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;}</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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if (blessed $_ and $_-&gt;isa(&#39;Yukki::Error&#39;)) {</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($_-&gt;does(&#39;HTTP::Throwable::Role::Status::Forbidden&#39;)</td></tr>
<tr><td class="h">252</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;and not $ctx-&gt;session-&gt;{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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$response = http_exception(&#39;Please login first.&#39;, {</td></tr>
<tr><td class="h">255</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;&nbsp;&nbsp;=&gt; &#39;Found&#39;,</td></tr>
<tr><td class="h">256</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;location =&gt; &#39;&#39;.$ctx-&gt;rebase_url(&#39;login&#39;),</td></tr>
<tr><td class="h">257</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$response = $_-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</td></tr>
<tr><td class="h">263</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;warn &quot;ISE: $_&quot;;</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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$response = http_exception(&quot;Oh darn. Something went wrong.&quot;, {</td></tr>
<tr><td class="h">269</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;status&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; &#39;InternalServerError&#39;,</td></tr>
<tr><td class="h">270</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;show_stack_trace =&gt; 0,</td></tr>
<tr><td class="h">271</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;})-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}</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">&nbsp;&nbsp;&nbsp;&nbsp;};</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">&nbsp;&nbsp;&nbsp;&nbsp;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

&nbsp;&nbsp;enable $app-&gt;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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;# 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">&nbsp;&nbsp;&nbsp;&nbsp;return (&#39;Session&#39;,</td></tr>
<tr><td class="h">291</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;store =&gt; Plack::Session::Store::Cache-&gt;new(</td></tr>
<tr><td class="h">292</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cache =&gt; CHI-&gt;new(driver =&gt; &#39;FastMmap&#39;),</td></tr>
<tr><td class="h">293</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;),</td></tr>
<tr><td class="h">294</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;);</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

&nbsp;&nbsp;my $link = $app-&gt;munch_label(&quot;This is a label&quot;);

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">&nbsp;&nbsp;&nbsp;&nbsp;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">&nbsp;&nbsp;&nbsp;&nbsp;$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">&nbsp;&nbsp;&nbsp;&nbsp;$link =~ s{([a-zA-Z])&#39;([a-zA-Z])}{$1$2}g; # foo&#39;s -&gt; foos, isn&#39;t -&gt; 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">&nbsp;&nbsp;&nbsp;&nbsp;$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">&nbsp;&nbsp;&nbsp;&nbsp;$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">&nbsp;&nbsp;&nbsp;&nbsp;$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">&nbsp;&nbsp;&nbsp;&nbsp;$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">&nbsp;&nbsp;&nbsp;&nbsp;$link .= &#39;.yukki&#39;;</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">&nbsp;&nbsp;&nbsp;&nbsp;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&lt;plugins&gt; 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

&nbsp;&nbsp;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>