[Rio-pm] importando métodos?

Eden Cardim edencardim em gmail.com
Quinta Novembro 6 14:56:09 PST 2008


2008/11/6 Pedro Henrique <phikeda em gmail.com>:
> Obrigado a todos que responderam!
>
> Então... Frederico, é tipo um plugin mesmo, mas é um plugin para o objeto,
> como o Eden mostrou. Olhei o Module::Pluggable mas ele não faz o que quero,
> pois o método seria dinâmico.

Não entendi, como assim "o método seria dinâmico"? Se você herdar de
todos os plugins e a classe do seu objeto não tiver o método, o método
do plugin é que será executado, se ninguém tiver, vai rolar um erro
fatal. Dá uma olhada em como o Catalyst e o DBIx::Class fazem isso.

> A lógica do meu objeto seria:
>
> 1) tenho X "plugins" carregados
> 2) recebi uma chamada para método inexistente na minha interface (
> $objeto->foo(), $objeto->bar(), ... )
> 3) Passo essa chamada para meus plugins

Não vejo porque você precisaria que os métodos fossem únicos a cada objeto.

> Acho que foi isso que o Eden explicou (preciso estudar esse AUTOLOAD). Agora
> com os comentários (especialmente Eden e Adriano) pensei em uma alternativa
> mais elegante (?):

Como eu falei, o AUTOLOAD é um hack, eu não recomendo usar a não ser
que realmente não tenha alternativa.

> 1) carrego X "plugins" durante o "import" da minha classe
> 2) cada um deles anexa seu código à minha Classe, e agora um my $objeto =
> Classe->new() fará o objeto ter todos os métodos existentes não só nele como
> em cada plugin.
>
> Ninguém nunca teve esse problema? Será que estou "viajando" (não programo OO
> há muito tempo, desculpem qualquer coisa)? Existe outra forma (mais
> elegante) ou pattern em Perl para atingir os mesmos resultados?
>
> Se houver uma forma de "capturar" e tratar chamadas a métodos inexistentes
> ao meu objeto, posso usar o Module::Pluggable para resolver meu problema...

Perl faz a resolução de métodos inexistentes na classe atual
automaticamente pra você através do sistema de herança, usa
Module::Pluggable pra carregar os plugins e Class::C3::Componentized
pra "anexar" os plugins à sua classe, depois é só invocar os métodos
dos plugins no seu objeto e voilá. E dá uma olhada no
MooseX::Object::Pluggable também.

-- 
   Eden Cardim       Need help with your Catalyst or DBIx::Class project?
  Code Monkey                    http://www.shadowcat.co.uk/catalyst/
 Shadowcat Systems Ltd.  Want a managed development or deployment platform?
http://edenc.vox.com/            http://www.shadowcat.co.uk/servers/


Mais detalhes sobre a lista de discussão Rio-pm