[Cascavel-pm] uso de __DATA__ com hierarquia de classes e Template Toolkit

Luis Motta Campos luismottacampos em yahoo.co.uk
Terça Dezembro 4 08:45:53 PST 2007


Alceu Rodrigues de Freitas Junior wrote:
> Olá monges,
> 
> 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.
> 
> 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?
> 
> 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:
> 
> package File::Validate::Template;
> 
> use strict;
> use warnings;
> use base 'Class::Accessor';
> use Carp qw(confess);
> 
> __PACKAGE__->follow_best_practice();
> __PACKAGE__->mk_ro_accessors(qw(code));
> 
> sub new {
> 
>     my $class = shift;
>     confess "class is an obligatory parameter" unless ( defined($class) );
> 
>     my $self = { code => undef };
> 
>     bless $self, $class;
> 
>     $self->{code} = $self->_read_code();
> 
>     return $self;
> 
> }
> 
> sub _read_code {
> 
>     my $self = shift;
>     my $buffer;
> 
>     local $/;
> 
>     my $handle = ref($self) . '::DATA';
>     $buffer = <$handle>;
> 
>     confess "No data from $handle file handle" unless ( defined($buffer) );
> 
>     return \$buffer;
> 
> }
> 
> 1;
> 
> 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:
> 
> C:\temp\File-Layout>gentest.pl -i ContactPhones.xml
> No data from File::Validate::Template::Basic::DATA file handle at
> File/Validate/Template.pm line 37
>        
> File::Validate::Template::_read_code('File::Validate::Template::Basic=HASH(0x1df4610)')
> called at File/Validate/Template.pm line 20
>         File::Validate::Template::new('File::Validate::Template::Basic')
> called at File/Validate/Field/Varchar.pm line 31
>        
> 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
>         main::generate_test('HASH(0x1bae6f4)') called at
> C:\temp\File-Layout\gentest.pl line 43
> 
> 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
> 
> my $handle = 'Test::DATA';
> my $test = <$handle>;
> 
> e funcionou conforme o esperado.
> 
> Aonde estou errando?

Ahn... Alceu, isto estah... assim... um pouco abstrato demais, nao?
Que tal mais um pouco de informacao objetiva sobre o teu problema?

Onde estah o codigo do TT que voce disse que estava usando?

Voce alguma vez tentou falar com o Nelson Ferraz sobre ou olhou o AppML?

Putamplexos interessados!
-- 
Luis Motta Campos (a.k.a. Monsieur Champs) is a software engineer,
Perl fanatic evangelist, and amateur {cook, photographer}



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