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/Context.pm</title>
</head>
<body>
<h1>File Coverage</h1>
<table>
<tr><td class="h" align="right">File:</td><td align="left">lib/Yukki/Web/Context.pm</td></tr>
<tr><td class="h" align="right">Coverage:</td><td align="left" class="c0">73.6%</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::Context;</td></tr>
<tr><td class="h">2</td><td colspan="7"></td></tr><tr><td class="h">3</td><td><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L3">3</a></div></td><td></td><td><div>27</div><div>13</div></td><td class="s">use v5.24;</td></tr>
<tr><td class="h">4</td><td><div class="c3">3</div><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L4">3</a></div></td><td></td><td><div>10</div><div>3</div><div>41</div></td><td class="s">use utf8;</td></tr>
<tr><td class="h">5</td><td><div class="c3">3</div><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L5">3</a></div></td><td></td><td><div>603</div><div>10809</div><div>9</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><div class="c3">3</div><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L7">3</a></div></td><td></td><td><div>2107</div><div>752</div><div>101</div></td><td class="s">use Sub::Name qw( subname );</td></tr>
<tr><td class="h">8</td><td><div class="c3">3</div><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L8">3</a></div></td><td></td><td><div>487</div><div>27070</div><div>10</div></td><td class="s">use Type::Utils;</td></tr>
<tr><td class="h">9</td><td><div class="c3">3</div><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L9">3</a></div></td><td></td><td><div>3132</div><div>54548</div><div>20</div></td><td class="s">use Types::Standard qw( ArrayRef HashRef Str );</td></tr>
<tr><td class="h">10</td><td><div class="c3">3</div><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L10">3</a></div></td><td></td><td><div>2097</div><div>106020</div><div>17</div></td><td class="s">use Types::URI qw( Uri );</td></tr>
<tr><td class="h">11</td><td><div class="c3">3</div><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L11">3</a></div></td><td></td><td><div>1119</div><div>6</div><div>52</div></td><td class="s">use Yukki::Web::Request;</td></tr>
<tr><td class="h">12</td><td><div class="c3">3</div><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L12">3</a></div></td><td></td><td><div>665</div><div>6</div><div>50</div></td><td class="s">use Yukki::Web::Response;</td></tr>
<tr><td class="h">13</td><td colspan="7"></td></tr><tr><td class="h">14</td><td><div class="c3">3</div><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L14">3</a></div></td><td></td><td><div>10</div><div>4</div><div>11</div></td><td class="s">use namespace::clean;</td></tr>
<tr><td class="h">15</td><td colspan="7"></td></tr><tr><td class="h">16</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"># ABSTRACT: request-response context descriptor</td></tr>
<tr><td class="h">17</td><td colspan="7"></td></tr><tr><td class="h">18 - 43</td><td colspan="6"></td><td class="s"><pre>=head1 SYNOPSIS

&nbsp;&nbsp;# Many components are handed a Context in $ctx...

&nbsp;&nbsp;my $request = $ctx-&gt;request;
&nbsp;&nbsp;my $session = $ctx-&gt;session;
&nbsp;&nbsp;my $session_options = $ctx-&gt;session_options;
&nbsp;&nbsp;my $response = $ctx-&gt;response;
&nbsp;&nbsp;my $stash = $ctx-&gt;stash;

&nbsp;&nbsp;$ctx-&gt;add_errors(&#39;bad stuff&#39;);
&nbsp;&nbsp;$ctx-&gt;add_warnings(&#39;not so good stuff&#39;);
&nbsp;&nbsp;$ctx-&gt;add_info(&#39;some stuff&#39;);

=head1 DESCRIPTION

This describes information about a single request-repsonse to be handled by the server.

=head1 ATTRIBUTES

=head2 env

This is the L&lt;PSGI&gt; environment. Do not use directly. This will probably be
renamed to make it more difficult to use directly in the future.

=cut</pre></td></tr>
<tr><td class="h">44</td><td colspan="7"></td></tr><tr><td class="h">45</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">has env =&gt; (</td></tr>
<tr><td class="h">46</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">47</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; HashRef,</td></tr>
<tr><td class="h">48</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">49</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">50</td><td colspan="7"></td></tr><tr><td class="h">51 - 55</td><td colspan="6"></td><td class="s"><pre>=head2 request

This is the L&lt;Yukki::Web::Request&gt; object representing the incoming request.

=cut</pre></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">has request =&gt; (</td></tr>
<tr><td class="h">58</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">59</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;Yukki::Web::Request&#39;),</td></tr>
<tr><td class="h">60</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">61</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">62</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; sub { Yukki::Web::Request-&gt;new(env =&gt; shift-&gt;env) },</td></tr>
<tr><td class="h">63</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;handles&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; [ qw( session session_options ) ],</td></tr>
<tr><td class="h">64</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">65</td><td colspan="7"></td></tr><tr><td class="h">66 - 71</td><td colspan="6"></td><td class="s"><pre>=head2 response

This is the L&lt;Yukki::Web::Response&gt; object representing the response to send
back to the client.

=cut</pre></td></tr>
<tr><td class="h">72</td><td colspan="7"></td></tr><tr><td class="h">73</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">has response =&gt; (</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;is&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; &#39;ro&#39;,</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;isa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; class_type(&#39;Yukki::Web::Response&#39;),</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;required&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;lazy&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; 1,</td></tr>
<tr><td class="h">78</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; sub { Yukki::Web::Response-&gt;new },</td></tr>
<tr><td class="h">79</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">80</td><td colspan="7"></td></tr><tr><td class="h">81 - 87</td><td colspan="6"></td><td class="s"><pre>=head2 stash

This is a temporary stash of information. Use of this should be avoided when
possible. Global state like this (even if it only lasts for one request) should
only be used as a last resort.

=cut</pre></td></tr>
<tr><td class="h">88</td><td colspan="7"></td></tr><tr><td class="h">89</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">has stash =&gt; (</td></tr>
<tr><td class="h">90</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">91</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; HashRef,</td></tr>
<tr><td class="h">92</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">93</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; sub { +{} },</td></tr>
<tr><td class="h">94</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">95</td><td colspan="7"></td></tr><tr><td class="h">96 - 127</td><td colspan="6"></td><td class="s"><pre>=head2 base_url

This is a L&lt;URI&gt; describing the base path to get to this Yukki wiki site. It is configured from the L&lt;Yukki::Web::Settings/base_url&gt; setting. The value of the setting will determine how this value is calculated or may set it explicitly.

=over

=item *

C&lt;SCRIPT_NAME&gt;. When C&lt;base_url&gt; is set to C&lt;SCRIPT_NAME&gt;, then the full path to the script name will be used as the base URL. This is the default and, generally, the safest option.

=item *

C&lt;REWRITE&gt;. The C&lt;REWRITE&gt; option takes a slightly different approach to building the base URL. It looks at the C&lt;REQUEST_URI&gt; and compares that to the C&lt;PATH_INFO&gt; and finds the common components. For example:

&nbsp;&nbsp;PATH_INFO=/page/view/main
&nbsp;&nbsp;REQUEST_URI=/yukki-site/page/view/main

this leads to a base URL of:

&nbsp;&nbsp;/yukki-site

If C&lt;PATH_INFO&gt; is not a sub-path of C&lt;REQUEST_URI&gt;, this will fall back to the same solution as C&lt;SCRIPT_NAME&gt; above.

=item *

Anything else will be considered an absolute URL and used as the base URL.

=back

This may be used to construct redirects or URLs for links and form actions.

=cut</pre></td></tr>
<tr><td class="h">128</td><td colspan="7"></td></tr><tr><td class="h">129</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">has base_url =&gt; (</td></tr>
<tr><td class="h">130</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;rw&#39;,</td></tr>
<tr><td class="h">131</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; Uri,</td></tr>
<tr><td class="h">132</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">133</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;&nbsp;&nbsp;=&gt; 1,</td></tr>
<tr><td class="h">134</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">135</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_base_url&#39;,</td></tr>
<tr><td class="h">136</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">);</td></tr>
<tr><td class="h">137</td><td colspan="7"></td></tr><tr><td class="h">138</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub _build_base_url {</td></tr>
<tr><td class="h">139</td><td><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L139">3</a></div></td><td></td><td><div>260</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $self = shift;</td></tr>
<tr><td class="h">140</td><td colspan="7"></td></tr><tr><td class="h">141</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>15</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my $base_url = $self-&gt;env-&gt;{&#39;yukki.settings&#39;}-&gt;base_url;</td></tr>
<tr><td class="h">142</td><td><div class="c3">3</div></td><td><div class="c0" title="T/-"><a href="lib-Yukki-Web-Context-pm--branch.html#L142">50</a></div><div class="c0" title="-/-"><a href="lib-Yukki-Web-Context-pm--branch.html#L142">0</a></div></td><td></td><td></td><td></td><td><div>7</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;if ($base_url eq &#39;SCRIPT_NAME&#39;) {</td></tr>
<tr><td class="h">143</td><td><div class="c3">3</div></td><td></td><td></td><td></td><td></td><td><div>41</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return $self-&gt;request-&gt;base;</td></tr>
<tr><td class="h">144</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">145</td><td colspan="7"></td></tr><tr><td class="h">146</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;elsif ($base_url eq &#39;REWRITE&#39;) {</td></tr>
<tr><td class="h">147</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;my $path_info&nbsp;&nbsp;&nbsp;= $self-&gt;env-&gt;{PATH_INFO};</td></tr>
<tr><td class="h">148</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;my $request_uri = $self-&gt;env-&gt;{REQUEST_URI};</td></tr>
<tr><td class="h">149</td><td colspan="7"></td></tr><tr><td class="h">150</td><td><div class="c0">0</div></td><td><div class="c0" title="-/-"><a href="lib-Yukki-Web-Context-pm--branch.html#L150">0</a></div></td><td></td><td></td><td></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if ($request_uri =~ s/$path_info$//) {</td></tr>
<tr><td class="h">151</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;my $base_url = $self-&gt;request-&gt;uri;</td></tr>
<tr><td class="h">152</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;$base_url-&gt;path($request_uri);</td></tr>
<tr><td class="h">153</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;return $base_url-&gt;canonical;</td></tr>
<tr><td class="h">154</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">155</td><td colspan="7"></td></tr><tr><td class="h">156</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;return $self-&gt;request-&gt;base;</td></tr>
<tr><td class="h">157</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">158</td><td colspan="7"></td></tr><tr><td class="h">159</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;else {</td></tr>
<tr><td class="h">160</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;return $_;</td></tr>
<tr><td class="h">161</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">162</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">163</td><td colspan="7"></td></tr><tr><td class="h">164 - 181</td><td colspan="6"></td><td class="s"><pre>=head2 errors

=head2 warnings

=head2 info

These each contain an array of errors.

The C&lt;list_errors&gt;, C&lt;list_warnings&gt;, and C&lt;list_info&gt; methods are provided to
return the values as a list.

The C&lt;add_errors&gt;, C&lt;add_warnings&gt;, and C&lt;add_info&gt; methods are provided to
append new messages.

The C&lt;has_errors&gt;, C&lt;has_warnings&gt;, and C&lt;has_info&gt; methods are provided to tell
you if there are any messages.

=cut</pre></td></tr>
<tr><td class="h">182</td><td colspan="7"></td></tr><tr><td class="h">183</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s"># TODO Store these in a flash stash</td></tr>
<tr><td class="h">184</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">for my $message_type (qw( errors warnings info )) {</td></tr>
<tr><td class="h">185</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;has $message_type =&gt; (</td></tr>
<tr><td class="h">186</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&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">187</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;isa&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; ArrayRef[Str],</td></tr>
<tr><td class="h">188</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;required&nbsp;&nbsp;&nbsp;&nbsp;=&gt; 1,</td></tr>
<tr><td class="h">189</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;default&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=&gt; sub { [] },</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;);</td></tr>
<tr><td class="h">191</td><td colspan="7"></td></tr><tr><td class="h">192</td><td><div class="c3">3</div><div class="c3">3</div><div class="c3">3</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L192">3</a></div></td><td></td><td><div>1405</div><div>4</div><div>393</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;no strict &#39;refs&#39;;</td></tr>
<tr><td class="h">193</td><td colspan="7"></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;*{__PACKAGE__ . &quot;::list_$message_type&quot;} = subname &quot;list_$message_type&quot;, sub {</td></tr>
<tr><td class="h">195</td><td><div class="c0">0</div></td><td></td><td></td><td><div class="c0"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L195">0</a></div><div class="c0"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L195">0</a></div><div class="c0"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L195">0</a></div></td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $self = shift;</td></tr>
<tr><td class="h">196</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;&nbsp;&nbsp;&nbsp;&nbsp;map { ucfirst &quot;$_.&quot; } $self-&gt;$message_type-&gt;@*</td></tr>
<tr><td class="h">197</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">198</td><td colspan="7"></td></tr><tr><td class="h">199</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;*{__PACKAGE__ . &quot;::add_$message_type&quot;} = subname &quot;add_$message_type&quot;, sub {</td></tr>
<tr><td class="h">200</td><td><div class="c0">0</div></td><td></td><td></td><td><div class="c0"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L200">0</a></div><div class="c0"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L200">0</a></div><div class="c0"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L200">0</a></div></td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td><div>0</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $self = shift;</td></tr>
<tr><td class="h">201</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;push $self-&gt;$message_type-&gt;@*, @_;</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;};</td></tr>
<tr><td class="h">203</td><td colspan="7"></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;*{__PACKAGE__ . &quot;::has_$message_type&quot;} = subname &quot;add_$message_type&quot;, sub {</td></tr>
<tr><td class="h">205</td><td><div class="c3">7</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L205">7</a></div><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L205">7</a></div><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L205">7</a></div></td><td><div class="c3">1</div><div class="c3">1</div><div class="c3">1</div></td><td><div>2570</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;my $self = shift;</td></tr>
<tr><td class="h">206</td><td><div class="c3">7</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;scalar $self-&gt;$message_type-&gt;@*;</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;};</td></tr>
<tr><td class="h">208</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">209</td><td colspan="7"></td></tr><tr><td class="h">210</td><td colspan="7"></td></tr><tr><td class="h">211 - 219</td><td colspan="6"></td><td class="s"><pre>=head1 METHODS

=head2 rebase_url

&nbsp;&nbsp;my $url = $ctx-&gt;rebase_url($path);

Given a relative URL, this returns an absolute URL using the L&lt;/base_url&gt;.

=cut</pre></td></tr>
<tr><td class="h">220</td><td colspan="7"></td></tr><tr><td class="h">221</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">sub rebase_url {</td></tr>
<tr><td class="h">222</td><td><div class="c3">27</div></td><td></td><td></td><td><div class="c3"><a href="lib-Yukki-Web-Context-pm--subroutine.html#L222">27</a></div></td><td><div class="c3">1</div></td><td><div>44</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;my ($self, $url) = @_;</td></tr>
<tr><td class="h">223</td><td><div class="c3">27</div></td><td></td><td></td><td></td><td></td><td><div>71</div></td><td class="s">&nbsp;&nbsp;&nbsp;&nbsp;return URI-&gt;new($url)-&gt;abs($self-&gt;base_url);</td></tr>
<tr><td class="h">224</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">}</td></tr>
<tr><td class="h">225</td><td colspan="7"></td></tr><tr><td class="h">226 - 250</td><td colspan="6"></td><td class="s"><pre>=head2 list_errors

=head2 list_warnings

=head2 list_info

These methods return the list of errors, warnings, and info messages associated with the current flow.

=head2 add_errors

=head2 add_warnings

=head2 add_info

These methods add zero or more errors, warnings, and info messages to be associated with the current flow.

=head2 has_errors

=head2 has_warnings

=head2 has_info

These methods return a true value if there are any errors, warnings, or info messages associated with the current flow.

=cut</pre></td></tr>
<tr><td class="h">251</td><td colspan="7"></td></tr><tr><td class="h">252</td><td></td><td></td><td></td><td></td><td></td><td></td><td class="s">1;</td></tr>
</table>
</body>
</html>