[Rio-pm] importando métodos?

Eden Cardim edencardim em gmail.com
Quinta Novembro 6 08:57:32 PST 2008


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/


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