10 my $g = GraphViz->new();
12 $g->add_node('London');
13 $g->add_node('Paris', label => 'City of\nlurve');
14 $g->add_node('New York');
16 $g->add_edge('London' => 'Paris');
17 $g->add_edge('London' => 'New York', label => 'Far');
18 $g->add_edge('Paris' => 'London');
24 my $data = do { local (@ARGV, $/) = 'callog'; <> };
30 while ($data =~ /XXXXX(.+?)YYY/msg) {
31 my @points = grep { $_ ne '(eval)' and $_ !~ /::(?: __ANON__ | BlockRunner::_?run | try (?: \s+ \{\.\.\.\} \s* )? | txn_do | preserve_context | MOP::Class:::around)$/x } reverse $1 =~ /invoked as (.+?) at /g;
33 while ($points[0] !~ /^DBIx/) {
37 push @points, '_resolve_column_info';
40 $meta->{$points[$_-1]}{$points[$_]}++;
45 # push @pp, sprintf '%s-> %s', ' ' x (2*$_), $points[$_];
47 # my $ppid = join "\n", '', @pp;
49 # unless ($paths->{$ppid}) {
50 # $paths->{$ppid}{points} = \@points;
51 # push @{$heads->{$points[0]}}, $ppid;
53 # $paths->{$ppid}{callcount}++;
58 Storage::DBIHacks | Storage::DBI(?=(?:Hacks)?::) | SQLMaker
62 my $g = GraphViz->new( layout => 'dot', node => { shape => 'box' }, concetrate => 1, ratio => 'auto' );
63 for my $f (keys %$meta) {
65 $g->add_node($f, cluster => ($f =~ $cluster_re)[0]||'' );
66 for my $t (keys %{$meta->{$f}}) {
67 $g->add_node($t, cluster => ($t =~ $cluster_re)[0]||'' );
71 label => $meta->{$f}{$t},
76 $g->as_svg('grph.svg');
82 for my $p (keys %$paths) {
83 for ( reverse ( 0 .. $#{$paths->{$p}{points}} ) ) {
84 if ( my $n = $heads->{$paths->{$p}{points}[$_]} ) {
90 die Dumper [ keys %$paths ];