Skip to content

Instantly share code, notes, and snippets.

@ispedals
Created May 20, 2013 21:28
Show Gist options
  • Select an option

  • Save ispedals/5615724 to your computer and use it in GitHub Desktop.

Select an option

Save ispedals/5615724 to your computer and use it in GitHub Desktop.
DirectoryTraverser interace inspired by Higher Order Perl
#!perl
package DirectoryTraverser;
use strict;
use warnings;
sub new()
{
my $class = shift;
my $self = {
_base_directory => shift,
_traverse => shift,
_entry_filter => shift,
_is_directory => shift,
_is_file => shift,
_file_callback => shift,
_directory_callback => shift,
_traverse_callbefore=>shift,
_traverse_callback => shift,
};
bless $self, $class;
return $self;
}
sub traverse
{
my $self=shift;
my $base_directory;
if(@_)
{
$base_directory=shift;
}
else
{
$base_directory=$self->{_base_directory};
}
my @entries=$self->{_traverse}->($base_directory);
@entries=grep($self->{_entry_filter}->($_),@entries);
foreach my $entry (@entries)
{
if($self->{_is_directory}->($entry))
{
$self->{_directory_callback}->($entry);
my $new_base_directory=$self->{_traverse_callbefore}->($entry);
traverse($self,$new_base_directory);
$self->{_traverse_callback}->($entry);
}
elsif($self->{_is_file}->($entry))
{
$self->{_file_callback}->($entry);
}
else
{
die("Unknown entry type: $entry");
}
}
}
1;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment