# $Id: Traverse.pm,v 1.8 2006/05/06 18:56:21 gene Exp $ package GraphViz::Traverse; use strict; use warnings; use base qw( GraphViz ); use Carp; our $VERSION = '0.02'; our $AUTOLOAD; sub new { my( $proto, %args ) = @_; my $class = ref( $proto ) || $proto; my $self = $proto->SUPER::new( %args ); $self->{_DEBUG} = $args{_DEBUG}; $self->{_attributes} = { ( map { 'node_' . $_ => undef } qw( color distortion fillcolor fixedsize fontcolor fontname fontsize height href label layer orientation peripheries regular shape sides skew style target tooltip URL width ) ), ( map { 'edge_' . $_ => undef } qw( arrowhead arrowsize arrowtail color constraint decorate dir fontcolor fontname fontsize headURL headclip headhref headlabel headtarget headtooltip href label labelangle labeldistance layer minlen port_label_distance samehead sametail style tailURL tailclip tailhref taillabel tailtooltip target tooltip URL weight ) ) }; bless $self, $class; return $self; } sub DESTROY {} sub AUTOLOAD { my $self = shift; my $type = ref( $self ) || croak "$self is not an object"; ( my $method = $AUTOLOAD ) =~ s/.*://; my $superior = "SUPER::$method"; return exists $self->{_attributes}{$method} ? undef : $self->$superior(@_); } sub build_attributes { my( $self, $A, $B ) = @_; my $type = $B ? 'edge' : 'node'; my %attributes = (); for my $method ( keys %{ $self->{_attributes} } ) { $self->{_attributes}{$method} = $B ? $self->$method( $A => $B ) : $self->$method( $A ); } return %{ $self->{_attributes} }; } sub mark_item { my( $self, $node, $parent ) = @_; if( $parent ) { $self->add_edge( $parent => $node, $self->build_attributes( $node, $parent ) ); } else { $self->add_node( $node, $self->build_attributes( $node ) ); } } sub traverse { my $self = shift; warn "traverse() must be overridden.\n" if $self->{_DEBUG}; return undef; } 1; __END__ =head1 NAME GraphViz::Traverse - Build a GraphViz object via callback traversal =head1 SYNOPSIS use GraphViz::Traverse; =head1 DESCRIPTION A C object represents a base class for inheriting by other traversal modules. =head1 PUBLIC METHODS =head2 new my $g = GraphViz::Traverse->new($arguments); Return a new GraphViz::Traverse instance. Valid arguments are listed below (taken from C and L): _DEBUG = Class instance setting bgcolor = Class instance setting center = n a non-zero value centers the drawing on the page. color = color value sets foreground color (bgcolorfor background). concentrate = Class instance setting directed = Class instance setting epsilon = Class instance setting height = Class instance setting href = "url" the default url for image map files; in PostScript files, the base URL for all relative URLs, as recognized by Acrobat Distiller 3.0 and up. layers = "id:id:id:id" is a sequence of layer identifiers for overlay diagrams. The PostScript array variable layercolorseqsets the assignment of colors to layers. The least indexis1and each element must be a 3-ele- ment array to be interpreted as a color coordinate. layout = Class instance setting margin = f sets the page margin (included in the page size). no_overlap = Class instance setting nodesep = f sets the minimum separation between nodes. nslimit = f ormclimit=f adjusts the bound on the number of network simplexormincross iterations by the givenratio. For example,mclimit=2.0runs twice as long. ordering = out constrains order of out-edges in a subgraph according to their file sequence. overlap = Class instance setting page = "x,y" sets the PostScript pagination unit. pagedir = [TBLR][TBLR] sets the major and minor order of pagination. pageheight = Class instance setting pagewidth = Class instance setting random_start = Class instance setting rank = same (or minor max) inasubgraph constrains the rank assignment of its nodes. If a subgraph's name has the prefixcluster, its nodes are drawn in a distinct rectangle of the layout. Clusters may be nested. rankdir = LR|RL|BT requests a left-to-right, right-to-left, or bottom-to-top, drawing. ranksep = f sets the minimum separation between ranks. ratio = f sets the aspect ratio tof which may be a floating point number, orone of the keywordsfill, compress,orauto. rotate = 90 sets landscape mode. (orientation=landis backward compatible but obsolete.) size = "x,y" sets bounding box of drawing in inches. stylesheet = "file.css" includes a reference to a stylesheet in -Tsvg and -Tsvgz outputs. Ignored by other formats. URL = "url" ("URL" is a synonym for "href".) width = Class instance setting =head2 mark_item $g->mark_item( $node ); $g->mark_item( $child, $parent ); Add a node or an edge to the C object. This method is to be used by the C method. =head2 traverse $g->traverse($root); Traverse a structure starting at a given root node. This method is to be overridden by an inheriting class with specific traversal actions for the C C attributes listed below. Please see L for an example of this attribute overriding. Node attributes: color distortion fillcolor fixedsize fontcolor fontname fontsize height href label layer orientation peripheries regular shape sides skew style target tooltip URL width Edge attributes: arrowhead arrowsize arrowtail color constraint decorate dir fontcolor fontname fontsize headURL headclip headhref headlabel headtarget headtooltip href label labelangle labeldistance layer minlen port_label_distance samehead sametail style tailURL tailclip tailhref taillabel tailtooltip target tooltip URL weight =head1 TO DO Document this code better. =head1 THANK YOU Brad Choate Ebchoate@cpan.orgE for untangling my AUTOLOADing. =head1 SEE ALSO L L =head1 COPYRIGHT Copyright 2006, Gene Boggs, All Rights Reserved You may use this module under the license terms of the parent L package. =head1 AUTHOR Gene Boggs Egene@cpan.orgE =cut