package Carmel::Preload;
use strict;
use Module::Runtime;

unless (%Carmel::Setup::) {
    require Carp;
    Carp::croak("Can't detect Carmel environment. You have to use Carmel::Preload under `carmel exec` or after `use Carmel::Setup`");
}

sub import {
    my($class, @phase) = @_;

    my $modules = $class->required_modules(@phase);
    while (my($module, $version) = each %$modules) {
        next if $module eq 'perl';
        Module::Runtime::use_module($module, $version);
    }

    1;
}

sub required_modules {
    my($class, @phase) = @_;

    my %modules;
    for my $phase ('runtime', @phase) {
        %modules = (%modules, %{Carmel::Setup->environment->{prereqs}{$phase}{requires} || {}});
    }

    \%modules
}

1;

__END__

=head1 NAME

Carmel::Preload - preloads all modules declared in cpanfile

=head1 SYNOPSIS

  # program running under carmel exec, or after use Carmel::Setup
  use Carmel::Preload;

=head1 DESCRIPTION

Carmel::Preload scans your cpanfile and preloads all the modules
declared as C<requires>. By default, only the prereqs listed in
C<runtime> phase will be loaded, but you can pass in other phases such
as C<test> or C<develop> via its import arguments, i.e.

  use Carmel::Preload qw(test develop);

=cut