<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <meta content="text/html; charset=ISO-8859-1"
      http-equiv="Content-Type">
    <title></title>
  </head>
  <body bgcolor="#ffffff" text="#000000">
    Eu acho que está havendo uma pequena confusão aqui. O Catalyst não
    foi feito para rodar um Hello World. Foi feito para estimular boas
    práticas de desenvolvimento de webapps, e ajudar o desenvolvedor a
    deixar seu código com uma fácil manutenção. Por que você iria criar
    um modelo, uma view, e um controller separados apenas pra rodar um
    Hello World? Se sua aplicação é tão simples assim, talvez você não
    devesse usar Catalyst mesmo (Eden, não me mate!!).<br>
    <br>
<a class="moz-txt-link-freetext" href="http://www.shadowcat.co.uk/archive/conference-video/nwepm/catalyst-dbic/">http://www.shadowcat.co.uk/archive/conference-video/nwepm/catalyst-dbic/</a><br>
    <br>
    Catalyst não tem screencasts populares de se fazer blogs em 10
    minutos, mas com ele você produz sistemas que você pode voltar
    meses, anos depois, e vai conseguir manter com facilidade.<br>
    <br>
    Se simplicidade é menos linhas código, experimente estes exemplos:<br>
    <br>
    <?php echo "Hello world" ?><br>
    <br>
    use CGI;<br>
    print "Content-type: text/html\n\nHello world";<br>
    <br>
    Funcionam perfeitamente também.<br>
    <br>
    O código que você colou de sessões no Catalyst é bem diferente do
    exemplo que você deu do Mojolicious. Faz coisas diferentes, e contém
    um monte de comentários, por isso é maior. Só porque o código de
    exemplo é mais amplo não significa que o resultado final é mais
    complexo.<br>
    <br>
    Na minha opinião, tudo se resume a usar a ferramenta correta para o
    projeto, cada uma tem prós e contras. E o resto é apenas
    preferência. TIMTOWTDI. Não sei por que tanta briga.<br>
    <br>
    Abraços!<br>
    André<br>
    <br>
    On 07/13/2011 06:48 AM, Nelson Ferraz wrote:
    <blockquote
cite="mid:CAG+zsv17fG9Fv4iv4QoVB2nZs=pN-hU6vFJO0cd_RWzxV6vUaQ@mail.gmail.com"
      type="cite">
      <meta http-equiv="Context-Type" content="text/html;
        charset=ISO-8859-1">
      <div>Simplicidade é algo difícil de definir, mas todo mundo
        consegue identificar.</div>
      <br>
      Vamos começar com um exemplo que eu considero simples:<br>
      <br>
      <br>
             use Mojolicious::Lite;<br>
      <br>
             get '/' => sub {<br>
                 my $self = shift;<br>
                 my $name = $self->param('name') || 'world';<br>
                 $self->render( text => "Hello, $name" );<br>
             };<br>
      <br>
             app->start(); <br>
      <br>
      <div><br>
        <br>
        Esta é uma aplicação mínima, porém completa. Você pode
        executá-la e testá-la em <a moz-do-not-send="true"
          href="http://localhost:3000">http://localhost:3000</a>.<br>
        <br>
        Agora, vamos dizer que eu queira usa um template:<br>
        <br>
        <br>
               use Mojolicious::Lite;<br>
        <br>
               get '/' => sub {<br>
                   my $self = shift;<br>
                   my $name = $self->param('name') || 'world';<br>
                   <b>$self->stash( name => $name )</b>;<br>
               } <b>=> 'index';</b><br>
        <br>
               app->start();<br>
        <br>
        <b>        __DATA__<br>
                 @@ index.html.ep<br>
                 <h1>Hello, <%= $name %>!</h1></b> <br>
        <br>
        <br>
      </div>
      <div><br>
        (Sob o ponto de vista didático é conveniene mostrar o template
        junto com o código, para que as pessoas possam copiar e
        colar; na prática eu criaria um arquivo dentro de um diretório
        chamado "templates", que seria reconhecido automaticamente.)</div>
      <div><br>
        E se eu quiser usar um arquivo de configuração? Basta criar um
        arquivo chamado "app.conf". (Onde "app" é igual ao nome da
        aplicação). Exemplo:<br>
        <br>
        <br>
               {<br>
                   default_name => 'world'<br>
               }<br>
        <br>
        <br>
      </div>
      <div><br>
        Para usar o arquivo de configuração:<br>
        <br>
        <br>
        <br>
               use Mojolicious::Lite;<br>
        <br>
        <b>        plugin 'config';<br>
        </b><br>
               get '/' => sub {<br>
                   my $self = shift;<br>
                   my $name = $self->param('name') || <b>$self->config('default_name')</b>;<br>
                   $self->stash( name => $name );<br>
               } => 'index';<br>
        <br>
               app->start();<br>
        <br>
               __DATA__<br>
               @@ index.html.ep<br>
               <h1>Hello, <%= $name %>!</h1><br>
        <br>
        <br>
      </div>
      <div><br>
      </div>
      <div>Se você quiser acessar a variável de configuração a partir do
        template:
        <div><br>
        </div>
        <div><br>
        </div>
        <div> <span>       use Mojolicious::Lite;<br>
            <br>
                   plugin 'config';<br>
            <br>
                   get '/' => sub {<br>
                       my $self = shift;<br>
                       my $name = $self->param('name');<br>
                       $self->stash( name => $name );<br>
                   } => 'index';<br>
            <br>
                   app->start();<br>
            <br>
                   __DATA__<br>
                   @@ index.html.ep<br>
                   <h1>Hello, <%= $name <b>||
              config('default_name')</b> %>!</h1><br>
          </span></div>
        <div> <br>
        </div>
        <div><br>
        </div>
        <div><br>
        </div>
        <div>Vamos, agora, guardar o nome em uma variável de sessão:</div>
        <div><br>
        </div>
        <div><br>
        </div>
        <div>
          <div>         use Mojolicious::Lite; </div>
          <div> <br>
          </div>
          <div>         plugin 'config'; </div>
          <div>      </div>
          <div>         get '/' => sub { </div>
          <div>             my $self = shift; </div>
          <div> <br>
          </div>
          <div>             my $name = $self->param('name') </div>
          <div> <b>                    || $self->session('name')</b>
          </div>
          <div>                     || $self->config('default_name');
          </div>
          <div> <br>
          </div>
          <div> <b>            $self->session( name => $name );</b>
          </div>
          <div> <br>
          </div>
          <div>             $self->stash( name => $name ); </div>
          <div>         } => 'index'; </div>
          <div>             app->start();     </div>
          <div>         __DATA__ </div>
          <div>         @@ index.html.ep </div>
          <div>         <h1>Hello, <%= $name %>!</h1>
          </div>
        </div>
        <div><br>
        </div>
        <div><br>
        </div>
        <div><br>
        </div>
        <div>Aí está: um exemplo completo, com template, arquivo de
          configuração externo, e sessão.</div>
        <div><br>
        </div>
        <div>Compare com a página de documentação do
          Catalyst::Plugin::Session:</div>
        <div><br>
        </div>
        <div> <span>
            <pre>    <span># To get sessions to "just work", all you need to do is use these plugins:</span>

    <span>use</span> Catalyst <span>qw</span><span>/</span>
      Session
      Session<span>::</span>Store<span>::</span>FastMmap
      Session<span>::</span>State<span>::</span>Cookie
      <span>/;</span>

    <span># you can replace Store::FastMmap with Store::File - both have sensible</span>
    <span># default configurations (see their docs for details)</span>

    <span># more complicated backends are available for other scenarios (DBI storage,</span>
    <span># etc)</span>


    <span># after you've loaded the plugins you can save session data</span>
    <span># For example, if you are writing a shopping cart, it could be implemented</span>
    <span># like this:</span>

    <span>sub</span> add_item <span>:</span> Local <span>{</span>
        <span>my</span> <span>(</span> <span>$self</span><span>,</span> <span>$c</span> <span>)</span> <span>=</span> <span>@_</span><span>;</span>

        <span>my</span> <span>$item_id</span> <span>=</span> <span>$c</span><span>-></span>req<span>-></span><span>param</span><span>(</span><span>"item"</span><span>);</span>

        <span># $c->session is a hash ref, a bit like $c->stash</span>
        <span># the difference is that it' preserved across requests</span>

        <span>push</span> @<span>{</span> <span>$c</span><span>-></span>session<span>-></span><span>{</span>items<span>}</span> <span>}</span><span>,</span> <span>$item_id</span><span>;</span>

        <span>$c</span><span>-></span><span>forward</span><span>(</span><span>"MyView"</span><span>);</span>
    <span>}</span>

    <span>sub</span> display_items <span>:</span> Local <span>{</span>
        <span>my</span> <span>(</span> <span>$self</span><span>,</span> <span>$c</span> <span>)</span> <span>=</span> <span>@_</span><span>;</span>

        <span># values in $c->session are restored</span>
        <span>$c</span><span>-></span>stash<span>-></span><span>{</span>items_to_display<span>}</span> <span>=</span>
          <span>[</span> <span>map</span> <span>{</span> MyModel<span>-></span><span>retrieve</span><span>(</span><span>$_</span><span>)</span> <span>}</span> @<span>{</span> <span>$c</span><span>-></span>session<span>-></span><span>{</span>items<span>}</span> <span>}</span> <span>];</span>

        <span>$c</span><span>-></span><span>forward</span><span>(</span><span>"MyView"</span><span>);</span>
    <span>}</span></pre>
          </span></div>
        <div><br>
        </div>
        <div>Este é o "problema de complexidade".</div>
        <div><br>
        </div>
        <div>Se o Catalyst::Lite puder reunir a simplicidade do
          Mojolicious com a solidez do Catalyst, creio que este será o
          melhor dos dois mundos.</div>
        <div><br>
        </div>
        <div>[]s</div>
        <div><br>
        </div>
        <div>Nelson</div>
        <div><br>
        </div>
      </div>
      <pre wrap="">
<fieldset class="mimeAttachmentHeader"></fieldset>
=begin disclaimer
   Sao Paulo Perl Mongers: <a class="moz-txt-link-freetext" href="http://sao-paulo.pm.org/">http://sao-paulo.pm.org/</a>
 SaoPaulo-pm mailing list: <a class="moz-txt-link-abbreviated" href="mailto:SaoPaulo-pm@pm.org">SaoPaulo-pm@pm.org</a>
 L<a class="moz-txt-link-rfc2396E" href="http://mail.pm.org/mailman/listinfo/saopaulo-pm"><http://mail.pm.org/mailman/listinfo/saopaulo-pm></a>
=end disclaimer
</pre>
    </blockquote>
    <br>
  </body>
</html>