[Cascavel-pm] Sugestão OO

Donato Azevedo donatoaz em gmail.com
Quarta Julho 1 16:09:42 PDT 2009


Pessoal,

Eu desenvolvi um parser para arquivos FDF (Parser::FDF é o nome do
módulo e FDFs são arquivos de anotação de PDFs) para ser usado na
empresa em que trabalho. Este arquivo contém diversas Anotações e um
dos campos de Anotação parseados é um campo Contents que pode conter
um texto livre...

Bem, eu gostaria que o usuário do módulo Parser::FDF pudesse
especificar uma classe para parsear o conteúdo de Contents a seu bel
prazer.

Eu nao me lembro mais de nada do livro do GoF (design patterns) mas me
lembro de algo parecido...

tipo, eu queria fazer assim

usuário define uma classe qualquer com um construtor que parseia o
conteúdo de Contents. O meu módulo, então, ao parsear o arquivo FDF
retornaria um objeto contento uma lista de Anotações e cada Anotação
(além de outros atributos e propriedades) teria uma agregação do tipo
que o usuário especificou sob o nome de contents, ou seja

# definido pelo usuário
package Conteudo;

sub new {
  my $class = shift;
  my $raw_string = shift;

  my $self = { foo => $raw_string, bar => 1, }; # ilustrativo... podia
ser uma função parser qualquer...
  bless $self, $class;
  $self;
}

1;

...E no programa do usuário
use Parser::FDF;
use Conteudo;

my $fdf = Parser::FDF->new();

# eis o que eu nao sei como fazer:
$fdf->ContentParser( 'Conteudo' );

print $fdf->annotations[0]->foo;
print $fdf->annotations[0]->bar;

__END__

E mais, como eu faria no meu módulo para instanciar um objeto do tipo
"Conteudo".

Eu pensei em fazer algo do tipo dar um eval + use em run time, mas me
pareceu meio tosco... se alguém tiver um mero exemplo já me ajuda
muito!

E mais: isso é uma forma elegante de se fazer o que eu quero?

Cheers!
-- 
Donato Azevedo


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