Class-Sniff

 view release on metacpan or  search on metacpan

lib/Class/Sniff/App.pm  view on Meta::CPAN

package Class::Sniff::App;

use 5.006;
use strict;
use warnings;

use Class::Sniff;
use Getopt::Long 2.24 qw/ :config no_ignore_case /;
use File::Find::Rule;
use File::Spec;

=head1 NAME

Class::Sniff::App - C<cnsiff> support class.

=head1 VERSION

Version 0.10

=cut

our $VERSION = '0.10';

=head1 SYNOPSIS

 use Class::Sniff::App;
 my $app = Class::Sniff::App->new(@ARGV);
 $app->run;

=head1 DESCRIPTION

This class implements the functionality for the C<csniff> executable which
ships with C<Class::Sniff>.  See C<perldoc csniff> for more information.

=cut

sub new {
    my ( $class, @args ) = @_;
    local @ARGV = @args;
    my $self = bless {
        dirs      => undef,
        ignore    => undef,
        namespace => qr/./,
        output    => undef,
        verbose   => undef,
    } => $class;
    GetOptions(
        "ignore=s"    => \$self->{ignore},
        "namespace=s" => \$self->{namespace},
        "verbose"     => \$self->{verbose},
        "png"         => sub { $self->{output} = 'png' },
        "gif"         => sub { $self->{output} = 'gif' },
        "output=s"    => \$self->{output},
        "I=s@"        => \$self->{lib},
    );
    $self->{output} ||= 'txt';

    unless ( @ARGV ) {
        die "You must supply at least one directory to load for Class::Sniff::App";
    }

    $self->{dirs} = \@ARGV;
    $self->_initialize;
    return $self;
}

sub _dirs      { @{$_[0]->{dirs}} }
sub _ignore    { $_[0]->{ignore} }
sub _graph     { $_[0]->{graph} }
sub _namespace { $_[0]->{namespace} }
sub _output    { $_[0]->{output} }
sub _verbose   { $_[0]->{verbose} }

sub _initialize {
    my $self = shift;

    $self->{namespace} = qr/$self->{namespace}/
      unless 'Regexp' eq ref $self->{namespace};
    $self->{ignore} = qr/$self->{ignore}/ if $self->{ignore};
}

sub run {
    my $self = shift;
    $self->_load_classes;
    my $graph = Class::Sniff->graph_from_namespace(
        {
            namespace => $self->_namespace,
            ignore    => $self->_ignore,
            universal => 1,
            clean     => 1,
        }
    );
    $self->{graph} = $graph;
    my $output = $self->_output;

    print $output eq 'txt'
      ? ( $self->_as_txt )
      : ( $self->_as_dot($output) );
}



( run in 1.471 second using v1.01-cache-2.11-cpan-8f98c5d2c55 )