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

Alceu Rodrigues de Freitas Junior glasswalk3r em hotmail.com
Segunda Dezembro 3 13:25:41 PST 2007


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?

Obrigado a todos,

---
Alceu Rodrigues de Freitas Junior
glasswalk3r em hotmail.com
"Escolha um trabalho que você ama e você nunca mais terá que trabalhar um dia na sua vida" - Confúcio

_________________________________________________________________
Explore the seven wonders of the world
http://search.msn.com/results.aspx?q=7+wonders+world&mkt=en-US&form=QBRE
-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20071204/d2efd023/attachment.html 


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