#: FAST/Element.pm #: Common base class for all FAST DOM tree entities #: Copyright (c) 2006 Agent Zhang #: 2006-03-08 2006-04-03 package FAST::Element; use strict; use warnings; use base 'Clone'; #use GraphViz; use Carp 'confess'; sub new { my ($proto) = @_; my $class = ref $proto || $proto; my $self = bless { id => undef, }, $class; $self->{id} = "$self"; return $self; } #sub might_pass { confess "Not implemented"; } #sub must_pass { confess "Not implemented"; } sub id { return $_[0]->{id}; } sub clone { my $self = shift; my $clone = $self->SUPER::clone; $clone->_update_id; return $clone; } sub _update_id { my $self = shift; $self->{id} = "$self"; } #sub entry { confess "Not implemented"; } #sub exit { confess "Not implemented"; } #sub visualize { confess "Not implemented"; } #sub as_c { confess "Not implemented"; } sub as_png { my ($self, $outfile) = @_; my $gv = $self->as_img; $gv->as_png($outfile); } sub as_debug { my ($self, $outfile) = @_; my $gv = $self->as_img; my $content = $gv->as_debug($outfile); if ($outfile) { open my $out, "> $outfile" or die "Can't open $outfile for writing: $!"; print $out $content; close $out; } else { return $content; } } sub as_img { my ($self) = @_; my $gv = GraphViz->new( layout => 'dot', edge => {color => 'red'}, node => { fillcolor => '#f1e1f4', color => '#918194', style => 'filled', }, ); $self->visualize($gv); require 'FAST.pm'; FAST->plot_node($gv, 'entry'); FAST->plot_node($gv, 'exit'); $gv->add_edge('entry' => $self->entry); $gv->add_edge($self->exit => 'exit'); return $gv; } 1; __END__ =head1 NAME FAST::Element - Common virtual class for FAST DOM tree structures =head1 INHERITANCE FAST::Element isa Clone =head1 DESCRIPTION =head1 AUTHOR Agent Zhang L =head1 COPYRIGHT Copyright (c) 2006 Agent Zhang This library is free software. You can redistribute it and/or modify it under the same terms as Perl itself.