Index: lang/perl/Module-Setup/trunk/lib/Module/Setup/Distribute.pm
===================================================================
--- lang/perl/Module-Setup/trunk/lib/Module/Setup/Distribute.pm (revision 21052)
+++ lang/perl/Module-Setup/trunk/lib/Module/Setup/Distribute.pm (revision 21435)
@@ -43,8 +43,7 @@
 
     my $src      = $context->base_dir->flavor->template->path_to($path);
-    my $template = $src->slurp;
     my $options = +{
-        dist_path => $self->dist_path->file($path),
-        template  => $template,
+        dist_path => ($src->is_dir ? $self->dist_path->subdir($path) : $self->dist_path->file($path)),
+        template  => ($src->is_dir ? undef : $src->slurp || undef),
         chmod     => sprintf('%03o', S_IMODE(( stat $src )[2])),
         vars      => $self->template_vars,
@@ -58,7 +57,10 @@
     my $is_dir = $options->{dist_path}->is_dir;
 
-    $context->call_trigger( template_process => $options );
-    $options->{template} = delete $options->{content} unless $options->{template};
+    unless ($is_dir) {
+        $context->call_trigger( template_process => $options );
+        $options->{template} = delete $options->{content} unless $options->{template};
+    }
     $options->{dist_path} =~ s/____var-(.+)-var____/$options->{vars}->{$1} || $options->{vars}->{config}->{$1}/eg;
+    $context->call_trigger( replace_distribute_path => $options );
 
     if ($is_dir) {
@@ -69,5 +71,6 @@
 
     push @{ $self->{install_files} }, $options->{dist_path};
-    $context->write_file($options);
+
+    $is_dir ? $options->{dist_path}->mkpath : $context->write_file($options);
 }
 
