diff options
Diffstat (limited to 'Master/tlpkg/tlperl/lib/CPAN/Meta/Merge.pm')
-rw-r--r-- | Master/tlpkg/tlperl/lib/CPAN/Meta/Merge.pm | 68 |
1 files changed, 61 insertions, 7 deletions
diff --git a/Master/tlpkg/tlperl/lib/CPAN/Meta/Merge.pm b/Master/tlpkg/tlperl/lib/CPAN/Meta/Merge.pm index 05a18ea9732..3604eae4022 100644 --- a/Master/tlpkg/tlperl/lib/CPAN/Meta/Merge.pm +++ b/Master/tlpkg/tlperl/lib/CPAN/Meta/Merge.pm @@ -3,7 +3,7 @@ use warnings; package CPAN::Meta::Merge; -our $VERSION = '2.150005'; +our $VERSION = '2.150010'; use Carp qw/croak/; use Scalar::Util qw/blessed/; @@ -73,7 +73,7 @@ sub _uniq_map { return $left; } -sub _improvize { +sub _improvise { my ($left, $right, $path) = @_; my ($name) = reverse @{$path}; if ($name =~ /^x_/) { @@ -154,9 +154,9 @@ my %default = ( homepage => \&_identical, bugtracker => \&_uniq_map, repository => \&_uniq_map, - ':default' => \&_improvize, + ':default' => \&_improvise, }, - ':default' => \&_improvize, + ':default' => \&_improvise, ); sub new { @@ -182,7 +182,8 @@ my %coderef_for = ( set_addition => \&_set_addition, uniq_map => \&_uniq_map, identical => \&_identical, - improvize => \&_improvize, + improvise => \&_improvise, + improvize => \&_improvise, # [sic] for backwards compatibility ); sub _coerce_mapping { @@ -250,7 +251,7 @@ CPAN::Meta::Merge - Merging CPAN Meta fragments =head1 VERSION -version 2.150005 +version 2.150010 =head1 SYNOPSIS @@ -268,11 +269,60 @@ argument, C<version>, declaring the version of the meta-spec that must be used for the merge. It can optionally take an C<extra_mappings> argument that allows one to add additional merging functions for specific elements. +The C<extra_mappings> arguments takes a hash ref with the same type of +structure as described in L<CPAN::Meta::Spec>, except with its values as +one of the L<defined merge strategies|/"MERGE STRATEGIES"> or a code ref +to a merging function. + + my $merger = CPAN::Meta::Merge->new( + default_version => '2', + extra_mappings => { + 'optional_features' => \&custom_merge_function, + 'x_custom' => 'set_addition', + 'x_meta_meta' => { + name => 'identical', + tags => 'set_addition', + } + } + ); + =head2 merge(@fragments) Merge all C<@fragments> together. It will accept both CPAN::Meta objects and (possibly incomplete) hashrefs of metadata. +=head1 MERGE STRATEGIES + +C<merge> uses various strategies to combine different elements of the CPAN::Meta objects. The following strategies can be used with the extra_mappings argument of C<new>: + +=over + +=item identical + +The elements must be identical + +=item set_addition + +The union of two array refs + + [ a, b ] U [ a, c] = [ a, b, c ] + +=item uniq_map + +Key value pairs from the right hash are merged to the left hash. Key +collisions are only allowed if their values are the same. This merge +function will recurse into nested hash refs following the same merge +rules. + +=item improvise + +This merge strategy will try to pick the appropriate predefined strategy +based on what element type. Array refs will try to use the +C<set_addition> strategy, Hash refs will try to use the C<uniq_map> +strategy, and everything else will try the C<identical> strategy. + +=back + =head1 AUTHORS =over 4 @@ -285,11 +335,15 @@ David Golden <dagolden@cpan.org> Ricardo Signes <rjbs@cpan.org> +=item * + +Adam Kennedy <adamk@cpan.org> + =back =head1 COPYRIGHT AND LICENSE -This software is copyright (c) 2010 by David Golden and Ricardo Signes. +This software is copyright (c) 2010 by David Golden, Ricardo Signes, Adam Kennedy and Contributors. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. |