MojoX::Routes::AsGraph - Create a graph from a MojoX::Routes object


MojoX-Routes-AsGraph documentation Contained in the MojoX-Routes-AsGraph distribution.

Index


Code Index:

NAME

Top

MojoX::Routes::AsGraph - Create a graph from a MojoX::Routes object

VERSION

Top

version 0.04

SYNOPSIS

Top

Given a MojoX::Routes object, generates a Graph::Easy object with all the possible routes.

    use MojoX::Routes::AsGraph;
    use My::Mojolicious::App;

    my $app   = My::Mojolicious::App->new;
    my $graph = MojoX::Routes::AsGraph->graph($app->routes);

    ### $graph is a Graph::Easy object, generate a .dot file
    if (open(my $dot, '>', 'routes.dot')) {
      print $dot $graph->as_graphviz;
      close($dot);
    }

    ### or directly as a PNG file
    if (open(my $png, '|-', 'dot -Tpng -o routes.png')) {
      print $png $graph->as_graphviz;
      close($png);
    }




METHODS

Top

$graph = graph($routes)

Accepts a MojoX::Routes object and generates an Graph::Easy object with a representation of the routes tree.

AUTHOR

Top

Pedro Melo, <melo at cpan.org>

BUGS

Top

Please report any bugs or feature requests to bug-mojox-routes-asgraph at rt.cpan.org, or through the web interface at http://rt.cpan.org/NoAuth/ReportBug.html?Queue=MojoX-Routes-AsGraph. I will be notified, and then you'll automatically be notified of progress on your bug as I make changes.

SUPPORT

Top

You can find documentation for this module with the perldoc command.

    perldoc MojoX::Routes::AsGraph




You can also look for information at:

* RT: CPAN's request tracker

http://rt.cpan.org/NoAuth/Bugs.html?Dist=MojoX-Routes-AsGraph

* AnnoCPAN: Annotated CPAN documentation

http://annocpan.org/dist/MojoX-Routes-AsGraph

* CPAN Ratings

http://cpanratings.perl.org/d/MojoX-Routes-AsGraph

* Search CPAN

http://search.cpan.org/dist/MojoX-Routes-AsGraph/

* IRC

Use the #mojo channel at FreeNode.

COPYRIGHT & LICENSE

Top


MojoX-Routes-AsGraph documentation Contained in the MojoX-Routes-AsGraph distribution.

package MojoX::Routes::AsGraph;
our $VERSION = '0.04';


use warnings;
use strict;
use Graph::Easy;

sub graph {
  my ($self, $r) = @_;
  return unless $r;
  
  my $g = Graph::Easy->new;
  _new_node($g, $r, {});
  
  return $g;
}

sub _new_node {
  my ($g, $r, $s) = @_;
  
  ### collect cool stuff
  my $name = $r->name;
  my $is_endpoint = $r->is_endpoint;
  my $pattern = $r->pattern;

  my $ctrl_actn;
  if ($pattern) {
    my $controller = $pattern->defaults->{controller};
    my $action     = $pattern->defaults->{action};

    $ctrl_actn = $controller || '';
    $ctrl_actn .= "->$action" if $action;

    $pattern    = $pattern->pattern;
  }

  ### Create node
  my @node_name = ($is_endpoint? '*' : '');

  if (!$pattern && !$ctrl_actn) {
    my $n = ++$s->{empty};
    push @node_name, "<empty $n>";
  }
  else {
    push @node_name, "'$pattern'"    if $pattern;
    push @node_name, "[$ctrl_actn]" if $ctrl_actn;
  }
  push @node_name, "($name)" if $name;
  my $node = $g->add_node(join(' ', @node_name));
  
  ### Draw my children
  for my $child (@{$r->children}) {
    my $child_node = _new_node($g, $child, $s);
    $g->add_edge($node, $child_node);
  }
  
  return $node;  
}


1; # End of MojoX::Routes::AsGraph


__END__