Acme-CPANModulesBundle-Import-MojoliciousAdvent-2017

 view release on metacpan or  search on metacpan

devdata/https_mojolicious.io_blog_2017_12_01_day-1-getting-started  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/01/day-1-getting-started/" property="og:url">
  <meta content="Day 1: Getting Started" property="og:title">
    <meta content="Hit the ground running with Mojolicious. A working application in minutes!" property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/01/day-1-getting-started/1280px-Colorado_Springs_Hot_Air_Balloon_Competition.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 1: Getting Started - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_01_day-1-getting-started  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_02_day-2-the-stash  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/02/day-2-the-stash/" property="og:url">
  <meta content="Day 2: The Stash" property="og:title">
    <meta content="The stash is the most important data structure in Mojolicious." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/02/day-2-the-stash/bag-1854148_1920.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 2: The Stash - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_02_day-2-the-stash  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_03_day-3-using-named-routes  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/03/day-3-using-named-routes/" property="og:url">
  <meta content="Day 3: Using Named Routes" property="og:title">
    <meta content="Avoid hard-coded URLs using Mojolicious&#39; named routes." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/03/day-3-using-named-routes/my_name_is.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 3: Using Named Routes - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_03_day-3-using-named-routes  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_04_day-4-dont-fear-the-full-app  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/04/day-4-dont-fear-the-full-app/" property="og:url">
  <meta content="Day 4: Don&#39;t Fear the Full App" property="og:title">
    <meta content="Growing from Lite to Full apps is easy. There&#39;s no magic to worry about." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/04/day-4-dont-fear-the-full-app/arucaria.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 4: Don't Fear the Full App - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_04_day-4-dont-fear-the-full-app  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_05_day-5-your-apps-built-in-commands  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/05/day-5-your-apps-built-in-commands/" property="og:url">
  <meta content="Day 5: Your App&#39;s Built-In Commands" property="og:title">
    <meta content="Exploring the built-in commands that come with every Mojolicious Application." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/05/day-5-your-apps-built-in-commands/1200px-Rocket_prolant.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 5: Your App's Built-In Commands - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_05_day-5-your-apps-built-in-commands  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_06_day-6-adding-your-own-commands  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/06/day-6-adding-your-own-commands/" property="og:url">
  <meta content="Day 6: Adding Your Own Commands" property="og:title">
    <meta content="Adding commands to your app to ease administration and avoid auxiliary scripts." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/06/day-6-adding-your-own-commands/1280px-Brightly_lit_STS-135_on_launch_pad_39a.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 6: Adding Your Own Commands - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_06_day-6-adding-your-own-commands  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_07_day-7-using-template-variants-for-a-beta-landing-page  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@preaction" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/07/day-7-using-template-variants-for-a-beta-landing-page/" property="og:url">
  <meta content="Day 7: Using Template Variants For a Beta Landing Page" property="og:title">
    <meta content="Doug demonstrates using Mojolicious template variants to show a new landing page for a beta-testing website" property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/07/day-7-using-template-variants-for-a-beta-landing-page/1280px-Single_yellow_tulip_in_a_field_of_red_tulips.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 7: Using Template Variants For a Beta Landing Page - mojolicious.io</title>
  <meta content="Doug Bell" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_07_day-7-using-template-variants-for-a-beta-landing-page  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_08_day-8-mocking-a-rest-api  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@preaction" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/08/day-8-mocking-a-rest-api/" property="og:url">
  <meta content="Day 8: Mocking a REST API" property="og:title">
    <meta content="Doug uses Mojolicious to quickly build a mock API for testing a front-end application." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/08/day-8-mocking-a-rest-api/1280px-crash-test-dummies.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 8: Mocking a REST API - mojolicious.io</title>
  <meta content="Doug Bell" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_08_day-8-mocking-a-rest-api  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_09_day-9-the-best-way-to-test  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/09/day-9-the-best-way-to-test/" property="og:url">
  <meta content="Day 9: The Best Way to Test" property="og:title">
    <meta content="An introduction to Test::Mojo, the testing framework for Mojolicious." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/09/day-9-the-best-way-to-test/1280px-CSIRO_ScienceImage_2798_Testing_in_the_Laboratory.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 9: The Best Way to Test - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_09_day-9-the-best-way-to-test  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_10_day-10-give-the-customer-what-they-want  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/10/day-10-give-the-customer-what-they-want/" property="og:url">
  <meta content="Day 10: Give the Customer What They Want" property="og:title">
    <meta content="Using content negotiation to create APIs that support multiple response formats." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/10/day-10-give-the-customer-what-they-want/cafe-wood-vintage-retro-seat-restaurant-946984-pxhere.com.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 10: Give the Customer What They Want - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_10_day-10-give-the-customer-what-they-want  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_11_day-11-useragent-content-generators  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/11/day-11-useragent-content-generators/" property="og:url">
  <meta content="Day 11: UserAgent Content Generators" property="og:title">
    <meta content="Using Mojo::UserAgent Content Generators to build request bodies." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/11/day-11-useragent-content-generators/artist-painting-1459778857j86.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 11: UserAgent Content Generators - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_11_day-11-useragent-content-generators  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_12_day-12-more-than-a-base-class  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/12/day-12-more-than-a-base-class/" property="og:url">
  <meta content="Day 12: More Than a Base Class" property="og:title">
    <meta content="Mojo::Base is a streamlined base class with lots of extra goodies." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/12/day-12-more-than-a-base-class/1280px-GG-ftpoint-bridge-2.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 12: More Than a Base Class - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_12_day-12-more-than-a-base-class  view on Meta::CPAN


<p>You saw this usage quite a bit in the Full app example on <a href="/blog/2017/12/06/day-6-adding-your-own-commands">Day 6</a>.
Mojo::Base only supports single-inheritance because we don&#39;t want to encourage bad practices.
If you know why you might want to use multipe-inheritance, you probably know how to get around this limitation as well.</p>

<h3>Attributes and Constructor</h3>

<p>Mojo::Base implements a class method which can be used to add attributes to the class (called <code>attr</code>).
While this is necessary for the implementation, this isn&#39;t the preferred usage.</p>

<p>The <code>has</code> keyword, added by the import above, gives us that nice declarative style that Perl users are familiar with from Moose and Moo.
The usage is different from those, owing to the limited choices available in declaration.
<code>has</code> takes a name or an array reference of name of the attribute(s) to declare.
It then optionally takes either a simple (non-reference) scalar default value or a callback to be used as a lazy builder.
When the lazy builder is called, it gets as an argument the instance itself.
That&#39;s it, clean and simple.</p>

<pre><code>package My::Class;
use Mojo::Base -base;

# attribute whose default is undef

devdata/https_mojolicious.io_blog_2017_12_12_day-12-more-than-a-base-class  view on Meta::CPAN

<pre><code>my $title = Mojo::UserAgent-&gt;new
  -&gt;max_redirects(10)
  -&gt;get(&#39;http://mojolicious.org&#39;)
  -&gt;res
  -&gt;dom
  -&gt;at(&#39;title&#39;)
  -&gt;text;
</code></pre>

<p>Frequent users of such Javascript libraries as <a href="https://jquery.com/">jQuery</a> or <a href="https://lodash.com/">lodash</a> will find this type of chaining very familiar.
Once you get the hang of this style it is <a href="https://metacpan.org/pod/MooX::ChainedAttributes">hard to let go of it</a>.
In a future post I intent to discuss several of the fluent interfaces that the Mojo stack provides.</p>

<h3>The tap Method</h3>

<p>Speaking of fluent interfaces, Mojo::Base provides an interesting method called <code>tap</code>, which is (in comp-sci terms) a <a href="https://en.wikipedia.org/wiki/SKI_combinator_calculus">K-combinator</a>.
This is a more advanced feature, but it allows you to insert a non-chainable call into a method chain without breaking it.
The first argument is the method or callback to be called, any additional arguments are passed to the tapped subroutine.
Within that subroutine the invocant is available as the first argument (before any passed arguments) or as <code>$_</code>.</p>

<p>If you had a proxy that you needed to setup before running the previous example, you could do</p>

devdata/https_mojolicious.io_blog_2017_12_12_day-12-more-than-a-base-class  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_13_day-13-more-about-roles  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/13/day-13-more-about-roles/" property="og:url">
  <meta content="Day 13: More About Roles" property="og:title">
    <meta content="Investigating Mojo::Base&#39;s recently-added role support." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/13/day-13-more-about-roles/amsterdam_hats.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 13: More About Roles - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_13_day-13-more-about-roles  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_14_day-14-you-promised-to-call  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
  <meta content="https://mojolicious.io/blog/2017/12/14/day-14-you-promised-to-call/" property="og:url">
  <meta content="Day 14: You Promised To Call!" property="og:title">
    <meta content="Learn about Promises and their new prominent role in Mojolicious." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/14/day-14-you-promised-to-call/pinky_swear.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 14: You Promised To Call! - mojolicious.io</title>
  <meta content="Ed J" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_14_day-14-you-promised-to-call  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_15_day-15-start-a-new-yancy-app  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@preaction" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/15/day-15-start-a-new-yancy-app/" property="og:url">
  <meta content="Day 15: Start a New Yancy App" property="og:title">
    <meta content="Rapid-prototype a data-backed application using Mojolicious and Yancy." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/15/day-15-start-a-new-yancy-app/scaffold.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 15: Start a New Yancy App - mojolicious.io</title>
  <meta content="Doug Bell" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_15_day-15-start-a-new-yancy-app  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_16_day-16-the-secret-life-of-sessions  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/16/day-16-the-secret-life-of-sessions/" property="og:url">
  <meta content="Day 16: The Secret Life of Sessions" property="og:title">
    <meta content="Use the session secret effectively to protect users without inconveniencing them." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/16/day-16-the-secret-life-of-sessions/scrabble.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 16: The Secret Life of Sessions - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_16_day-16-the-secret-life-of-sessions  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_17_day-17-the-wishlist-app  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/17/day-17-the-wishlist-app/" property="og:url">
  <meta content="Day 17: The Wishlist App" property="og:title">
    <meta content="Introducing template concepts with a group wishlist app." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/17/day-17-the-wishlist-app/xmas_tree.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 17: The Wishlist App - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_17_day-17-the-wishlist-app  view on Meta::CPAN

              <section id="section-2">
                  <p>At that point I hope to put the application into a repository of its own.
In the meantime however, you can see the application in the source for this <a href="https://github.com/MojoliciousDotIO/mojolicious.io/tree/master/blog/2017/12/17/day-17-the-wishlist-app/wishlist">article</a>.
To run it, you will need to install two additional modules, DBM::Deep and <a href="https://metacpan.org/pod/LinkEmbedder">LinkEmbedder</a>.</p>

<pre><code>$ cpanm Mojolicious DBM::Deep LinkEmbedder
</code></pre>

<h2>Layouts</h2>

<p>Most web sites have a defined style and layout between pages.
A header bar, a sidebar for navigation, a footer.
The content of each might change slightly between pages but the similarity is remarkable.</p>

<p>Do the developers copy and paste this logic between pages?
Certainly not!</p>

<p>The first tool of the trade is a layout template.
This is a template that will contain the results of rendering some inner template.
This will usually contain the outermost tags, like <code>&lt;html&gt;</code>, <code>&lt;head&gt;</code>, and <code>&lt;body&gt;</code>.
They will likely also establish any structure that exists on all of the pages, like navigation and sidebar sections.</p>

devdata/https_mojolicious.io_blog_2017_12_17_day-17-the-wishlist-app  view on Meta::CPAN

<p>Let&#39;s look at the layout that our wishlist application</p>

<pre><code class="hljs">&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;meta charset=&quot;<span class="hljs-string">utf-8</span>&quot;&gt;
    &lt;meta http-equiv=&quot;<span class="hljs-string">X-UA-Compatible</span>&quot; content=&quot;<span class="hljs-string">IE=edge</span>&quot;&gt;
    &lt;meta name=&quot;<span class="hljs-string">viewport</span>&quot; content=&quot;<span class="hljs-string">width=device-width, initial-scale=1</span>&quot;&gt;

    &lt;title&gt;&lt;%= title %&gt;&lt;/title&gt;
    &lt;<span class="hljs-function">link</span> rel=&quot;<span class="hljs-string">stylesheet</span>&quot; type=&quot;<span class="hljs-string">text/css</span>&quot; href=&quot;<span class="hljs-string">//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/...
    %= content &#39;<span class="hljs-string">head</span>&#39;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;nav class=&quot;<span class="hljs-string">navbar navbar-default</span>&quot;&gt;
      &lt;div class=&quot;<span class="hljs-string">container</span>&quot;&gt;
        &lt;div class=&quot;<span class="hljs-string">navbar-header</span>&quot;&gt;
          &lt;a class=&quot;<span class="hljs-string">navbar-brand</span>&quot; href=&quot;<span class="hljs-string">/</span>&quot;&gt;
            Mojo Wishlist
          &lt;/a&gt;
        &lt;/div&gt;

devdata/https_mojolicious.io_blog_2017_12_17_day-17-the-wishlist-app  view on Meta::CPAN

<p>Here you can see that I include the <a href="https://getbootstrap.com/docs/3.3">Boostrap</a>.
You can also see a few bits of templating.
The first is that I use a <code>&lt;title&gt;</code> tag with the content <code>&lt;%= title %&gt;</code>.
This is a shortcut helper to get the value of the <a href="http://mojolicious.org/perldoc/Mojolicious/Plugin/DefaultHelpers#title"><code>title</code> key of the stash</a>.
Well shall see in a moment how this value gets set.</p>

<p>The remaining template portions are each getting the contents of named content buffers.
While I establish five such inclusions, I will only actually use three: <code>head</code>, <code>sidebar</code> and the default unnamed buffer.</p>

<p>With the possible exception of <code>sidebar</code>, buffers like these are useful in almost all application layouts.
The <code>head</code> and <code>end</code> buffers let you add contents to those locations, especially useful to include extra stylesheets and javascript respectively.
The <code>footer</code> buffer would allow additions to be placed at the end of the body but before any javascript inclusions.</p>

<p>It is interesting to note that if we rendered this template directly, those buffers would all be empty.
Therefore the content put into them must come from someplace else.</p>

<h2>A Primary Template</h2>

<p>I mentioned before the the layout was like a container that would hold some inner content.
Let&#39;s consider the simplest such case.</p>

devdata/https_mojolicious.io_blog_2017_12_17_day-17-the-wishlist-app  view on Meta::CPAN

<code>GET</code> requests are safe and will not change data, in this case the request triggers LinkEmbedder to fetch the information which is then displayed.</p>

<h4>Adding Items</h4>

<p><img alt="Screen shot of the add items page" src="add.png"></p>

<pre><code class="hljs">% title &#39;<span class="hljs-string">Add an item</span>&#39;;
% layout &#39;<span class="hljs-string">default</span>&#39;;

% content_for &#39;<span class="hljs-string">head</span>&#39; =&gt; <span class="hljs-keyword">begin</span>
  &lt;style&gt;
    <span class="hljs-comment">#item-detail img {</span><span class="hljs-comment">
</span>      max-width: 40%;
      float: left;
      margin: <span class="hljs-number">20</span>px;
    }
  &lt;/style&gt;
% <span class="hljs-keyword">end</span>

% content_for &#39;<span class="hljs-string">sidebar</span>&#39; =&gt; <span class="hljs-keyword">begin</span>
  &lt;div class=&quot;<span class="hljs-string">panel panel-default</span>&quot;&gt;
    &lt;div class=&quot;<span class="hljs-string">panel-heading</span>&quot;&gt;
      Add this item to your list?
    &lt;/div&gt;
    &lt;div class=&quot;<span class="hljs-string">panel-body</span>&quot;&gt;
      %= form_for &#39;<span class="hljs-string">add</span>&#39; =&gt; (method =&gt; &#39;<span class="hljs-string">POST</span>&#39;) =&gt; <span class="hljs-keyword">begin</span>
        %= hidden_field title =&gt; <span class="hljs-type">$link</span>-&gt;<span class="hljs-type">title</span><span class="hljs-type">

devdata/https_mojolicious.io_blog_2017_12_17_day-17-the-wishlist-app  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_18_day-18-the-wishlist-model  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/18/day-18-the-wishlist-model/" property="og:url">
  <meta content="Day 18: The Wishlist Model" property="og:title">
    <meta content="Building a proper model layer for the Wishlist app." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/18/day-18-the-wishlist-model/van_gogh_still_life.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 18: The Wishlist Model - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_18_day-18-the-wishlist-model  view on Meta::CPAN

Unlike with DBM::Deep we now also have to tell it where to find the migrations file.
To target these files we use the application&#39;s <a href="http://mojolicious.org/perldoc/Mojolicious#home"><code>home</code></a> object and <a href="http://mojolicious.org/perldoc/Mojo/File">Mojo::File</a> which is a topic for another day.</p>

<p>The application&#39;s <code>startup</code> method establishes a <code>model</code> helper which creates an instance of Wishlist::Model and attaches the Mojo::SQLite instance to it.
This is a very important concept because this very thin helper is what ties the model into the application as a whole.
Any part of the application that needs data from the model ends up using this helper.</p>

<p>For example, there are still the <code>user</code> and <code>users</code> helpers that behave just as their counterparts from yesterday.
This time however they work via the model to do their business.</p>

<p>Finally the routes use the Full app declaration style but they do basically the same thing as before once they dispatch to their controllers.</p>

<h2>The List Controller</h2>

<p>And speaking of controllers, let&#39;s see what a controller looks like now.
This is the List controller that handles most of the pages.</p>

<pre><code class="hljs"><span class="hljs-keyword">package</span> <span class="hljs-function">Wishlist::Controller</span>::<span class="hljs-function">List</span>;
<span class="hljs-keyword">use</span> <span class="hljs-function">Mojo::Base</span> &#39;<span class="hljs-string">Mojolicious::Controller</span>&#39;;

<span class="hljs-keyword">sub </span><span class="hljs-function">show_add</span> {

devdata/https_mojolicious.io_blog_2017_12_18_day-18-the-wishlist-model  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_19_day-19-make-your-app-installable  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/19/day-19-make-your-app-installable/" property="og:url">
  <meta content="Day 19: Make Your App Installable" property="og:title">
    <meta content="A few simple changes to make your application installable." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/19/day-19-make-your-app-installable/container_ship.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 19: Make Your App Installable - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_19_day-19-make-your-app-installable  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_20_day-20-practical-testing  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/20/day-20-practical-testing/" property="og:url">
  <meta content="Day 20: Practical Testing" property="og:title">
    <meta content="Some practical tricks for testing real-world applications." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/20/day-20-practical-testing/lava.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 20: Practical Testing - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_20_day-20-practical-testing  view on Meta::CPAN

Also this will only isolate the tests per-name, here <code>test_one</code>.
Therefore I recommend you name the path for the name of the test file, this should be both descriptive and unique.
And you have to clean up after yourself otherwise the next time the test is run it will be affected by the remaining data.</p>

<h2>Mocking Helpers</h2>

<p>If you have done any testing you&#39;ve probably dealt with mocking, but if you haven&#39;t, mocking is the act of replacing functionality from essentially unrelated code with test-specific code.
Doing this lets you test one section of code (called a unit) in isolation from others.</p>

<p>Everyone has their favorite mock library.
There are so many tastes and styles that in the end Many people make their own, including <a href="https://metacpan.org/pod/Mock::MonkeyPatch">yours truly</a>.
Of course you can use those libraries in Mojolicious when appropriate.
As I mentioned before you can also mock out services by attaching tiny Mojolicious applications to a UserAgent&#39;s <a href="http://mojolicious.org/perldoc/Mojo/UserAgent#server"><code>server</code></a> attribute or making an entire external service...

<p>In some cases however, the natural place to mock is in the place of a helper.
When you think about it, this is actually rather obvious since helpers are often the glue used in Mojolicious applications to combine disparate code, like models or in this case the <a href="https://github.com/jberger/Wishlist/blob/blog_post/practica...

<p>To test this we could actually do any of the mentioned options from mocking <a href="https://metacpan.org/pod/LinkEmbedder#get">LinkEmbedder-&gt;get</a> to attaching a mock service.
That said it is sufficient here to just replace the helper, which is as easy as assigning over it.</p>

<pre><code class="hljs"><span class="hljs-keyword">use</span> <span class="hljs-function">Mojo::Base</span> -strict;

devdata/https_mojolicious.io_blog_2017_12_20_day-20-practical-testing  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_21_day-21-virtually-a-lumberjack  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@CandyAngel_Nay" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/21/day-21-virtually-a-lumberjack/" property="og:url">
  <meta content="Day 21: Virtual(ly a) Lumberjack" property="og:title">
    <meta content="Using the Mojo toolkit to help reverse-engineer HMDs" property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/21/day-21-virtually-a-lumberjack/vr.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 21: Virtual(ly a) Lumberjack - mojolicious.io</title>
  <meta content="CandyAngel" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_21_day-21-virtually-a-lumberjack  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_22_day-22-how-to-build-a-public-rest-api  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@jhthorsen" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/22/day-22-how-to-build-a-public-rest-api/" property="og:url">
  <meta content="Day 22: A RESTful API with OpenAPI" property="og:title">
    <meta content="How to build a public REST API for your Mojolicious application" property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/22/day-22-how-to-build-a-public-rest-api/hammock_beach.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 22: A RESTful API with OpenAPI - mojolicious.io</title>
  <meta content="Jan Henning Thorsen" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_22_day-22-how-to-build-a-public-rest-api  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_23_day-23-one-liners-for-fun-and-profit  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/23/day-23-one-liners-for-fun-and-profit/" property="og:url">
  <meta content="Day 23: One-Liners for Fun and Profit" property="og:title">
    <meta content="For those times when you just need a quick check or example." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/23/day-23-one-liners-for-fun-and-profit/chess.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 23: One-Liners for Fun and Profit - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_23_day-23-one-liners-for-fun-and-profit  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>

devdata/https_mojolicious.io_blog_2017_12_24_day-24-release-and-wrap-up  view on Meta::CPAN

<!--[if lt IE 8 ]><html class="no-js ie ie7" lang="en"> <![endif]-->
<!--[if IE 8 ]><html class="no-js ie ie8" lang="en"> <![endif]-->
<!--[if (gte IE 8)|!(IE)]><!--><html class="no-js" lang="en"> <!--<![endif]-->
<head>

  <meta charset="utf-8">
  <meta content="" name="description">

  <meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">

  <link href="/theme/css/default.css" rel="stylesheet">
  <link href="/theme/css/layout.css" rel="stylesheet">
  <link href="/theme/css/media-queries.css" rel="stylesheet">
  <link href="/theme/css/statocles.css" rel="stylesheet">

  <!-- twitter and opengraph -->
  <meta content="summary" name="twitter:card">
      <meta content="@joelaberger" name="twitter:creator">
  <meta content="https://mojolicious.io/blog/2017/12/24/day-24-release-and-wrap-up/" property="og:url">
  <meta content="Day 24: Release and Wrap-Up" property="og:title">
    <meta content="The Wishlist app is released to CPAN and a wrap-up for the advent calendar." property="og:description">
    <meta content="https://mojolicious.io/blog/2017/12/24/day-24-release-and-wrap-up/tree_unfocused.jpg" property="og:image">
    <meta content="summary_large_image" name="twitter:card">

  <script src="/theme/js/modernizr.js"></script>

      <link href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/sunburst.min.css" rel="stylesheet">

  <title>Day 24: Release and Wrap-Up - mojolicious.io</title>
  <meta content="Joel Berger" name="author">
  <meta content="Statocles 0.093" name="generator">
  <link href="/static/favicon.ico" rel="shortcut icon">
  
  
</head>

<body>

   <header>

      <div class="row">

         <div class="twelve columns">

            <div class="logo">
               <a href="/index.html">
                 <h3 style="color: #fff">mojolicious.io</h3>
               </a>
            </div>

            <nav id="nav-wrap">

              <a class="mobile-btn" href="#nav-wrap" title="Show navigation">Show navigation</a>
              <a class="mobile-btn" href="#" title="Hide navigation">Hide navigation</a>

               <ul class="nav" id="nav">
                 <!-- li.current is given a different styling -->

devdata/https_mojolicious.io_blog_2017_12_24_day-24-release-and-wrap-up  view on Meta::CPAN


            <ul class="footer-social">
               <li><a href="https://github.com/mojolicious/mojo"><i class="fa fa-github"></i></a></li>
               <li><a href="https://twitter.com/search?q=%23mojolicious"><i class="fa fa-twitter"></i></a></li>
               <li><a href="/blog/index.rss"><i class="fa fa-rss"></i></a></li>
            </ul>

            <ul class="copyright">
                 <li>Copyright © 2017 Joel Berger</li>
                <li><a href="https://github.com/MojoliciousDotIO/mojolicious.io">Contribute to this site on Github</a></li>
               <li>Design by <a href="http://www.styleshout.com/">Styleshout</a></li>
               <li>Made with <a href="http://preaction.me/statocles">Statocles</a></li>
               <li>Powered by <a href="http://www.perl.org">Perl</a></li>
            </ul>

         </div>

         <div id="go-top" style="display: block;"><a href="#" title="Back to Top">Go To Top</a></div>

      </div>

   </footer>

   <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
   <script>window.jQuery || document.write('<script src="/theme/js/jquery-1.10.2.min.js"><\/script>')</script>
   <script src="/theme/js/jquery-migrate-1.2.1.min.js" type="text/javascript"></script>

   <script src="/theme/js/jquery.flexslider.js"></script>



( run in 0.703 second using v1.01-cache-2.11-cpan-49f99fa48dc )