###########################################
package GitMeta::GMF;
###########################################
# 2010, Mike Schilli <m@perlmeister.com>
###########################################
use strict;
use warnings;
use base qw(GitMeta);
use File::Temp qw(tempdir);
use Log::Log4perl qw(:easy);
use YAML qw(Load);
use Sysadm::Install qw(:all);
use File::Basename;

###########################################
sub expand {
###########################################
  my($self) = @_;

  $self->param_check("repo", "gmf_path");

  my $yml = $self->_fetch( 
      $self->{repo}, 
      $self->{gmf_path} );

  my @locs  = ();

  for my $entry ( @$yml ) {
    my $type = ref($entry);

    if($type eq "") {
      # plain git url
      push @locs, $entry;
    } else {
      my $class = "GitMeta::" .
               ucfirst( $entry->{type} );
      eval "require $class;" or
         LOGDIE "Class $class missing";
      my $expander = $class->new(%$entry);
      push @locs, $expander->expand();
    }
  }

  return @locs;
}

###########################################
sub _fetch {
###########################################
    my($self, $git_repo, $gmf_path) = @_;

    my($tempdir) = tempdir( CLEANUP => 1 );

    cd $tempdir;
    tap "git", "clone", $git_repo;
    my $data = slurp(basename($git_repo) . 
                     "/$gmf_path");
    cdback;
    my $yml = Load( $data );
    return $yml;
}

1;
