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;