[Cascavel-pm] Reflexão em Perl

Daniel de Oliveira Mantovani mantovani em perl.org.br
Segunda Dezembro 6 21:28:55 PST 2010


2010/12/7 Tom Mostard <capmostarda em gmail.com>:
> Colegas,
>
> Alguém sabe como carregar uma classe que não foi carregada com "use" através
> de reflexão computacional?

package Foo;

sub new { return bless {}, shift }
sub method { my $self = shift; print "Work!\n" }

1;

package main;

my ( $class, $method ) = ( 'Foo', 'method' );
$class->new->$method;


__END__


Outro exemplo, http://nopaste.snit.ch/26735

> Sei que Perl suporta, mas não estou conseguindo implementar.
>
> Exemplo:
>
> my $class  = "Foo";
> my $method = "hello";
> my $object = $class->new();
> $object->$method(); // que e o mesmo que $object->hello();
>
> Implementei a classe Foo, e salvei no mesmo diretório como Foo.pm
> Preciso usar o EXPORT ou coisa assim?

Não, você não precisa do Export. Você pode usar "do" ou  "require".

package main;
use strict;
use warnings;

my %cm = (qw/Foo read Bar people Baz should/);

foreach my $class ( ( sort keys %cm ) ) {

    require $class;
    my $method = $cm{$class};

    $class->new->$method;

}

Uma das utilidades do "require", é quando você precisa carregar um
módulo em tempo de execução, que é o seu caso.
Na verdade, tanto "use" como "require" usam o "do". Ambos são uma abstração.
http://perldoc.perl.org/functions/do.html



>
> O erro que tenho é o seguinte:
>
> Can't locate object method "new" via package "Foo" (perhaps you forgot to
> load "Foo"?) at ./main.pl line 10.
>
> Mas se eu uso o "use Foo" funciona.
>
> Abraços,
>
> Tom
> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm
>



-- 
"If you’ve never written anything thoughtful, then you’ve never had
any difficult, important, or interesting thoughts. That’s the secret:
people who don’t write, are people who don’t think."


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