Você pode mudar isso para Chained Action:<br><br><pre>sub index :Path :Args(0) {<br>        my ($self, $c) = @_;<br>        <br>        $c-&gt;res-&gt;redirect(<br>        $c-&gt;uri_for(<br>        $c-&gt;controller-&gt;action_for(&#39;list&#39;)<br>        )<br>
        );<br>}<br><br>sub root : Chained(&#39;base&#39;) Args(0) {<br>        my ($self, $c) = @_;<br>        $c-&gt;res-&gt;redirect(<br>        $c-&gt;uri_for(<br>        $c-&gt;controller-&gt;action_for(&#39;list&#39;)<br>        )<br>        );<br>}<br>    <br>
# Essa parte do Controller Telefone, pode ficar assim:    <br><br>- sub base :Chained(&#39;/&#39;) CaptureArgs(0) PathPart(&#39;telefone&#39;) {<br>+ sub base :Chained(&#39;/base&#39;) CaptureArgs(0) PathPart(&#39;telefone&#39;) {<br>
<br>Para isso preciso disso no Controller Root.pm, eu acho que assim fica mais &quot;extensivel&quot; sua agenda.<br><br>Root.pm<br><br>sub base : Chained(&#39;/&#39;) CaptureArgs(0) PathPart(&#39;&#39;) {}<br><br>sub root : Chained(&#39;base&#39;) PathPart(&#39;&#39;) Args(0){<br>
         my ($self, $c) = @_;<br>         # Quando o usuario acessar localhost:3000/ vai ser redirecionado para localhost:3000/telefone, pois é <br>         # a unica parte da agenda que está pronta <br>         $c-&gt;res-&gt;redirect(&#39;/telefone&#39;);<br>
}<br><br>Usando Chained Action a partir do Root.pm, você consegue controlar coisas desse tipo:<br><br>sub favicon : Chained(&#39;base&#39;) PathPart(&#39;favicon.ico&#39;) Args(0) {<br>          my ($self, $c) = @_;<br>          # coloque aqui o codigo para servir o favicon.ico de sua prefrencia<br>
}<br><br>sub error_404 : Chained(&#39;base&#39;) PathPart(&#39;&#39;) Args {<br>         my ($self, $c) = @_;<br>         $c-&gt;response-&gt;body( &#39;Page not found&#39; );<br>         $c-&gt;response-&gt;status(404);<br>
<br>     <br>}<br><br>O CODIGO ACIMA NÃO FOI TESTADO :)<br></pre><br><div class="gmail_quote">2009/2/4 Thiago Rondon <span dir="ltr">&lt;<a href="mailto:thiago@aware.com.br">thiago@aware.com.br</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
<br>
Espero continuações... oops, contribuições. :)<br>
<br>
-Thiago Rondon<br>
<br>
Blabos de Blebe escreveu:<div><div></div><div class="Wj3C7c"><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Muito bom. Gostei das explicações nos comentários. Vai ter<br>
continuação? Espero que sim.<br>
<br>
Parabéns<br>
<br>
2009/2/3 Daniel de Oliveira Mantovani &lt;<a href="mailto:daniel.oliveira.mantovani@gmail.com" target="_blank">daniel.oliveira.mantovani@gmail.com</a>&gt;:<br>
 &nbsp;<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Valeu Thiago!<br>
2009/2/3 Nelson Ferraz &lt;<a href="mailto:nferraz@gmail.com" target="_blank">nferraz@gmail.com</a>&gt;<br>
 &nbsp; &nbsp;<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Parece muito bom, Thiago! Obrigado pela contribuição!<br>
<br>
Por que não formata o documento em pod, e copia para o wiki? Aqui vai um<br>
começo:<br>
<br>
=head1 NOME<br>
<br>
Catalyst - O Elegante framework de programação Web em Perl.<br>
<br>
=head1 DESCRICAO<br>
<br>
Catalyst é um framework elegante de programação MVC para Web em Perl<br>
(ambos gratuitos e de código aberto). Este tutorial<br>
simples e talvez muito objetivo tem como missão facilitar o<br>
entedimento para os novos nesta ferramenta de forma pratica, não<br>
se prendendo muito a conceitos, motivos e paradigmas.<br>
<br>
=head1 INICIO<br>
<br>
=head2 Instalação do Catalyst.<br>
<br>
O Perl tem o CPAN, no qual é um repositorio farto de modulos e<br>
documentação, você pode utilizar o site <a href="http://search.cpan.org/" target="_blank">http://search.cpan.org/</a> para<br>
navegar por ele, e toda distribuição do Perl vem com um aplicativo<br>
chamado &quot;cpan&quot; para você poder instalar os modulos atravez da<br>
linha de comando.<br>
<br>
 &nbsp; $ export PERL_MM_USE_DEFAULT=1<br>
 &nbsp; $ cpan -i Task::Catalyst<br>
<br>
O Catalyst tem algumas dependencias, e por isto, além do pacote do<br>
Catalyst o &quot;cpan&quot; irá automaticamente instalar as suas dependencias,<br>
perceba que estamos utilizando o pacote Task::Catalyst, no qual contém<br>
uma serie de pacotes recomendadas para a utilização do Catalyst.<br>
<br>
DICA: Sete a variavel de ambiente PERL_MM_USE_DEFAULT=1 para o cpan<br>
não lhe questionar sobre as dependencias e demais perguntas, e<br>
instalar elas sem lhe perguntar.<br>
<br>
Pronto, a instalação esta concluida, agora estamos com o sistema apto<br>
para programar utilizando o framework de programação Catalyst.<br>
<br>
=head2 Iniciando o meu primeiro projeto.<br>
<br>
No pacote do Catalyst, vem acompanhando um aplicativo que facilita a<br>
nossa vida para montar o ambiente básico para iniciarmos o nosso<br>
projeto, chamado de &quot;catalyst.pl&quot;, para isto basta executar ele com o<br>
primeiro argumento sendo o nome do projeto.<br>
<br>
 &nbsp; $ catalyst.pl webapp<br>
 &nbsp; created &quot;webapp&quot;<br>
 &nbsp; created &quot;webapp/script&quot;<br>
 &nbsp; created &quot;webapp/lib&quot;<br>
 &nbsp; created &quot;webapp/root&quot;<br>
 &nbsp; created &quot;webapp/root/static&quot;<br>
 &nbsp; created &quot;webapp/root/static/images&quot;<br>
 &nbsp; created &quot;webapp/t&quot;<br>
 &nbsp; created &quot;webapp/lib/webapp&quot;<br>
 &nbsp; created &quot;webapp/lib/webapp/Model&quot;<br>
 &nbsp; created &quot;webapp/lib/webapp/View&quot;<br>
 &nbsp; created &quot;webapp/lib/webapp/Controller&quot;<br>
 &nbsp; created &quot;webapp/webapp.conf&quot;<br>
 &nbsp; created &quot;webapp/lib/<a href="http://webapp.pm" target="_blank">webapp.pm</a>&quot;<br>
 &nbsp; created &quot;webapp/lib/webapp/Controller/Root.pm&quot;<br>
 &nbsp; created &quot;webapp/README&quot;<br>
 &nbsp; created &quot;webapp/Changes&quot;<br>
 &nbsp; created &quot;webapp/t/01app.t&quot;<br>
 &nbsp; created &quot;webapp/t/02pod.t&quot;<br>
 &nbsp; created &quot;webapp/t/03podcoverage.t&quot;<br>
 &nbsp; created &quot;webapp/root/static/images/catalyst_logo.png&quot;<br>
 &nbsp; created &quot;webapp/root/static/images/btn_120x50_built.png&quot;<br>
 &nbsp; created &quot;webapp/root/static/images/btn_120x50_built_shadow.png&quot;<br>
 &nbsp; created &quot;webapp/root/static/images/btn_120x50_powered.png&quot;<br>
 &nbsp; created &quot;webapp/root/static/images/btn_120x50_powered_shadow.png&quot;<br>
 &nbsp; created &quot;webapp/root/static/images/btn_88x31_built.png&quot;<br>
 &nbsp; created &quot;webapp/root/static/images/btn_88x31_built_shadow.png&quot;<br>
 &nbsp; created &quot;webapp/root/static/images/btn_88x31_powered.png&quot;<br>
 &nbsp; created &quot;webapp/root/static/images/btn_88x31_powered_shadow.png&quot;<br>
 &nbsp; created &quot;webapp/root/favicon.ico&quot;<br>
 &nbsp; created &quot;webapp/Makefile.PL&quot;<br>
 &nbsp; created &quot;webapp/script/webapp_cgi.pl&quot;<br>
 &nbsp; created &quot;webapp/script/webapp_fastcgi.pl&quot;<br>
 &nbsp; created &quot;webapp/script/webapp_server.pl&quot;<br>
 &nbsp; created &quot;webapp/script/webapp_test.pl&quot;<br>
 &nbsp; created &quot;webapp/script/webapp_create.pl&quot;<br>
<br>
Pronto, agora estamos com nosso ambiente básico para começar a<br>
programar, vou explicar de forma rápida a estrutura<br>
de diretorios criada para você entender melhor:<br>
<br>
 &nbsp; $ ls webapp/<br>
 &nbsp; Changes &nbsp;lib/ &nbsp;Makefile.PL &nbsp;README &nbsp;root/ &nbsp;script/ &nbsp;t/ &nbsp;webapp.conf<br>
<br>
Veja, que temos quatro diretorios, que são eles:<br>
<br>
=over<br>
<br>
=item lib/<br>
<br>
Contém a parte da programação lógica, onde iremos escrever nossos<br>
modulos e códigos em Perl.<br>
<br>
=item root/<br>
<br>
Neste diretorio iremos colocar arquivos estáticos, como templates,<br>
javascript e css.<br>
<br>
=item script/<br>
<br>
Scripts para inicializar a nossa aplicação.<br>
<br>
=item t/<br>
<br>
Testes para nossa aplicação.<br>
<br>
=back<br>
<br>
Vamos falar um pouco do diretorio &quot;script/&quot;, nele você tem um script<br>
que usaremos muito neste tutorial, webapp_server.pl, no<br>
qual irá iniciar um servidor http na porta 3000 por padrão, para<br>
visualizarmos o nosso aplicativo:<br>
<br>
 &nbsp; $ script/webapp_server.pl<br>
<br>
Depois de executar ele, você já pode acessar o aplicativo pelo seu<br>
browser favorito, pelo endereço:<br>
<br>
L&lt;<a href="http://localhost:3000" target="_blank">http://localhost:3000</a>&gt;<br>
<br>
=head2 Entendendo um MVC (Model-View-Controller)<br>
<br>
MVC é um padrão de arquitetura de software, uma das maiores<br>
dificuldades do entendimento de um framework de programação<br>
web como o Catalyst para os iniciantes é justamente este conceito.<br>
<br>
Basicamente o significado deles é:<br>
<br>
=over<br>
<br>
=item Model:<br>
<br>
São as informações utilizadas pelo aplicativo, no qual este modelo<br>
pode ser um banco de dados, um arquivo texto e etc.<br>
<br>
=item Controller:<br>
<br>
Lógica do nosso aplicativo, onde podemos por exemplo alterar as<br>
informações (Model), filtrar e etc.<br>
<br>
=item View:<br>
<br>
Renderizar o Model e o Controller para o usuário, ou seja como o<br>
aplicativo será apresentado.<br>
<br>
=back<br>
<br>
Esta é uma forma rápida de apresentar os três componentes do MVC,<br>
sabendo disto, vamos começar a produzir nosso aplicativo.<br>
<br>
=head2 Nosso projeto: Agenda telefonica<br>
<br>
Vamos começar a estudar o nosso aplicativo, ele irá gerenciar uma<br>
lista de telefones, no qual iremos efetuar um simples &quot;CRUD&quot;<br>
(Create-Remove-Update-Destroy), no qual iremos permitir efetuar a<br>
criação, remover, atualizar e apagar dados de nossa lista.<br>
<br>
Vamos projetar nossa agenda telefonica, utilizando o MVC da seguinte da<br>
forma:<br>
<br>
=over<br>
<br>
=item Model:<br>
<br>
Iremos utilizar o MySQL, porém para efetuar a conectividade com o<br>
banco de dados, iremos utilizar um driver do DBI, no<br>
qual o MySQL e tantos outros ele suporta, e é interessante além de<br>
utilizar o driver de comunicação com o banco de dados, algum<br>
ORM (<a href="http://en.wikipedia.org/wiki/Object-relational_mapping" target="_blank">http://en.wikipedia.org/wiki/Object-relational_mapping</a>) para<br>
facilitar a interface com o DB, existem alguns disponiveis como<br>
por exemplo o Class::DBI ou DBIx::Class para evitar que você escreva<br>
SQL no teu código, evitar alguns bugs e trazer agilidade no<br>
desenvolvimento, no nosso caso iremos utilizar o DBIx::Class.<br>
<br>
=item View:<br>
<br>
Iremos utilizar o HTML como formato de apresentação para nossos<br>
usuarios, portanto teremos que carregar o modulo que<br>
cuidará de manipular os dados que iremos jogar em nosso arquivo de<br>
template, existem alguns modulos disponiveis como o<br>
HTML::Manson ou Template::Toolkit), iremos utilizar neste caso o<br>
Template::Toolkit.<br>
<br>
=item Controller:<br>
<br>
Aqui é o lugar onde iremos programar, captar os dados no Model e<br>
&quot;espirrar&quot; para a View, entre outras.<br>
<br>
=back<br>
<br>
=head2 Começando pelo Model.<br>
<br>
Bem, já dissemos que iremos utilizar o MySQL como banco de dados, e<br>
também já explicamos por que iremos utilizar o DBIx::Class.<br>
<br>
Precisamos instalar ele:<br>
<br>
 &nbsp; $ cpan -i DBIx::Class<br>
<br>
Certo, agora temos tudo o que precisamos para trabalhar com o nosso<br>
Model. Neste tutorial eu vou utilizar o exemplo de criar a<br>
tabela direto pelo client do MySQL, e depois ler elas pelo DBIx::Class.<br>
<br>
 &nbsp; mysql&gt; create database webapp<br>
 &nbsp; mysql&gt; grant all on webapp.* to webapp@localhost identified by<br>
&#39;webapp&#39;;<br>
 &nbsp; mysql&gt; flush privileges;<br>
 &nbsp; mysql&gt; create table telefones (<br>
 &nbsp; &nbsp; &nbsp; id int not null auto_increment,<br>
 &nbsp; &nbsp; &nbsp; nome varchar(255),<br>
 &nbsp; &nbsp; &nbsp; telefone varchar(255),<br>
 &nbsp; &nbsp; &nbsp; primary key(id));<br>
<br>
Criado a nosso database e nossa tabela, agora vamos para &quot;importar&quot;<br>
nosso banco de dados para o DBIx::Class, eu não irei me<br>
aprofundar no DBIx::Class neste tutorial, pois não é o objetivo dele.<br>
<br>
Para importarmos este database para os schemas que o DBIx::Class<br>
utiliza, iremos executar um dos scripts facilitadores do diretorio<br>
scripts/ que se chama &quot;webapp_create.pl&quot; no qual facilita algumas<br>
tarefas como esta, a sintaxe utilizada é auto-explicativa, é<br>
basicamente:<br>
<br>
 &nbsp; # script/webapp_create.pl model DB DBIC::Schema webapp::Schema<br>
create=static dbi:mysql:dbname=webapp webapp webapp<br>
 &nbsp; exists &quot;/home/thiago/webapp/script/../lib/webapp/Model&quot;<br>
 &nbsp; exists &quot;/home/thiago/webapp/script/../t&quot;<br>
 &nbsp; Dumping manual schema for webapp::Schema to directory<br>
/home/thiago/webapp/script/../lib ...<br>
 &nbsp; Schema dump completed.<br>
 &nbsp; created &quot;/home/thiago/webapp/script/../lib/webapp/Model/DB.pm&quot;<br>
 &nbsp; created &quot;/home/thiago/webapp/script/../t/model_DB.t&quot;<br>
<br>
Vejamos os argumentos deste script:<br>
<br>
=over<br>
<br>
=item model<br>
<br>
Estamos criando um model para o script webapp_create.pl<br>
<br>
=item DB<br>
<br>
O nome criado para este modem será DB (vide lib/webapp/Model/DB.pm)<br>
<br>
=item DBIC::Schema<br>
<br>
Nome do helper para criar o Schema para o DBIx::Class<br>
<br>
=item create=static<br>
<br>
Significa que o schema será estatico, ou seja, a toda alteração nas<br>
tabelas, você precisa atualizar nos arquivos criados para o schema.<br>
<br>
=item dbname<br>
<br>
Nome do database no MySQL.<br>
<br>
=item webapp<br>
<br>
Usuario para se conectar no banco.<br>
<br>
=item webapp<br>
<br>
Senha para se conectar no banco.<br>
<br>
=back<br>
<br>
Agora, de uma lida nos arquivos criados em lib/webapp/Schema/* e<br>
lib/webapp/Model/*<br>
<br>
Pronto, já temos o nosso Model pronto para o nosso aplicativo.<br>
<br>
=head2 View - Template Toolkit.<br>
<br>
Iremos utilizar neste exemplo a Template::Toolkit, iremos utilizar um<br>
helper da mesma maneira que<br>
usamos para o banco de dados:<br>
<br>
 &nbsp; # script/webapp_create.pl view TT TT<br>
 &nbsp; exists &quot;/home/thiago/webapp/script/../lib/webapp/View&quot;<br>
 &nbsp; exists &quot;/home/thiago/webapp/script/../t&quot;<br>
 &nbsp; created &quot;/home/thiago/webapp/script/../lib/webapp/View/TT.pm&quot;<br>
 &nbsp; created &quot;/home/thiago/webapp/script/../t/view_TT.t&quot;<br>
<br>
Pronto, o helper já criou os arquivos necessarios para utilizarmos a<br>
Template Toolkit em nosso projeto.<br>
<br>
=head2 Controller - Agora sim, programando!<br>
<br>
Estamos na melhor parte, é onde tudo acontece, iremos criar 4 actions,<br>
para criar, remover, listar e editar.<br>
<br>
Eu irei colocar o código que utilizei, e com ele comentado explicando<br>
passo-a-passo do que estou<br>
fazendo nele. Não irei utilizar nenhum helper ou facilitador nesta<br>
parte, pois acredito que a melhor maneira<br>
de se desenvolver o Controller é na &#39;unha&#39;.<br>
<br>
Iremos criar um arquivo lib/webapp/Controller/<a href="http://telefone.pm" target="_blank">telefone.pm</a>, no qual ele<br>
irá representar na URI &quot;/telefone&quot;.<br>
<br>
Caso queira baixar todos os arquivos, clique aqui.<br>
<br>
 &nbsp; package webapp::Controller::telefone;<br>
<br>
 &nbsp; use strict;<br>
 &nbsp; use warnings;<br>
 &nbsp; use parent &#39;Catalyst::Controller&#39;;<br>
<br>
 &nbsp; # Nos estamos utilizando um mecanismo muito interessante neste<br>
 &nbsp; # exemplo, que recomendo a utilizacao, o Chained.<br>
 &nbsp; # Não iremos entrar discutir sobre ele, porem ele ajuda<br>
 &nbsp; # manusearmos os argumentos passados pela URI.<br>
 &nbsp; # Por tanto, vamos criar uma rotina &quot;base&quot; no qual todas as<br>
 &nbsp; # requisições passaram por ela (Chained()).<br>
 &nbsp; #<br>
<a href="http://search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/DispatchType/Chained.pm" target="_blank">search.cpan.org/dist/Catalyst-Runtime/lib/Catalyst/DispatchType/Chained.pm</a><br>
<br>
 &nbsp; sub base :Chained(&#39;/&#39;) CaptureArgs(0) PathPart(&#39;telefone&#39;) {<br>
 &nbsp; &nbsp; &nbsp; my ($self, $c) = @_;<br>
<br>
 &nbsp; &nbsp; &nbsp; # stash é o local onde iremos colocar informações para compartilhar<br>
 &nbsp; &nbsp; &nbsp; # com outras partes do nosso aplicativo, para cada requisição o<br>
stash<br>
 &nbsp; &nbsp; &nbsp; # tem uma vida.<br>
 &nbsp; &nbsp; &nbsp; # No caso, abaixo estamos atribuindo ao &quot;collection&quot; no stash o<br>
nosso<br>
 &nbsp; &nbsp; &nbsp; # model &quot;DB::telefones&quot;, que corresponde a nossa tabela telefones<br>
que<br>
 &nbsp; &nbsp; &nbsp; # criamos no MySQL.<br>
<br>
 &nbsp; &nbsp; &nbsp; $c-&gt;stash-&gt;{collection} = $c-&gt;model(&#39;DB::telefones&#39;);<br>
 &nbsp; }<br>
<br>
<br>
 &nbsp; # Veja, aqui estamos criando uma URI list/, no qual ela esta<br>
vinculada a nossa<br>
 &nbsp; # função base, criada anteriormente (Chained(&#39;base&#39;)),<br>
 &nbsp; #<br>
 &nbsp; # Ou seja, para chamar a URL, <a href="http://localhost:3000/telefone/list" target="_blank">http://localhost:3000/telefone/list</a>,<br>
primeiramente<br>
 &nbsp; # ele vai passar na base e depois na list. (* E por último, neste<br>
nosso exemplo<br>
 &nbsp; # na action end do Root.pm, no qual nem iremos comentar neste<br>
tutorial).<br>
 &nbsp; #<br>
 &nbsp; # Veja que estamos dizendo Args(0), isto significa que não preciso de<br>
nenhum<br>
 &nbsp; # elemento extra na minha URI, sempre que esta action for requisitada,<br>
será<br>
 &nbsp; # /telefone/list<br>
<br>
 &nbsp; sub list :Chained(&#39;base&#39;) Args(0) {<br>
 &nbsp; &nbsp; &nbsp; my ($self, $c) = @_;<br>
<br>
 &nbsp; &nbsp; &nbsp; # &quot;req&quot; ou &quot;request&quot; são as informações que estão no request da<br>
 &nbsp; &nbsp; &nbsp; # requisição, e no qual temos o metodo param que retorna o valor<br>
 &nbsp; &nbsp; &nbsp; # do atributo que gostariamos.<br>
 &nbsp; &nbsp; &nbsp; my $key = $c-&gt;req-&gt;param(&#39;key&#39;) || &quot;&quot;;<br>
<br>
 &nbsp; &nbsp; &nbsp; # Aham, aqui estamos utilizando o DBIx:Class, repare que não iremos<br>
 &nbsp; &nbsp; &nbsp; # escrever nenhum um código de SQL aqui, veja abaixo que iremos<br>
 &nbsp; &nbsp; &nbsp; # utilizar uma função search_like(), no qual iremos procurar pelo<br>
 &nbsp; &nbsp; &nbsp; # elemento $key nos dois campos (nome, telefone), estou usando o<br>
 &nbsp; &nbsp; &nbsp; # $key, caso o usuario queira procurar por alguma palavra chave.<br>
 &nbsp; &nbsp; &nbsp; my $items = $c-&gt;stash-&gt;{collection}-&gt;search_like({<br>
 &nbsp; &nbsp; &nbsp; nome =&gt; &quot;\%$key\%&quot;,<br>
 &nbsp; &nbsp; &nbsp; telefone =&gt; &quot;\%$key\%&quot;<br>
 &nbsp; &nbsp; &nbsp; });<br>
<br>
 &nbsp; &nbsp; &nbsp; # Aqui estou colocando no stash o key, para mostrar na View por<br>
qual<br>
 &nbsp; &nbsp; &nbsp; # palavra o usuario esta procurando, e o items encontrados.<br>
 &nbsp; &nbsp; &nbsp; $c-&gt;stash-&gt;{key} = $key;<br>
 &nbsp; &nbsp; &nbsp; $c-&gt;stash-&gt;{items} = $items;<br>
 &nbsp; }<br>
<br>
 &nbsp; # Esta função é para remover uma determinada coluna do nosso banco de<br>
dados,<br>
 &nbsp; # repare que aqui estamos utilizando Args(1), ou seja estou esperando<br>
um<br>
 &nbsp; # elemento na minha URI, além de /telefones/destroy, eu só irei acessar<br>
esta<br>
 &nbsp; # URI, se acessar por /telefones/destroy/N, onde N é o ID do nosso<br>
item.<br>
 &nbsp; # Veja que no código da função, estaremos novamente usando uma<br>
função do DBIx:Class,<br>
 &nbsp; # primeiramente irei procurar por este elemento com find() e então<br>
irei remover<br>
 &nbsp; # ele.<br>
<br>
 &nbsp; sub destroy :Chained(&#39;base&#39;) :Args(1) {<br>
 &nbsp; &nbsp; &nbsp; my ($self, $c, $id) = @_;<br>
 &nbsp; &nbsp; &nbsp; my $row = $c-&gt;stash-&gt;{collection}-&gt;find({ id =&gt; $id });<br>
 &nbsp; &nbsp; &nbsp; $row-&gt;delete if $row;<br>
 &nbsp; }<br>
<br>
 &nbsp; # Aqui, iremos editar o nosso item, onde também esperamos um<br>
argumento, que é o id<br>
 &nbsp; # do item, e iremos procurar ele.<br>
 &nbsp; # Repare que aqui, eu faço uma verificação, onde quero saber se o<br>
metodo utilizado<br>
 &nbsp; # para chamar esta requisição é POST, caso não seja eu vou<br>
&quot;encarrar&quot; (detach())<br>
 &nbsp; # esta função e vou passar para a próxima função da cadeia. (end()<br>
no Root.pm, neste<br>
 &nbsp; # caso).<br>
 &nbsp; # Resumindo, se o usuário não apertou &quot;ALTERAR&quot; no html (no qual o<br>
form esta enviando<br>
 &nbsp; # os dados via POST), eu irei mostrar a página com os dados do<br>
objeto N ($id).<br>
<br>
 &nbsp; sub edit :Chained(&#39;base&#39;) :Args(1) {<br>
 &nbsp; &nbsp; &nbsp; my ($self, $c, $id) = @_;<br>
<br>
 &nbsp; &nbsp; &nbsp; my $row = $c-&gt;stash-&gt;{row} = $c-&gt;stash-&gt;{collection}-&gt;find({id =&gt;<br>
$id});<br>
 &nbsp; &nbsp; &nbsp; $c-&gt;stash-&gt;{template} = &quot;telefone/<a href="http://create.tt" target="_blank">create.tt</a>&quot;;<br>
<br>
 &nbsp; &nbsp; &nbsp; $c-&gt;detach() unless $c-&gt;req-&gt;method eq &#39;POST&#39;;<br>
<br>
 &nbsp; &nbsp; &nbsp; # Caso o usuario, tenha apertado o submit do nosso form, para<br>
alterar os dados,<br>
 &nbsp; &nbsp; &nbsp; # eu vou colocar eles em $parameters = {}, e vou mandar o $row<br>
(que é o objeto<br>
 &nbsp; &nbsp; &nbsp; # do find()) para o metodo update().<br>
<br>
 &nbsp; &nbsp; &nbsp; my $parameters;<br>
 &nbsp; &nbsp; &nbsp; $parameters-&gt;{nome} = $c-&gt;req-&gt;param(&#39;nome&#39;);<br>
 &nbsp; &nbsp; &nbsp; $parameters-&gt;{telefone} = $c-&gt;req-&gt;param(&#39;telefone&#39;);<br>
<br>
 &nbsp; &nbsp; &nbsp; $row-&gt;update($parameters);<br>
<br>
 &nbsp; &nbsp; &nbsp; # Agora, nao vou mandar ele para a mesma tela, vou enviar para<br>
uma template diferente.<br>
 &nbsp; &nbsp; &nbsp; $c-&gt;stash-&gt;{template} = &quot;telefone/<a href="http://edit_ok.tt" target="_blank">edit_ok.tt</a>&quot;;<br>
 &nbsp; }<br>
<br>
 &nbsp; # Esta rotina é bem parecida com a do edit, com a unica diferença,<br>
que ao invez de atualizar<br>
 &nbsp; # eu vou inserir.<br>
<br>
 &nbsp; sub create :Chained(&#39;base&#39;) :Args(0) {<br>
 &nbsp; &nbsp; &nbsp; my ($self, $c) = @_;<br>
 &nbsp; &nbsp; &nbsp; $c-&gt;detach() unless $c-&gt;req-&gt;method eq &#39;POST&#39;;<br>
<br>
 &nbsp; &nbsp; &nbsp; my $parameters;<br>
 &nbsp; &nbsp; &nbsp; $parameters-&gt;{nome} = $c-&gt;req-&gt;param(&#39;nome&#39;);<br>
 &nbsp; &nbsp; &nbsp; $parameters-&gt;{telefone} = $c-&gt;req-&gt;param(&#39;telefone&#39;);<br>
<br>
 &nbsp; &nbsp; &nbsp; my $row = $c-&gt;stash-&gt;{collection}-&gt;new($parameters);<br>
 &nbsp; &nbsp; &nbsp; $row-&gt;insert;<br>
<br>
 &nbsp; &nbsp; &nbsp; $c-&gt;stash-&gt;{template} = &quot;telefone/<a href="http://create_ok.tt" target="_blank">create_ok.tt</a>&quot;;<br>
 &nbsp; }<br>
<br>
 &nbsp; # Caso, eu não especifique nada na URI de telefones, ou seja, acessar<br>
 &nbsp; # <a href="http://localhost:3000/telefone" target="_blank">http://localhost:3000/telefone</a> eu irei redirecionar para a action<br>
list,<br>
 &nbsp; # que já comentamos sobre ela.<br>
 &nbsp; sub index :Path :Args(0) {<br>
 &nbsp; &nbsp; &nbsp; my ($self, $c) = @_;<br>
<br>
 &nbsp; &nbsp; &nbsp; $c-&gt;res-&gt;redirect(<br>
 &nbsp; &nbsp; &nbsp; $c-&gt;uri_for(<br>
 &nbsp; &nbsp; &nbsp; $c-&gt;controller-&gt;action_for(&#39;list&#39;)<br>
 &nbsp; &nbsp; &nbsp; )<br>
 &nbsp; &nbsp; &nbsp; );<br>
 &nbsp; }<br>
<br>
 &nbsp; 1;<br>
<br>
<br>
Código pronto, porem precisamos das templates.<br>
<br>
Agora, crie estes arquivos no diretorio root/telefone:<br>
<br>
Este arquivo, é para a action &quot;create&quot;, no qual é o nosso formulario<br>
para criar um item na nossa agenda.<br>
<br>
=head3 <a href="http://create.tt" target="_blank">create.tt</a><br>
<br>
 &nbsp; &lt;h1&gt;Criar&lt;/h1&gt;<br>
<br>
 &nbsp; &lt;form method=&quot;POST&quot;&gt;<br>
<br>
 &nbsp; &lt;table&gt;&lt;tr&gt;&lt;td&gt;<br>
 &nbsp; Nome:<br>
 &nbsp; &lt;/td&gt;&lt;td&gt; &lt;input type=&quot;text&quot; name=&quot;nome&quot; value=&quot;[% row.nome %]&quot;<br>
size=20&gt;<br>
 &nbsp; &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;<br>
 &nbsp; Telefone:<br>
 &nbsp; &lt;/td&gt;&lt;td&gt; &lt;input type=&quot;text&quot; name=&quot;telefone&quot; value=&quot;[%<br>
row.telefone %]&quot; size=20&gt;<br>
 &nbsp; &lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot;&gt;<br>
 &nbsp; &lt;center&gt;&lt;input type=&quot;submit&quot;&gt;&lt;/center&gt;<br>
 &nbsp; &lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;<br>
<br>
 &nbsp; &lt;/form&gt;<br>
<br>
Este arquivo é a mensagem depois da criação do item.<br>
<br>
=head3 <a href="http://create_ok.tt" target="_blank">create_ok.tt</a><br>
<br>
 &nbsp; &lt;h1&gt;Telefone inserido com sucesso!&lt;/h1&gt;<br>
<br>
Mensagem para o item apagado.<br>
=head3 <a href="http://destroy.tt" target="_blank">destroy.tt</a><br>
<br>
 &nbsp; &lt;h1&gt;Telefone apagado&lt;/h1&gt;<br>
<br>
Mensagem para item editado.<br>
<br>
=head3 <a href="http://edit_ok.tt" target="_blank">edit_ok.tt</a><br>
<br>
&lt;h1&gt;Editado com sucesso.&lt;/h1&gt;<br>
<br>
Listar itens da nossa agenda, e também dar ao usuário a opção de procurar<br>
neles.<br>
<br>
=head3 <a href="http://list.tt" target="_blank">list.tt</a><br>
<br>
 &nbsp; &lt;h1&gt;Listar&lt;/h1&gt;<br>
<br>
 &nbsp; &lt;form&gt;<br>
 &nbsp; Procurar por:<br>
 &nbsp; &lt;input type=&quot;text&quot; name=&quot;key&quot; size=&quot;15&quot;&gt;<br>
 &nbsp; &lt;input type=&quot;submit&quot; value=&quot; Procurar &quot; &gt;<br>
 &nbsp; &lt;/form&gt;<br>
<br>
 &nbsp; [% IF key %]<br>
 &nbsp; &lt;br/&gt;<br>
 &nbsp; &lt;b&gt;Procurando por [% key %]&lt;/b&gt;<br>
 &nbsp; &lt;br/&gt;<br>
 &nbsp; [% END %]<br>
<br>
 &nbsp; &lt;table&gt;&lt;tr&gt;&lt;td&gt;<br>
 &nbsp; &lt;b&gt;Nome&lt;/b&gt;<br>
 &nbsp; &lt;/td&gt;&lt;td&gt;<br>
 &nbsp; &lt;b&gt;Telefone&lt;/td&gt;<br>
 &nbsp; &lt;/td&gt;&lt;td&gt;<br>
 &nbsp; &lt;b&gt;A&amp;ccedil;&amp;atilde;o<br>
 &nbsp; &lt;/td&gt;&lt;/tr&gt;<br>
<br>
 &nbsp; [% WHILE (item = items.next) %]<br>
 &nbsp; &nbsp; &nbsp; &lt;tr&gt;&lt;td&gt;<br>
 &nbsp; &nbsp; &nbsp; [% item.nome %]<br>
 &nbsp; &nbsp; &nbsp; &lt;/td&gt;&lt;td&gt;<br>
 &nbsp; &nbsp; &nbsp; [% item.telefone %]<br>
 &nbsp; &nbsp; &nbsp; &lt;/td&gt;&lt;td&gt;<br>
 &nbsp; &nbsp; &nbsp; &lt;a href=&quot;[% c.uri_for(&#39;edit&#39;, <a href="http://item.id" target="_blank">item.id</a>) %]&quot;&gt;Editar&lt;/a&gt;<br>
 &nbsp; &nbsp; &nbsp; -<br>
 &nbsp; &nbsp; &nbsp; &lt;a href=&quot;[% c.uri_for(&#39;destroy&#39;, <a href="http://item.id" target="_blank">item.id</a>) %]&quot;&gt;Remover&lt;/a&gt;<br>
 &nbsp; &nbsp; &nbsp; &lt;/td&gt;&lt;/tr&gt;<br>
 &nbsp; [% END %]<br>
<br>
 &nbsp; &lt;/table&gt;<br>
<br>
=head1 AUTOR<br>
<br>
Thiago Rondon &lt;<a href="mailto:thiago@aware.com.br" target="_blank">thiago@aware.com.br</a>&gt;<br>
<br>
=head1 COLABORADORES<br>
_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
 &nbsp; &nbsp; &nbsp;<br>
</blockquote>
<br>
--<br>
<a href="http://mantovanihouse.blogspot.com/" target="_blank">http://mantovanihouse.blogspot.com/</a><br>
<br>
-------(\_------------_/)-----------<br>
-------)--(----------)--(-----------<br>
------(----(---------)----)----------<br>
-------)----(-------)----(-----------<br>
-------(----(-------)----)-----------<br>
--------\_-(\\.---.//)-_/------------<br>
----------\)&#39; -8--8- &#39;(/--------------<br>
-----------/------------\---------------<br>
----------(--)--------(--)--------------<br>
------------(_c__c_)----------------<br>
----------------------------------------<br>
<br>
_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
<br>
 &nbsp; &nbsp;<br>
</blockquote>
_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
<br>
<br>
 &nbsp;<br>
</blockquote>
<br>
_______________________________________________<br>
SaoPaulo-pm mailing list<br>
<a href="mailto:SaoPaulo-pm@pm.org" target="_blank">SaoPaulo-pm@pm.org</a><br>
<a href="http://mail.pm.org/mailman/listinfo/saopaulo-pm" target="_blank">http://mail.pm.org/mailman/listinfo/saopaulo-pm</a><br>
</div></div></blockquote></div><br><br clear="all"><br>-- <br>--Lindolfo &quot;Lorn&quot; Rodrigues<br><a href="http://www.slackwarezine.com.br">www.slackwarezine.com.br</a><br><a href="http://lornlab.org">http://lornlab.org</a><br>
<a href="http://sao-paulo.pm.org">http://sao-paulo.pm.org</a><br>use Catalyst;<br>