# esto es una clase abstracta. Para completarla hacen falta los siguientes # métodos: # init hace la inicialización necesaria para el tipo # add_content para el caso de nodos que son contenedores, agrega # contenido (opcional: si no es contenedor, no va) # canonical el string generado por un elemento neutro (es # opcional, utilizado por los elementos que no son # «especiales»; si es especial, code es donde pasa todo) # code defuelve el string que, cuando sea evaluado, termina # agregando a $OUTPUT lo que debe generar el elemento # en cuestión. En el caso de elementos especiales, esto # es bastante complejo; para los demás, el de acá # debiera alcanzar. package neb::Tree::Node; use strict; use Carp; sub new { my $class = shift; my $self = bless {}, $class; $self->init(@_); return $self; } sub parent { my $self = shift; my $parent = shift; $self->{PARENT} = $parent if (defined $parent); return $self->{PARENT}; } sub index { my $self = shift; my $index = shift; $self->{INDEX} = $index if (defined $index); return $self->{INDEX}; } sub free { my $self = shift; $self->parent->remove($self); } sub bind_parent { my $self = shift; $self->parent(@_); $self->parent->add_content($self); return $self->parent; } sub code { my $self = shift; return sprintf ("\$OUTPUT .= \"%s\";\n", quotemeta $self->canonical); } 1;