package Module::Start::Flavor; use strict; use warnings; use base 'Module::Start::Base'; use Class::Field qw'field'; use IO::All; use XXX; field 'config' => -init => '$self->new_config_object'; sub install_files { my $self = shift; my $class = ref($self); my $flavor = $self->flavor; my $base = $self->config->base_dir; my $file_map = $self->read_data_files($class); for my $file_name (sort keys %$file_map) { my $file_content = $file_map->{$file_name}; io("$base/templates/$flavor/$file_name") ->assert->print($file_content); } } sub start_module { my ($self, $args) = @_; $self->config->initialize($args); my $dist_name = $self->config->module_dist_name; $self->exit("'$dist_name' already exits") if -e $dist_name; my $templates_path = $self->config->templates_path; my @files = io($templates_path)->All_Files; print "Changing to directory $dist_name\n"; my $dist = io->dir($dist_name)->mkdir->chdir; my $manifest = ''; for my $file (@files) { my $name = './' . $file->abs2rel($templates_path); next if $name eq './__config__'; $name =~ s/\+\+(.*?)\+\+/$self->config->$1/ge; if ($name eq './MANIFEST') { $manifest = $file; io('MANIFEST')->touch; next; } $self->create_file($name, $file); } if ($manifest) { $self->create_file('./MANIFEST', $manifest); } } sub create_file { my ($self, $name, $file) = @_; my $template = $file->all; my $result = $self->render_template(\ $template, %{$self->config}, ); print "Creating $name\n"; io->file($name)->assert->print($result); } sub manifest_files { my $self = shift; my @files = io('.')->All_Files; return join "", sort { lc($a) cmp lc($b) } map { $_->abs2rel . "\n" } @files; } 1;