[Rio-pm] importando métodos?

breno breno em rio.pm.org
Quinta Novembro 6 13:58:45 PST 2008


Oi PH,

acho que você quer isso aqui:

http://search.cpan.org/perldoc?Class::Pluggable

Ou entendi errado?

[]s

-b


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.
>
> 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
>
>
> _______________________________________________
> Rio-pm mailing list
> Rio-pm em pm.org
> http://mail.pm.org/mailman/listinfo/rio-pm
>


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