package Analizo::Filter::Client;
use File::Find;
sub filters {
my ($self, @new_filters) = @_;
$self->{filters} ||= [];
if (@new_filters) {
push @{$self->{filters}}, @new_filters;
}
return $self->{filters};
}
sub has_filters {
my ($self) = @_;
return exists($self->{filters}) && exists($self->{filters}->[0]);
}
sub share_filters_with($$) {
my ($self, $other) = @_;
$other->{filters} = $self->{filters};
}
sub exclude {
my ($self, @dirs) = @_;
if (!$self->{excluding_dirs}) {
$self->{excluding_dirs} = 1;
$self->filters(Analizo::LanguageFilter->new);
}
$self->filters(Analizo::FilenameFilter->exclude(@dirs));
}
sub filename_matches_filters {
my ($self, $filename) = @_;
for my $filter (@{$self->filters}) {
unless ($filter->matches($filename)) {
return 0;
}
}
return 1;
}
sub apply_filters {
my ($self, @input) = @_;
unless ($self->has_filters) {
# By default, only look at supported languages
$self->filters(Analizo::LanguageFilter->new('all'));
}
my @result = ();
for my $input (@input) {
find(
{ wanted => sub { push @result, $_ if !-d $_ && $self->filename_matches_filters($_); }, no_chdir => 1 },
$input
);
}
return @result;
}
1;