diff -u -r -N ExtUtils-MakeMaker-6.30_03/Makefile.PL ExtUtils-MakeMaker/Makefile.PL
--- ExtUtils-MakeMaker-6.30_03/Makefile.PL	2006-08-31 12:52:16.000000000 -0300
+++ ExtUtils-MakeMaker/Makefile.PL	2006-09-05 12:46:14.000000000 -0300
@@ -66,11 +66,7 @@
     PMLIBPARENTDIRS => [qw(lib inc)],
     EXE_FILES       => [qw(bin/instmodsh)],
 
-    EXTRA_META      => <<'META',
-no_index:
-    dir:
-        - inc
-META
+    EXTRA_META => { no_index => { dir => [ qw(inc) ] }, },
 
     INSTALLDIRS     => 'perl',
 
diff -u -r -N ExtUtils-MakeMaker-6.30_03/lib/ExtUtils/MM_Any.pm ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm
--- ExtUtils-MakeMaker-6.30_03/lib/ExtUtils/MM_Any.pm	2006-09-01 15:42:40.000000000 -0300
+++ ExtUtils-MakeMaker/lib/ExtUtils/MM_Any.pm	2006-09-05 13:03:14.000000000 -0300
@@ -698,7 +698,6 @@
     return $manify;
 }
 
-
 =head3 metafile_target
 
     my $target = $mm->metafile_target;
@@ -712,6 +711,10 @@
     version_from
     installdirs
 
+The YAML is generated by C<< $mm->metafile_file($mm->metafile_data) >>.
+Both methods, C<metafile_file> and C<metafile_data>, can be customized 
+for special effects.
+
 =cut
 
 sub metafile_target {
@@ -722,43 +725,8 @@
 	$(NOECHO) $(NOOP)
 MAKE_FRAG
 
-    my $prereq_pm = '';
-    foreach my $mod ( sort { lc $a cmp lc $b } keys %{$self->{PREREQ_PM}} ) {
-        my $ver = $self->{PREREQ_PM}{$mod};
-        $prereq_pm .= sprintf "\n    %-30s %s", "$mod:", $ver;
-    }
-
-    # Use a list to preserve order.
-    my @meta_to_mm = (
-        name         => $self->{DISTNAME},
-        version      => $self->{VERSION},
-        abstract     => $self->{ABSTRACT},
-        license      => $self->{LICENSE} || 'unknown',
-        generated_by => 
-                "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
-        author       => $self->{AUTHOR},
-        distribution_type => $self->{PM} ? 'module' : 'script',
-    );
-
-    my $meta = "--- #YAML:1.0\n";
-
-    while( @meta_to_mm ) {
-        my($key, $val) = splice @meta_to_mm, 0, 2;
-
-        $val = '~' unless defined $val;
-
-        $meta .= sprintf "%-20s %s\n", "$key:", $val;
-    };
-
-    $meta .= <<YAML;
-requires:     $prereq_pm
-meta-spec:
-    url: http://module-build.sourceforge.net/META-spec-new.html
-    version: 1.1
-YAML
-
-    $meta .= $self->{EXTRA_META} if $self->{EXTRA_META};
-
+    my @metadata = $self->metafile_data;
+    my $meta = $self->metafile_file(@metadata);
     my @write_meta = $self->echo($meta, 'META_new.yml');
 
     return sprintf <<'MAKE_FRAG', join("\n\t", @write_meta);
@@ -770,7 +738,6 @@
 
 }
 
-
 =head3 distmeta_target
 
     my $make_frag = $mm->distmeta_target;
@@ -1639,8 +1606,200 @@
 
 }
 
+=begin private
+
+=head3 _sort_pairs
+
+    my @pairs = _sort_pairs($sort_sub, \%hash);
+
+Sorts the pairs of a hash based on keys
+ordered according to C<$sort_sub>.
+
+=end private
+
+=cut
+
+sub _sort_pairs {
+    my $k_sort = shift; # a CODE
+    my $hash = shift; # a HASH
+    local *key_sort = $k_sort;
+    my @pairs;
+    push @pairs, ($_, $hash->{$_}) for (sort key_sort keys %$hash);
+    return @pairs
+}
+
+=head3 metafile_data
+
+    my %metadata = $mm->metafile_data;
+
+Returns the data which MakeMaker turns into the META.yml file.
+The pairs at C<EXTRA_META> are added - if they do not
+clash with MakeMaker-generated fields.
+
+This may be overriden for customization purposes.
+
+=cut
+
+sub metafile_data {
+    my $self = shift;
+
+    my @META_FIELDS = qw(name version version_from installdirs abstract license
+                         generated_by author distribution_type requires meta-spec);
+    my @extra;
+    if ($self->{EXTRA_META}) {
+        my @pairs = ref $self->{EXTRA_META} eq 'HASH' ? 
+                       _sort_pairs(sub { $a cmp $ b }, $self->{EXTRA_META}) : 
+                       @{$self->{EXTRA_META}};
+        while (@pairs) {
+            my ($k, $v) = splice @pairs, 0, 2;
+            if (grep { $_ eq $k } @META_FIELDS) {
+                carp "EXTRA_META->{$k} ignored"
+            } else {
+                push @extra, ($k, $v)
+            }
+        }
+    }
+
+    return (
+        name         => $self->{DISTNAME},
+        version      => $self->{VERSION},
+        version_from => $self->{VERSION_FROM},
+        installdirs  => $self->{INSTALLDIRS},
+        abstract     => $self->{ABSTRACT},
+        license      => $self->{LICENSE} || 'unknown',
+        generated_by => 
+                "ExtUtils::MakeMaker version $ExtUtils::MakeMaker::VERSION",
+        author       => $self->{AUTHOR},
+        distribution_type => $self->{PM} ? 'module' : 'script',
+
+        requires     => $self->{PREREQ_PM},
+        @extra,
+        'meta-spec'  => {
+            url      => 'http://module-build.sourceforge.net/META-spec-v1.1.html', 
+            version  => 1.1
+        },
+    );
+
+}
+
+=begin private
+
+=head3 _dump_hash
+
+    $yaml = _dump_hash(\%options, %hash);
+
+Implements a fake YAML dumper for a hash given
+as a list of pairs. No quoting/escaping is done. Keys
+are supposed to be strings. Values are undef, strings, 
+hash refs or array refs of strings.
+
+Supported options are:
+
+    delta => STR - indentation delta
+    use_header => BOOL - 
+    indent => STR - a string of spaces 
+          default: ''
+
+    key_length => INT - an estimate of the max key length,
+            used to align keys and values of the same hash
+        default: no alignment
+    key_sort => CODE - a sort sub 
+            It may be undef, which means no sorting by keys
+        default: sub { $a cmp $b }
+
+    customs => HASH - special options for certain keys 
+           (whose values are hashes themselves)
+        may contain: key_length, key_sort, customs
+
+=end private
+
+=cut
+
+sub _dump_hash {
+    croak "first argument should be a hash ref" unless ref $_[0] eq 'HASH';
+    my $options = shift;
+
+    # Use a list to preserve order.
+    my @pairs;
+
+    my $k_sort = exists $options->{key_sort} ? 
+                        $options->{key_sort} : sub { $a cmp $b };
+    if ($k_sort) {
+        croak "'key_sort' should be a coderef" unless ref $k_sort eq 'CODE';
+        my %hash = @_;
+        @pairs = _sort_pairs($k_sort, \%hash);
+    } else { # no sorting
+        @pairs = @_;
+    }
+
+    my $yaml = $options->{use_header} ? "--- #YAML:1.0\n" : '';
+    my $indent = $options->{indent} || '';
+    my $k_length = $options->{key_length};
+    my $customs = $options->{customs} || {};
+
+    # printf format for key
+    my $k_format = $k_length ? "%-${k_length}s" : "%s";
+
+    while( @pairs ) {
+        my($key, $val) = splice @pairs, 0, 2;
+        $val = '~' unless defined $val;
+        if (ref $val eq 'HASH') {
+            my %k_options = ( # options for recursive call
+                    delta => $options->{delta},
+                    use_header => 0,
+                    indent => $indent . $options->{delta},
+            );
+            if (exists $customs->{$key}) {
+                my %k_custom = %{$customs->{$key}};
+                foreach my $k qw(key_sort key_length customs) {
+                    $k_options{$k} = $k_custom{$k} if exists $k_custom{$k};
+                }
+            }
+            $yaml .= $indent . "$key:\n" 
+                  . _dump_hash(\%k_options, %$val);
+        } elsif (ref $val eq 'ARRAY') {
+            $yaml .= $indent . "$key:\n";
+            for (@$val) {
+                croak "only nested arrays of non-refs are supported" if ref $_;
+                $yaml .= $indent . $options->{delta} . "- $_\n";
+            }
+        } elsif (ref $val) { # nor HASH or ARRAY
+            croak "only nested hashes and arrays are supported";
+        } else {
+            $yaml .= $indent . sprintf "$k_format %s\n", "$key:", $val;
+        }
+    };
+
+    return $yaml;
+
+}
+
+=head3 metafile_file
+
+    my %metayml = $mm->metafile_file(%data);
 
+Turns the metadata given as argument into YAML. 
+This method does not implement a real YAML dumper, 
+being limited to dump a hash with values which are
+strings, undef's or nested hashes and arrays of
+strings. No quoting/escaping is done.
+
+This may be overriden for customization purposes.
+
+=cut
 
+sub metafile_file {
+    my $self = shift;
+    my %dump_options = (
+        use_header => 1, delta => ' ' x 4, 
+        key_length => 20, key_sort => undef,
+        customs => {
+            requires => { key_length => 30, key_sort => sub { lc $a cmp lc $b }, }
+        }
+    );
+    return _dump_hash(\%dump_options, @_);
+
+}
 
 =head2 File::Spec wrappers
 
diff -u -r -N ExtUtils-MakeMaker-6.30_03/lib/ExtUtils/MakeMaker.pm ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm
--- ExtUtils-MakeMaker-6.30_03/lib/ExtUtils/MakeMaker.pm	2006-09-01 18:04:58.000000000 -0300
+++ ExtUtils-MakeMaker/lib/ExtUtils/MakeMaker.pm	2006-09-05 12:50:46.000000000 -0300
@@ -91,6 +91,7 @@
  TYPEMAPS           => 'array',
  XS                 => 'hash',
  _KEEP_AFTER_FLUSH  => '',
+ EXTRA_META         => [ 'hash', 'array' ],
 
  clean      => 'hash',
  depend     => 'hash',
@@ -1462,7 +1463,9 @@
 
 =item EXTRA_META
 
-Extra text to be appended to the generated META.yml.
+Extra key/value pairs to be appended to the generated META.yml.
+It may be a hash or array reference. By default, it cannot
+override MakeMaker generated fields.
 
 =item FIRST_MAKEFILE
 
diff -u -r -N ExtUtils-MakeMaker-6.30_03/t/metafile_file.t ExtUtils-MakeMaker/t/metafile_file.t
--- ExtUtils-MakeMaker-6.30_03/t/metafile_file.t	1969-12-31 21:00:00.000000000 -0300
+++ ExtUtils-MakeMaker/t/metafile_file.t	2006-09-05 11:06:18.000000000 -0300
@@ -0,0 +1,282 @@
+#!/usr/bin/perl -w
+
+# This is a test of the fake YAML dumper implement by EUMM
+
+BEGIN {
+    if( $ENV{PERL_CORE} ) {
+        chdir 't' if -d 't';
+        @INC = ('../lib', 'lib');
+    }
+    else {
+        unshift @INC, 't/lib';
+    }
+}
+
+use strict;
+use Test::More tests => 12;
+
+require ExtUtils::MM_Any;
+
+my $mm = bless {}, 'ExtUtils::MM_Any';
+
+{
+my @meta = ( a => 1, b => 2 );
+my $expected = <<YAML;
+--- #YAML:1.0
+a:                   1
+b:                   2
+YAML
+
+is($mm->metafile_file(@meta), $expected, "dump for flat hashes works ok");
+}
+
+{
+my @meta = ( k1 => 'some key and value', k2 => undef, k3 => 1 );
+my $expected = <<YAML;
+--- #YAML:1.0
+k1:                  some key and value
+k2:                  ~
+k3:                  1
+YAML
+
+is($mm->metafile_file(@meta), $expected, "dumping strings and undefs is ok");
+}
+
+{
+my @meta = ( a => 1, b => 2, h => { hh => 1 } );
+my $expected = <<YAML;
+--- #YAML:1.0
+a:                   1
+b:                   2
+h:
+    hh: 1
+YAML
+
+is($mm->metafile_file(@meta), $expected, "dump for nested hashes works ok");
+}
+
+{
+my @meta = ( a => 1, b => 2, h => { h1 => 'x', h2 => 'z' } );
+my $expected = <<YAML;
+--- #YAML:1.0
+a:                   1
+b:                   2
+h:
+    h1: x
+    h2: z
+YAML
+
+is($mm->metafile_file(@meta), $expected, "nested hashes sort ascii-betically");
+}
+
+{
+my @meta = ( a => 1, b => 2, h => { hh => { hhh => 1 } } );
+my $expected = <<YAML;
+--- #YAML:1.0
+a:                   1
+b:                   2
+h:
+    hh:
+        hhh: 1
+YAML
+
+is($mm->metafile_file(@meta), $expected, "dump for hashes (with more nesting) works ok");
+}
+
+{
+my @meta = ( a => 1, k => [ qw(w y z) ] );
+my $expected = <<YAML;
+--- #YAML:1.0
+a:                   1
+k:
+    - w
+    - y
+    - z
+YAML
+
+is($mm->metafile_file(@meta), $expected, "array of strings are handled ok");
+}
+
+{
+my @meta = ( 
+    name => 'My-Module',
+    version => '0.1',
+    version_from => 'lib/My/Module.pm',
+    installdirs => 'site',
+    abstract => 'A does-it-all module',
+    license => 'perl',
+    generated_by => 'myself',
+    author => 'John Doe <doe@doeland.org>',
+    distribution_type => 'module',
+    requires => {
+        'My::Module::Helper' => 0,
+        'Your::Module' => '1.5',
+    },
+    'meta-spec' => {
+         version => '1.1',
+         url => 'http://module-build.sourceforge.net/META-spec-new.html',
+    },
+);
+my $expected = <<'YAML';
+--- #YAML:1.0
+name:                My-Module
+version:             0.1
+version_from:        lib/My/Module.pm
+installdirs:         site
+abstract:            A does-it-all module
+license:             perl
+generated_by:        myself
+author:              John Doe <doe@doeland.org>
+distribution_type:   module
+requires:
+    My::Module::Helper:            0
+    Your::Module:                  1.5
+meta-spec:
+    url: http://module-build.sourceforge.net/META-spec-new.html
+    version: 1.1
+YAML
+
+is($mm->metafile_file(@meta), $expected, "dump for something like META.yml works");
+}
+
+{
+my @meta = ( 
+    name => 'My-Module',
+    version => '0.1',
+    version_from => 'lib/My/Module.pm',
+    installdirs => 'site',
+    abstract => 'A does-it-all module',
+    license => 'perl',
+    generated_by => 'myself',
+    author => 'John Doe <doe@doeland.org>',
+    distribution_type => 'module',
+    requires => {
+        'My::Module::Helper' => 0,
+        'Your::Module' => '1.5',
+    },
+    recommends => {
+        'Test::More' => 0,
+        'Test::Pod'  => 1.18,
+        'Test::Pod::Coverage' => 1
+    },
+    'meta-spec' => {
+         version => '1.1',
+         url => 'http://module-build.sourceforge.net/META-spec-new.html',
+    },
+);
+my $expected = <<'YAML';
+--- #YAML:1.0
+name:                My-Module
+version:             0.1
+version_from:        lib/My/Module.pm
+installdirs:         site
+abstract:            A does-it-all module
+license:             perl
+generated_by:        myself
+author:              John Doe <doe@doeland.org>
+distribution_type:   module
+requires:
+    My::Module::Helper:            0
+    Your::Module:                  1.5
+recommends:
+    Test::More: 0
+    Test::Pod: 1.18
+    Test::Pod::Coverage: 1
+meta-spec:
+    url: http://module-build.sourceforge.net/META-spec-new.html
+    version: 1.1
+YAML
+
+is($mm->metafile_file(@meta), $expected, "META.yml with extra 'recommends' works");
+}
+
+{
+my @meta = ( 
+    name => 'My-Module',
+    version => '0.1',
+    version_from => 'lib/My/Module.pm',
+    installdirs => 'site',
+    abstract => 'A does-it-all module',
+    license => 'perl',
+    generated_by => 'myself',
+    author => 'John Doe <doe@doeland.org>',
+    distribution_type => 'module',
+    requires => {
+        'My::Module::Helper' => 0,
+        'Your::Module' => '1.5',
+    },
+    recommends => {
+        'Test::More' => 0,
+        'Test::Pod'  => 1.18,
+        'Test::Pod::Coverage' => 1
+    },
+    no_index => {
+        dir => [ qw(inc) ],
+        file => [ qw(TODO NOTES) ],
+    },
+    'meta-spec' => {
+         version => '1.1',
+         url => 'http://module-build.sourceforge.net/META-spec-new.html',
+    },
+);
+my $expected = <<'YAML';
+--- #YAML:1.0
+name:                My-Module
+version:             0.1
+version_from:        lib/My/Module.pm
+installdirs:         site
+abstract:            A does-it-all module
+license:             perl
+generated_by:        myself
+author:              John Doe <doe@doeland.org>
+distribution_type:   module
+requires:
+    My::Module::Helper:            0
+    Your::Module:                  1.5
+recommends:
+    Test::More: 0
+    Test::Pod: 1.18
+    Test::Pod::Coverage: 1
+no_index:
+    dir:
+        - inc
+    file:
+        - TODO
+        - NOTES
+meta-spec:
+    url: http://module-build.sourceforge.net/META-spec-new.html
+    version: 1.1
+YAML
+
+is($mm->metafile_file(@meta), $expected, "META.yml with extra 'no_index' works");
+}
+
+{
+my @meta = ( k => 'a : b', 'x : y' => 1 );
+my $expected = <<YAML;
+--- #YAML:1.0
+k:                   a : b
+x : y:               1
+YAML
+# NOTE: the output is not YAML-equivalent to the input
+
+is($mm->metafile_file(@meta), $expected, "no quoting is done");
+}
+
+{
+my @meta = ( k => \*STDOUT );
+eval { $mm->metafile_file(@meta) };
+
+like($@, qr/^only nested hashes and arrays are supported/, 
+         "we don't like but hash/array refs");
+}
+
+{
+my @meta = ( k => [ [] ] );
+eval { $mm->metafile_file(@meta) };
+
+like($@, qr/^only nested arrays of non-refs are supported/, 
+         "we also don't like but array of strings");
+}
+
+# recursive data structures: don't even think about it - endless recursion
