The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Package::Install;
use strict;
use base qw(Package::Base);
use Data::Dumper;
use ExtUtils::MakeMaker;
use Package::Configure;
use Term::ANSIColor;

sub init {
  my($self,%arg) = @_;

  $self->SUPER::init(%arg);

  $self->configure(Package::Configure->new(%arg)) unless $self->configure();
}

=head2 compile_manifest()

 Usage   : $obj->compile_manifest()
 Function: Called by L</write_makefile()>, this iterates over all .pm
           files in the distro MANIFEST and tries to compile them (perl -c)
           prints to STDERR a diagnostic message for each.
 Args    : none.


=cut

sub compile_manifest {
  my ($self) = @_;

  my $statusformat = "%-60s[%s]\n";
  my $fail         = colored('FAILED','red');
  my $pass         = colored('  OK  ','green');
  my $base         = 'lib/';

  if(! -e 'MANIFEST'){
    print STDERR colored("<FATAL> can't find MANIFEST ($!), skipping", 'red bold')."\n";
    return undef;
  }

  my @entries;
  open(M,"MANIFEST");
  while(my $file = <M>){
    chomp $file;
    next unless $file =~ /\.pm$/ and $file =~ /^$base/;

    my($pack) = $file =~ /^(.+)\.pm$/; #untaint
    $pack =~ s/^$base//;               #strip leading path
    $pack =~ s!/!::!g;                 #replace all / with ::

    push @entries, $pack;
  }
  close(M);

  print STDERR colored("compiling modules in MANIFEST", 'cyan')."\n";

  foreach my $pack (@entries){
    eval "use $pack";
    if($@ && $ENV{DEBUG}){ print "\n$@\n" }
    print STDERR sprintf($statusformat,"use $pack", ($@ ? $fail : $pass));
  }
}


=head2 write_makefile()

 Usage   : $obj->write_makefile(%arg)
 Function: calls ExtUtils::MakeMaker's WriteMakefile() with provided %arg,
           as well as PL_FILES and EXE_FILES as determined by
           Package::Configure (config file [PL_FILES] [EXE_FILES]
           sections).
 Returns :
 Args    : an anonymous hash of WriteMakefile() args.  See
           L<ExtUtils::MakeMaker> for details.

=cut

sub write_makefile {
  my ($self,%arg) = @_;
  $self->compile_manifest();
  my %pl_files;
  my @exe_files;
  if($self->configure->ini()){
    %pl_files = map {$_ => $self->configure->ini()->val('PL_FILES',$_)} $self->configure->ini()->Parameters('PL_FILES');

    #warn Dumper(\%pl_files);

    @exe_files = grep { $self->configure->ini()->val('EXE_FILES',$_) =~ /y1/i } $self->configure->ini()->Parameters('EXE_FILES');
  }

  if($arg{bootstrap}){
    $pl_files{'bin/pstub.PL'} = 'bin/pstub';
    push @exe_files, 'bin/pstub';
    delete($arg{bootstrap});
  }

  WriteMakefile(
                %arg,
                'PL_FILES'     => \%pl_files,
                'EXE_FILES'    => \@exe_files,
               );
}

=head2 configure()

 Usage   : $obj->configure($newval)
 Function: holds a Package::Configure instance
 Example : 
 Returns : value of configure (a scalar)
 Args    : on set, new value (a scalar or undef, optional)


=cut

sub configure {
  my($self,$val) = @_;
  $self->{'configure'} = $val if defined($val);
  return $self->{'configure'};
}

=head1 METHODS FOR ExtUtils::MakeMaker

=cut

sub MY::clean {
  package MY;
  my $inherited = shift->SUPER::clean(@_);
  $inherited .= "\t\$(RM_F) pkg_config.cache\n";
  return $inherited;
}

1;