<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'><div style="text-align: left;">Olá monges,<br><br>Estou tentando fazer um conjunto de módulos que gerem código Perl utilizando o Template Toolkit. Na realidade eu tenho dois problemas: um é definir se estou usando o Template Toolkit de forma correta. O outro é lidar com o __DATA__ em uma hierarquia de classes.<br><br>Depois de testar meus modelos feitos com TT, eu cheguei a conclusão que definir o local aonde os templates ficam localizados não é tão interessante assim: eu teria que usar um arquivo de configuração ou algo parecido. Eu resolvi definir um pacote e dentro desse pacote colocar as linhas de código do template. Assim eu poderia utilizar o próprio @INC para buscar pelos meus templates (não preciso me preocupar com performance por fazer essa busca nesse momento). O TT já implementa isso de alguma outra forma?<br><br>O outro problema foi justamente tentar usar __DATA__. Como o conjunto de métodos eram todos iguais para minhas classes-template, eu resolvi criar uma superclasse e colocar os métodos todos lá da seguinte forma:<br><br>package File::Validate::Template;<br><br>use strict;<br>use warnings;<br>use base 'Class::Accessor';<br>use Carp qw(confess);<br><br>__PACKAGE__-&gt;follow_best_practice();<br>__PACKAGE__-&gt;mk_ro_accessors(qw(code));<br><br>sub new {<br><br>&nbsp;&nbsp;&nbsp; my $class = shift;<br>&nbsp;&nbsp;&nbsp; confess "class is an obligatory parameter" unless ( defined($class) );<br><br>&nbsp;&nbsp;&nbsp; my $self = { code =&gt; undef };<br><br>&nbsp;&nbsp;&nbsp; bless $self, $class;<br><br>&nbsp;&nbsp;&nbsp; $self-&gt;{code} = $self-&gt;_read_code();<br><br>&nbsp;&nbsp;&nbsp; return $self;<br><br>}<br><br>sub _read_code {<br><br>&nbsp;&nbsp;&nbsp; my $self = shift;<br>&nbsp;&nbsp;&nbsp; my $buffer;<br><br>&nbsp;&nbsp;&nbsp; local $/;<br><br>&nbsp;&nbsp;&nbsp; my $handle = ref($self) . '::DATA';<br>&nbsp;&nbsp;&nbsp; $buffer = &lt;$handle&gt;;<br><br>&nbsp;&nbsp;&nbsp; confess "No data from $handle file handle" unless ( defined($buffer) );<br><br>&nbsp;&nbsp;&nbsp; return \$buffer;<br><br>}<br><br>1;<br><br>Nas subclasses eu simplesmente herdei da superclasse e defini alguma coisa depois de __DATA__. Mas isso não está funcionando nem com reza brava. O resultado é esse aqui se tento executar:<br><br>C:\temp\File-Layout&gt;gentest.pl -i ContactPhones.xml<br>No data from File::Validate::Template::Basic::DATA file handle at File/Validate/Template.pm line 37<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File::Validate::Template::_read_code('File::Validate::Template::Basic=HASH(0x1df4610)') called at File/Validate/Template.pm line 20<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File::Validate::Template::new('File::Validate::Template::Basic') called at File/Validate/Field/Varchar.pm line 31<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; File::Validate::Field::Varchar::new('File::Validate::Field::Varchar', 'File::Validate::Field::Varchar=HASH(0x1c234f8)') called at C:\temp\File-Layout\gentest.pl line 106<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; main::generate_test('HASH(0x1bae6f4)') called at C:\temp\File-Layout\gentest.pl line 43<br></div><br>Eu tive que usar um pouco da tabela de símbolos para definir em tempo de execução em qual __DATA__ eu quero ler. Eu tentei com arquivo de teste usando<br><br>my $handle = 'Test::DATA';<br>my $test = &lt;$handle&gt;;<br><br>e funcionou conforme o esperado.<br><br>Aonde estou errando?<br><br>Obrigado a todos,<br><br><span class="EC_EC_203180417-25102007"></span>---<br>Alceu Rodrigues de Freitas Junior<br>glasswalk3r@hotmail.com<br>"Escolha um trabalho que você ama e você nunca mais terá que trabalhar um dia na sua vida" - Confúcio<br><br /><hr />Explore the seven wonders of the world <a href='http://search.msn.com/results.aspx?q=7+wonders+world&mkt=en-US&form=QBRE' target='_new'>Learn more!</a></body>
</html>