[Rio-pm] importando métodos?

Pedro Henrique phikeda em gmail.com
Quinta Novembro 6 13:54:35 PST 2008


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.

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

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 (?):

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...


Vlw,

PH


2008/11/6 Eden Cardim <edencardim em gmail.com>

> 2008/11/6 Solli Honorio <shonorio em gmail.com>:
> > Eden, o 'use base' não resolve o problema ?
>
> Bom, levando ao pé da letra, não. Ele disse que quer adicionar um
> método ao objeto, e 'use base' vai adicionar à classe. Em JavaScript
> você faria:
>
> foo = new Object;
>
> foo.meth = function () { alert('foo') };
> foo.meth()
>
> bar = new Object;
>
> bar.meth = function () { alert('bar') }
> bar.meth()
>
> Por esse motivo, JavaScript é realmente orientado a objetos, a maioria
> das outras linguagens que alegam ser orientadas a objetos na verdade
> são orientadas a classes, inclusive Java e Python. Perl também é
> orientado a classes, mas como sempre, dá pra hackear algo parecido :).
>
> use warnings;
> use strict;
>
> package Object;
>
> use Carp;
>
> sub new {
>  return bless {}, shift;
> }
>
> sub AUTOLOAD {
>  my($self) = @_;
>  our $AUTOLOAD;
>  my $meth = (split /::/, $AUTOLOAD)[-1];
>  my $code = $self->{$meth};
>  if(ref $code eq 'CODE') {
>    goto &$code;
>  }
>  croak "couldn't find $meth via package ${\ref $self}";
> }
>
> package main;
> $\ = $/;
>
> my $foo = Object->new;
> $foo->{method} = sub { print 'Oi, eu sou um método que só existe em $foo'
> };
> my $bar = Object->new;
> $bar->{method} = sub { print 'Oi, eu sou um método que só existe em $bar'
> };
>
> for($foo, $bar) {
>  $_->method;
> }
> $foo->some_other_method;
>
> Se você usar herança, o mesmo método em dois objetos diferentes da
> mesma classe vai invocar o mesmo código.
>
> ALERTA: não use isso a não ser que você saiba *BEM* o que está fazendo :)
>
> > Pedro eu não entendi bem o teu problema, mas se for relacionado a
> herança,
> > você pode encontrar informações no 'perldoc perlboot'.
>
> É, eu também não entendi muito bem porque ele quer fazer isso,
> provavelmente ele quer Module::Pluggable como o Frederico falou.
>
> --
>   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/
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/rio-pm/attachments/20081106/9bfad5c1/attachment.html>


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