読者です 読者をやめる 読者になる 読者になる

Module::Setupでflavourの選択をできるようにしてみた

Module::Setupでflavourの選択をできるようにしてみました。

module-setup Foo::Barとすると、flavour指定がないときにどのテンプレートからモジュールを選択するかが選択できます。どんなflavourがあったか思い出せないってときに便利です。

--- lib/Module/Setup.pm.orig	2008-10-03 01:33:46.000000000 +0900
+++ lib/Module/Setup.pm	2008-10-03 01:35:12.000000000 +0900
@@ -56,7 +56,7 @@
         $options  = $self->setup_options;
     }
 
-    $options->{flavor}       ||= 'default';
+    $options->{flavor}       ||= $self->select_flavour;
     $options->{flavor_class} ||= 'Default';
 
     no warnings 'redefine';
@@ -73,6 +73,7 @@
     # create module
     $options->{module} = shift @argv;
     $options->{flavor} = shift @argv if @argv;
+    $options->{flavor} ||= $self->select_flavour;
 
     if ($options->{pack}) {
         #pack flavor template
@@ -454,6 +455,35 @@
 END
 }
 
+sub select_flavour {
+    my $self     = shift;
+    my $flavours = $self->_collect_flavours;
+    $self->_show_flavours_list($flavours);
+
+    my $selected = prompt( "Select flavour:", 1 );
+    $flavours->[ $selected - 1 ] || 'default';
+}
+
+sub _collect_flavours {
+    my $self         = shift;
+    my $flavours_dir = $self->module_setup_dir('flavors');
+    my $flavours     = [];
+    for my $flavour ( $flavours_dir->children ) {
+        if ( $flavour->is_dir ) {
+            my $flavour_name = pop @{ $flavour->{dirs} };
+            push @$flavours, $flavour_name;
+        }
+    }
+    $flavours;
+}
+
+sub _show_flavours_list {
+    my ( $self, $flavours ) = @_;
+    for ( 1 .. @$flavours ) {
+        my $flavour = $flavours->[ $_ - 1 ];
+        print sprintf "[%d]: %s", $_, $flavour . "\n";
+    }
+}
 1;
 __END__

# flavoursディレクトリが存在しない場合の対応をいれてからcommitしましたー!