Os plugins do Catalyst

Giuliani D. Sanches
Publicado em 01/03/2010

Os plugins do Catalyst

O Catalyst::Manual::ExtendingCatalyst, seção "BEST PRACTICES" afirma categoricamente:

"Não crie um plugin a não ser que seja realmente necessário."

Um plugin deve ser cuidadoso já que ele mexe com o núcleo do Catalyst. Se o seu não precisa necessariamente lidar com isso, considere fazer um Controller ou Model base. Ainda assim, se você realmente acha necessário, considere antes utilizar o Moose::Role.

Vamos entender como os plugins funcionam para entender a afirmação e saber quando usa-los.

Ao criar um plugin, todo método implementado, importado ou sobrescrito estará disponível na aplicação poluindo completamente o namespace global. Somente casos onde as coisas precisam estar globalmente disponíveis ou que precisam estar intimamente ligados ao cliclo da requisição, como sessões e autenticação, são candidatos a um plugin.

A implementação é muito simples. Seu plugin será inserido no topo da herança da sua aplicação, acima do Catalyst inclusive. Com isso você pode alterar o ciclo de vida de uma requisição.

O exemplo a seguir sobrescreve o método uri_for para que ele emita um aviso toda a vez que for chamado sem um objeto Action como primeiro parâmetro. O nome da classe é propositadamente simples:

	package Catalyst::Plugin::UriforUndefWarning;
	use strict;
	use Scalar::Util qw/blessed/;
	use MRO::Compat;

	sub uri_for {
   		my $c = shift;
		my $uri = $c->next::method(@_);
		$c->log->warn('uri_for with non action: ', join(',',@_))
		if (!blessed($_[0]) || !$_[0]->isa('Catalyst::Action'));
		return $uri;
	}

	1;

Como citado acima, sempre antes de criar um plugin, considere outras possibilidades. Este exemplo pode ser facilmente (e de forma mais apropriada) implementado com Moose::Role:

	package CatalystX::UriforUndefWarning;
	use Moose::Role;
	use namespace::autoclean;

	after 'uri_for' => sub {
		my ($c, $arg) = @_;
		$c->log->warn( 'uri_for with non action: ', join(', ', @_), )
		if (!blessed($_[0]) || !$_[0]->isa('Catalyst::Action'));
		return $uri;
	}

	1;

Observe que o Catalyst carregara qualquer Moose Role na lista de plugins, e ira aplicar elas na sua aplicação.

Instalação

Os plugins do Catalyst são disponibilizados via CPAN e sua instalação é simplificado pelo uso do utilitário cpan. Utilizando o plugin Catalyst::Plugin::Session, faríamos:

	cpan Catalyst::Plugin::Session

Para maiores detalhes de como usar o CPAN, consulte o http://www.perl.org.br/Artigos/ArtigoDanielMantovani2009x12x02 tutorial criado pelo Daniel Mantovani.

Configuração

Quando você inicia um projeto Catalyst utilizando os utilitários de linha de comando você terá algo como (supondo uma aplicação chamada MyApp) MyApp/lib/MyApp.pm além dos demais diretórios e arquivos resultantes. Neste MyApp.pm é que você dirá para sua aplicação quais plugins usar e também ira configurar o comportamento deles. Usando o Catalyst::Plugin::Session como exemplo novamente, edite o MyApp.pm e carregue o plugin da seguinte maneira:

	use Catalyst qw/
                Session
                Session::Store::FastMap
                Session::State::Cookie
               /;

Com isso você terá o esquema de sessões funcionando. Para maiores detalhes consulte a documentação do plugin. Ainda no MyApp.pm, vamos configurar o parâmetro expires:

	__PACKAGE__->config(
    		'Plugin::Session' => {
        	expires => 3600
   	 }
	);

AUTOR

Giuliani D. Sanches. <giulianisanches@gmail.com>

blog comments powered by Disqus