package inc::Installer::TargetHandler; use strict; use base qw( inc::Installer inc::Installer::Logger inc::Installer::OptionsProviderI inc::Installer::EnvObservableI ); use ExtUtils::Installed; { my $SINGLETON; sub new { my $class = shift; if ( $SINGLETON ) { my %targets = @_; $SINGLETON->{$_} = $targets{$_} for ( keys %targets ); } else { my %targets = @_; bless \%targets, $class; $SINGLETON = \%targets; } return $SINGLETON; } } sub AddTarget { my ( $self, $target, $metadata ) = @_; $self->debug("Adding target '$target'"); if ( defined $metadata and UNIVERSAL::isa( $metadata, 'HASH' ) ) { $self->{$target} = $metadata; } else { $self->{$target} = { 'enable' => 1, 'prereq' => [], }; } return $self; } { my $mod_checker; sub Check { $mod_checker = ExtUtils::Installed->new if not $mod_checker; my ( $self, $key ) = @_; undef($@); no warnings 'redefine'; $key .= ' ()' if $key =~ qr/Scalar::Util/; eval { $mod_checker->validate( $key ) }; my $MISSING = $@; undef($@); my $file = $key; $file =~ s/::/\//g; $file .= '.pm'; delete $INC{$file} if exists $INC{$file}; return $MISSING ? [ 0, 1 ] : [ 'ok', 1 ]; } } sub Keys { my $self = shift; my @keys; for my $target ( $self->GetTargets ) { next if not $self->{$target}->{'enable'}; push @keys, map { $_->StandardName } @{ $self->{$target}->{'prereq'} }; } return @keys; } sub RemoveTarget { my ( $self, $target ) = @_; $self->debug("Removing target '$target'"); delete $self->{$target}; return $self; } sub EnableTarget { my ( $self, $target ) = @_; $self->debug("Enabling target '$target'"); $self->fatal("Target '$target' does not exist!") if not exists $self->{$target}; if ( UNIVERSAL::isa( $self->{$target}, 'HASH' ) ) { $self->{$target}->{'enable'} = 1; } else { $self->{$target} = { 'enable' => 1, 'prereq' => [], }; } return $self; } sub DisableTarget { my ( $self, $target ) = @_; $self->debug("Disabling target '$target'"); $self->fatal("Target '$target' does not exist!") if not exists $self->{$target}; if ( UNIVERSAL::isa( $self->{$target}, 'HASH' ) ) { $self->{$target}->{'enable'} = 0; } else { $self->{$target} = { 'enable' => 0, 'prereq' => [], }; } return $self; } sub GetTargets { my $self = shift; $self->debug("Getting targets"); return keys %$self; } sub GetPrereqsForTarget { my ( $self, $target ) = @_; $self->debug("Getting prerequisites for target '$target'"); return @{ $self->{$target}->{'prereq'} }; } sub Options { my $self = shift; my %options; for my $target ( sort { $a cmp $b } keys %$self ) { $options{"disable-$target"} = sub { $self->DisableTarget( $target ) }; $options{"enable-$target"} = sub { $self->EnableTarget( $target ) }; } return %options; } sub OptionsHelp { my $self = shift; my $help = " Targets:\n"; $help .= sprintf(" --[disable|enable]-$_\n Current setting: %s\n\n", $self->{$_}->{'enable'} ? 'enabled' : 'disabled' ) for ( sort { $a cmp $b } keys %$self ); return $help; } sub GetEUMMArgs { my $self = shift; my %args; for my $target ( keys %$self ) { next if not $self->{$target}->{'enable'}; for my $prereq ( @{ $self->{$target}->{'prereq'} } ) { $args{ $prereq->StandardName } = 0; } } #return 'PREREQ_PM' => \%args; return 'PREREQ_PM' => {}; } 1;