[Cascavel-pm] Reflexão em Perl

Daniel Vinciguerra daniel-vinciguerra em hotmail.com
Terça Dezembro 7 10:17:01 PST 2010


Isso funciona (certeza!) mas não me parece uma forma muito elegante de se resolver o problema!
my ( $class, $method ) = ( 'Foo', 'method' );require $class .".pm";$class->new->$method;
Vou consultar uns docs e depois posto algo mais polido!
Ua,
Daniel Vinciguerra - Developer
http://github.com/dvinciguerra





Date: Tue, 7 Dec 2010 15:15:01 -0300
From: capmostarda em gmail.com
To: cascavel-pm em pm.org
Subject: Re: [Cascavel-pm] Reflexão em Perl

Também nada, Daniel...

Tá tudo no mesmo diretório. Todos arquivos com permissão total, só para teste. E mesmo assim nada.

Abraços

2010/12/7 Daniel Vinciguerra <daniel-vinciguerra em hotmail.com>







coloque o seguinte no seu código...
use lib '/path/para/diretório/arquivos/.pm';
... e descomente o require.Acredito que isso deve funcionar.


Ua,

Daniel Vinciguerra - Developer
http://github.com/dvinciguerra






> Date: Tue, 7 Dec 2010 16:02:47 -0200
> From: mantovani em perl.org.br
> To: cascavel-pm em pm.org

> Subject: Re: [Cascavel-pm] Reflexão em Perl
> 
> Você tem um arquivo chamado Foo.pm no mesmo diretório do script.pl que
> está fazendo o require ?

> 
> 2010/12/7 Tom Mostard <capmostarda em gmail.com>:
> >
> > Daniel,
> > Obrigado pela ajuda! Mas aqui continuar sem solução.

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

> > package main;
> >
> > my ( $class, $method ) = ( 'Foo', 'method' );
> > # require $class;
> > $class->new->$method;
> >
> >
> > Quando uso o require acima, tenho a seguinte mensagem:

> > Can't locate Foo in @INC (@INC contains: /etc/perl
> > /usr/local/lib/perl/5.10.0 /usr/local/share/perl/5.10.0 /usr/lib/perl5
> > /usr/share/perl5 /usr/lib/perl/5.10 /usr/share/perl/5.10

> > /usr/local/lib/site_perl .) at ./main.pl line 6.
> >
> > Se eu comento o "require", tenho a seguinte mensagem:
> > Can't locate object method "new" via package "Foo" (perhaps you forgot to

> > load "Foo"?) at ./main.pl line 7.
> >
> > Será que preciso instalar algum módulo? Ainda não tentei o Class::MOP nem o
> > Moose. Queria resolver isso sem usá-los, se for possível.

> > Se uso as duas classes num único arquivo, funciona, mas minha intenção é
> > usar uma classe externa, que pode variar conforme a necessidade.
> >
> > Mais uma vez, obrigado.
> >

> > Tom
> >
> > Em 7 de dezembro de 2010 02:38, Daniel de Oliveira Mantovani
> > <mantovani em perl.org.br> escreveu:
> >>

> >> Abusando da lista, e mandando 1 milhão de e-mail na mesma thread, vou
> >> deixar só a última recomendação,
> >> http://en.wikipedia.org/wiki/Metaprogramming

> >>
> >> Eu gostaria de falar muito mais sobre reflexão e introspecção, mas
> >> preciso trabalhar.
> >>
> >> Boa noite.
> >>
> >> 2010/12/7 Daniel de Oliveira Mantovani <mantovani em perl.org.br>:

> >> > Ops, esqueci de colocar o link do manual do Moose,
> >> > http://search.cpan.org/~drolsky/Moose-1.21/lib/Moose/Manual.pod

> >> >
> >> > Só para ficar mais claro, você pode usar toda a magia do Moose e ainda
> >> > abusar de reflexão e introspecção, com Class::Mop.
> >> >
> >> > 2010/12/7 Daniel de Oliveira Mantovani <mantovani em perl.org.br>:

> >> >> Perl é arte, você pode usar toda a magia do Moose e abusar de reflexão
> >> >> e introspecção:
> >> >>
> >> >> use Some::Class;
> >> >> use Class::MOP;

> >> >>
> >> >> my $meta = Class::MOP::Class->initialize('Some::Class');
> >> >>
> >> >> for my $meth ( $meta->get_all_methods ) {
> >> >>    print $meth->fully_qualified_name, "\n":

> >> >> }
> >> >>
> >> >>
> >> >> 2010/12/7 Daniel de Oliveira Mantovani <mantovani em perl.org.br>:

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

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

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

> >> Cascavel-pm mailing list
> >> Cascavel-pm em pm.org
> >> http://mail.pm.org/mailman/listinfo/cascavel-pm

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

> _______________________________________________
> Cascavel-pm mailing list
> Cascavel-pm em pm.org
> http://mail.pm.org/mailman/listinfo/cascavel-pm

 		 	   		  

_______________________________________________

Cascavel-pm mailing list

Cascavel-pm em pm.org

http://mail.pm.org/mailman/listinfo/cascavel-pm



_______________________________________________
Cascavel-pm mailing list
Cascavel-pm em pm.org
http://mail.pm.org/mailman/listinfo/cascavel-pm 		 	   		  
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: <http://mail.pm.org/pipermail/cascavel-pm/attachments/20101207/5d3c3fb3/attachment.html>


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