Hash-Merge-Extra-0.06/0000755000175000017500000000000013222704362013465 5ustar mixasmixasHash-Merge-Extra-0.06/lib/0000755000175000017500000000000013222704362014233 5ustar mixasmixasHash-Merge-Extra-0.06/lib/Hash/0000755000175000017500000000000013222704362015116 5ustar mixasmixasHash-Merge-Extra-0.06/lib/Hash/Merge/0000755000175000017500000000000013222704362016155 5ustar mixasmixasHash-Merge-Extra-0.06/lib/Hash/Merge/Extra.pm0000644000175000017500000001255613222703521017603 0ustar mixasmixaspackage Hash::Merge::Extra;
use strict;
use warnings FATAL => 'all';
use Hash::Merge qw(_merge_hashes);
our $VERSION = '0.06'; # Don't forget to change in pod below
use constant L_ADDITIVE => {
'SCALAR' => {
'SCALAR' => sub { defined $_[0] ? $_[0] : $_[1] },
'ARRAY' => sub { defined $_[0] ? $_[0] : $_[1] },
'HASH' => sub { defined $_[0] ? $_[0] : $_[1] },
},
'ARRAY' => {
'SCALAR' => sub { $_[0] },
'ARRAY' => sub { [ @{$_[0]}, @{$_[1]} ] },
'HASH' => sub { $_[0] },
},
'HASH' => {
'SCALAR' => sub { $_[0] },
'ARRAY' => sub { $_[0] },
'HASH' => sub { _merge_hashes(@_) },
},
};
use constant R_ADDITIVE => {
'SCALAR' => {
'SCALAR' => sub { defined $_[1] ? $_[1] : $_[0] },
'ARRAY' => sub { $_[1] },
'HASH' => sub { $_[1] },
},
'ARRAY' => {
'SCALAR' => sub { defined $_[1] ? $_[1] : $_[0] },
'ARRAY' => sub { [ @{$_[1]}, @{$_[0]} ] },
'HASH' => sub { $_[1] },
},
'HASH' => {
'SCALAR' => sub { defined $_[1] ? $_[1] : $_[0] },
'ARRAY' => sub { $_[1] },
'HASH' => sub { _merge_hashes(@_) },
},
};
use constant L_OVERRIDE => {
'SCALAR' => {
'SCALAR' => sub { $_[0] },
'ARRAY' => sub { $_[0] },
'HASH' => sub { $_[0] },
},
'ARRAY' => {
'SCALAR' => sub { $_[0] },
'ARRAY' => sub { $_[0] },
'HASH' => sub { $_[0] },
},
'HASH' => {
'SCALAR' => sub { $_[0] },
'ARRAY' => sub { $_[0] },
'HASH' => sub { _merge_hashes(@_) },
},
};
use constant R_OVERRIDE => {
'SCALAR' => {
'SCALAR' => sub { $_[1] },
'ARRAY' => sub { $_[1] },
'HASH' => sub { $_[1] },
},
'ARRAY' => {
'SCALAR' => sub { $_[1] },
'ARRAY' => sub { $_[1] },
'HASH' => sub { $_[1] },
},
'HASH' => {
'SCALAR' => sub { $_[1] },
'ARRAY' => sub { $_[1] },
'HASH' => sub { _merge_hashes(@_) },
},
};
use constant L_REPLACE => {
'SCALAR' => {
'SCALAR' => sub { $_[0] },
'ARRAY' => sub { $_[0] },
'HASH' => sub { $_[0] },
},
'ARRAY' => {
'SCALAR' => sub { $_[0] },
'ARRAY' => sub { $_[0] },
'HASH' => sub { $_[0] },
},
'HASH' => {
'SCALAR' => sub { $_[0] },
'ARRAY' => sub { $_[0] },
'HASH' => sub { $_[0] },
},
};
use constant R_REPLACE => {
'SCALAR' => {
'SCALAR' => sub { $_[1] },
'ARRAY' => sub { $_[1] },
'HASH' => sub { $_[1] },
},
'ARRAY' => {
'SCALAR' => sub { $_[1] },
'ARRAY' => sub { $_[1] },
'HASH' => sub { $_[1] },
},
'HASH' => {
'SCALAR' => sub { $_[1] },
'ARRAY' => sub { $_[1] },
'HASH' => sub { $_[1] },
},
};
my %INDEX = (
L_ADDITIVE => L_ADDITIVE,
L_OVERRIDE => L_OVERRIDE,
L_REPLACE => L_REPLACE,
R_ADDITIVE => R_ADDITIVE,
R_OVERRIDE => R_OVERRIDE,
R_REPLACE => R_REPLACE,
);
sub import {
shift; # throw off package name
for (@_ ? @_ : keys %INDEX) {
unless (exists $INDEX{$_}) {
require Carp;
Carp::croak "Unable to register $_ (no such behavior)";
}
Hash::Merge::specify_behavior($INDEX{$_}, $_);
}
}
1;
__END__
=head1 NAME
Hash::Merge::Extra - Collection of extra behaviors for L
=begin html
=end html
=head1 VERSION
Version 0.06
=head1 SYNOPSIS
use Hash::Merge qw(merge);
use Hash::Merge::Extra;
Hash::Merge::set_behavior('R_OVERRIDE');
$result = merge($left, $right);
=head1 EXPORT
Nothing is exported.
All behaviors registered in L if used as
use Hash::Merge::Extra;
Nothing registered if passed empty list:
use Hash::Merge::Extra qw();
Only specified behaviors registered if list defined:
use Hash::Merge::Extra qw(L_OVERRIDE R_REPLACE);
=head1 BEHAVIORS
=over 4
=item B, B
Hashes merged, arrays joined, undefined scalars overrided. Left and right
precedence.
=item B, B
Hashes merged, arrays and scalars overrided. Left and right precedence.
=item B, B
Nothing merged. One thing simply replaced by another. Left and right
precedence.
=back
=head1 AUTHOR
Michael Samoglyadov, C<< >>
=head1 BUGS
Please report any bugs or feature requests to
L
=head1 SEE ALSO
L
=head1 LICENSE AND COPYRIGHT
Copyright 2017,2018 Michael Samoglyadov.
This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.
See L for more information.
=cut
Hash-Merge-Extra-0.06/META.yml0000644000175000017500000000117113222704362014736 0ustar mixasmixas---
abstract: 'Collection of extra behaviors for L'
author:
- 'Michael Samoglyadov '
build_requires:
Test::More: 0
configure_requires:
ExtUtils::MakeMaker: 0
dynamic_config: 1
generated_by: 'ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.133380'
license: perl
meta-spec:
url: http://module-build.sourceforge.net/META-spec-v1.4.html
version: 1.4
name: Hash-Merge-Extra
no_index:
directory:
- t
- inc
requires:
Hash::Merge: 0
parent: 0
perl: 5.006
strict: 0
warnings: 0
resources:
repository: https://github.com/mr-mixas/Hash-Merge-Extra.pm
version: 0.06
Hash-Merge-Extra-0.06/Makefile.PL0000644000175000017500000000170613134354432015444 0ustar mixasmixasuse 5.006;
use strict;
use warnings FATAL => 'all';
use ExtUtils::MakeMaker;
WriteMakefile(
NAME => 'Hash::Merge::Extra',
AUTHOR => 'Michael Samoglyadov ',
VERSION_FROM => 'lib/Hash/Merge/Extra.pm',
ABSTRACT_FROM => 'lib/Hash/Merge/Extra.pm',
LICENSE => 'Perl_5',
PL_FILES => {},
MIN_PERL_VERSION => 5.006,
CONFIGURE_REQUIRES => {
'ExtUtils::MakeMaker' => 0,
},
BUILD_REQUIRES => {
'Test::More' => 0,
},
META_MERGE => {
resources => {
repository => 'https://github.com/mr-mixas/Hash-Merge-Extra.pm',
},
},
PREREQ_PM => {
'parent' => 0,
'strict' => 0,
'warnings' => 0,
'Hash::Merge' => 0,
},
dist => {
COMPRESS => 'gzip -9f',
SUFFIX => 'gz',
},
clean => {
FILES => 'Hash-Merge-Extra-* cover_db'
},
);
Hash-Merge-Extra-0.06/Changes0000644000175000017500000000102713222704255014761 0ustar mixasmixasRevision history for Hash-Merge-Extra
0.06 2018-01-02
- {L,R}_MERGE_PATCH removed (impossible to remove hash items
using Hash::Merge)
- dist corrected
0.05 2017-12-15
- {L,R}_JSON_MERGE_PATCH behaviors renamed to {L,R}_MERGE_PATCH
0.04 2017-11-25
- L_JSON_MERGE_PATCH and R_JSON_MERGE_PATCH behaviors added (rfc7386)
0.03 2017-08-14
- docs improved
0.02 2017-08-04
- L_ADDITIVE and R_ADDITIVE behaviors added
0.01 2017-07-22
- Initial release.
Hash-Merge-Extra-0.06/META.json0000644000175000017500000000215713222704362015113 0ustar mixasmixas{
"abstract" : "Collection of extra behaviors for L",
"author" : [
"Michael Samoglyadov "
],
"dynamic_config" : 1,
"generated_by" : "ExtUtils::MakeMaker version 6.66, CPAN::Meta::Converter version 2.133380",
"license" : [
"perl_5"
],
"meta-spec" : {
"url" : "http://search.cpan.org/perldoc?CPAN::Meta::Spec",
"version" : "2"
},
"name" : "Hash-Merge-Extra",
"no_index" : {
"directory" : [
"t",
"inc"
]
},
"prereqs" : {
"build" : {
"requires" : {
"Test::More" : "0"
}
},
"configure" : {
"requires" : {
"ExtUtils::MakeMaker" : "0"
}
},
"runtime" : {
"requires" : {
"Hash::Merge" : "0",
"parent" : "0",
"perl" : "5.006",
"strict" : "0",
"warnings" : "0"
}
}
},
"release_status" : "stable",
"resources" : {
"repository" : {
"url" : "https://github.com/mr-mixas/Hash-Merge-Extra.pm"
}
},
"version" : "0.06"
}
Hash-Merge-Extra-0.06/MANIFEST0000644000175000017500000000057113222704362014621 0ustar mixasmixasChanges
lib/Hash/Merge/Extra.pm
Makefile.PL
MANIFEST
README
t/00-load.t
t/L_ADDITIVE.t
t/L_OVERRIDE.t
t/L_REPLACE.t
t/R_ADDITIVE.t
t/R_OVERRIDE.t
t/R_REPLACE.t
t/import.t
t/manifest.t
t/pod-coverage.t
t/pod.t
META.yml Module YAML meta-data (added by MakeMaker)
META.json Module JSON meta-data (added by MakeMaker)
Hash-Merge-Extra-0.06/t/0000755000175000017500000000000013222704362013730 5ustar mixasmixasHash-Merge-Extra-0.06/t/import.t0000644000175000017500000000036413215022037015424 0ustar mixasmixas#!perl -T
use strict;
use warnings FATAL => 'all';
use Test::More tests => 1;
eval "use Hash::Merge::Extra qw(NOT_EXISTS)";
like(
$@,
qr/^Unable to register NOT_EXISTS \(no such behavior\) /,
"Must croak for absent behaviors"
);
Hash-Merge-Extra-0.06/t/manifest.t0000644000175000017500000000050713215022037015717 0ustar mixasmixas#!perl -T
use 5.006;
use strict;
use warnings FATAL => 'all';
use Test::More;
unless ( $ENV{RELEASE_TESTING} ) {
plan( skip_all => "Author tests not required for installation" );
}
my $min_tcm = 0.9;
eval "use Test::CheckManifest $min_tcm";
plan skip_all => "Test::CheckManifest $min_tcm required" if $@;
ok_manifest();
Hash-Merge-Extra-0.06/t/pod.t0000644000175000017500000000040113215022037014664 0ustar mixasmixas#!perl -T
use 5.006;
use strict;
use warnings FATAL => 'all';
use Test::More;
# Ensure a recent version of Test::Pod
my $min_tp = 1.22;
eval "use Test::Pod $min_tp";
plan skip_all => "Test::Pod $min_tp required for testing POD" if $@;
all_pod_files_ok();
Hash-Merge-Extra-0.06/t/R_REPLACE.t0000644000175000017500000000272513215022037015451 0ustar mixasmixas#!perl -T
use strict;
use warnings FATAL => 'all';
use Test::More;
use Hash::Merge qw(merge);
use Hash::Merge::Extra;
ok(
Hash::Merge::set_behavior('R_REPLACE')
) || BAIL_OUT('Failed to set behavior');
my ($got, @tests);
@tests = (
{
one => 'alpha',
two => 'beta',
out => 'beta',
msg => "scalar vs scalar",
},
{
one => 'alpha',
two => [],
out => [],
msg => "scalar vs array",
},
{
one => 'alpha',
two => {},
out => {},
msg => "scalar vs hash",
},
{
one => [0, 1],
two => 'beta',
out => 'beta',
msg => "array vs scalar",
},
{
one => [0, 1],
two => [1, 2],
out => [1, 2],
msg => "array vs array",
},
{
one => [0, 1],
two => {a => 0, b => 1},
out => {a => 0, b => 1},
msg => "array vs hash",
},
{
one => {a => 0, b => 1},
two => 'beta',
out => 'beta',
msg => "hash vs scalar",
},
{
one => {a => 0, b => 1},
two => [1, 2],
out => [1, 2],
msg => "hash vs array",
},
{
one => {a => 0, b => 1},
two => {a => 9, c => 2},
out => {a => 9, c => 2},
msg => "hash vs hash",
},
);
for (@tests) {
$got = merge($_->{one}, $_->{two});
is_deeply($got, $_->{out}, $_->{msg}) ||
diag explain $got;
}
done_testing(@tests + 1);
Hash-Merge-Extra-0.06/t/L_REPLACE.t0000644000175000017500000000275213215022037015443 0ustar mixasmixas#!perl -T
use strict;
use warnings FATAL => 'all';
use Test::More;
use Hash::Merge qw(merge);
use Hash::Merge::Extra;
ok(
Hash::Merge::set_behavior('L_REPLACE')
) || BAIL_OUT('Failed to set behavior');
my ($got, @tests);
@tests = (
{
one => 'alpha',
two => 'beta',
out => 'alpha',
msg => "scalar vs scalar",
},
{
one => 'alpha',
two => [],
out => 'alpha',
msg => "scalar vs array",
},
{
one => 'alpha',
two => {},
out => 'alpha',
msg => "scalar vs hash",
},
{
one => [0, 1],
two => 'beta',
out => [0, 1],
msg => "array vs scalar",
},
{
one => [0, 1],
two => [1, 2],
out => [0, 1],
msg => "array vs array",
},
{
one => [0, 1],
two => {a => 0, b => 1},
out => [0, 1],
msg => "array vs hash",
},
{
one => {a => 0, b => 1},
two => 'beta',
out => {a => 0, b => 1},
msg => "hash vs scalar",
},
{
one => {a => 0, b => 1},
two => [1, 2],
out => {a => 0, b => 1},
msg => "hash vs array",
},
{
one => {a => 0, b => 1},
two => {a => 9, c => 2},
out => {a => 0, b => 1},
msg => "hash vs hash",
},
);
for (@tests) {
$got = merge($_->{one}, $_->{two});
is_deeply($got, $_->{out}, $_->{msg}) ||
diag explain $got;
}
done_testing(@tests + 1);
Hash-Merge-Extra-0.06/t/L_ADDITIVE.t0000644000175000017500000000347713215022037015566 0ustar mixasmixas#!perl -T
use strict;
use warnings FATAL => 'all';
use Test::More;
use Hash::Merge qw(merge);
use Hash::Merge::Extra;
ok(
Hash::Merge::set_behavior('L_ADDITIVE')
) || BAIL_OUT('Failed to set behavior');
my ($got, @tests);
@tests = (
{
one => undef,
two => 'beta',
out => 'beta',
msg => "undef vs scalar",
},
{
one => undef,
two => [],
out => [],
msg => "undef vs array",
},
{
one => undef,
two => {},
out => {},
msg => "undef vs hash",
},
{
one => 'alpha',
two => 'beta',
out => 'alpha',
msg => "scalar vs scalar",
},
{
one => 'alpha',
two => [],
out => 'alpha',
msg => "scalar vs array",
},
{
one => 'alpha',
two => {},
out => 'alpha',
msg => "scalar vs hash",
},
{
one => [0, 1],
two => 'beta',
out => [0, 1],
msg => "array vs scalar",
},
{
one => [0, 1],
two => [1, 2],
out => [0, 1, 1, 2],
msg => "array vs array",
},
{
one => [0, 1],
two => {a => 0, b => 1},
out => [0, 1],
msg => "array vs hash",
},
{
one => {a => 0, b => 1},
two => 'beta',
out => {a => 0, b => 1},
msg => "hash vs scalar",
},
{
one => {a => 0, b => 1},
two => [1, 2],
out => {a => 0, b => 1},
msg => "hash vs array",
},
{
one => {a => 0, b => 1},
two => {a => 9, c => 2},
out => {a => 0, b => 1, c => 2},
msg => "hash vs hash",
},
);
for (@tests) {
$got = merge($_->{one}, $_->{two});
is_deeply($got, $_->{out}, $_->{msg}) ||
diag explain $got;
}
done_testing(@tests + 1);
Hash-Merge-Extra-0.06/t/R_OVERRIDE.t0000644000175000017500000000273613215022037015617 0ustar mixasmixas#!perl -T
use strict;
use warnings FATAL => 'all';
use Test::More;
use Hash::Merge qw(merge);
use Hash::Merge::Extra;
ok(
Hash::Merge::set_behavior('R_OVERRIDE')
) || BAIL_OUT('Failed to set behavior');
my ($got, @tests);
@tests = (
{
one => 'alpha',
two => 'beta',
out => 'beta',
msg => "scalar vs scalar",
},
{
one => 'alpha',
two => [],
out => [],
msg => "scalar vs array",
},
{
one => 'alpha',
two => {},
out => {},
msg => "scalar vs hash",
},
{
one => [0, 1],
two => 'beta',
out => 'beta',
msg => "array vs scalar",
},
{
one => [0, 1],
two => [1, 2],
out => [1, 2],
msg => "array vs array",
},
{
one => [0, 1],
two => {a => 0, b => 1},
out => {a => 0, b => 1},
msg => "array vs hash",
},
{
one => {a => 0, b => 1},
two => 'beta',
out => 'beta',
msg => "hash vs scalar",
},
{
one => {a => 0, b => 1},
two => [1, 2],
out => [1, 2],
msg => "hash vs array",
},
{
one => {a => 0, b => 1},
two => {a => 9, c => 2},
out => {a => 9, b => 1, c => 2},
msg => "hash vs hash",
},
);
for (@tests) {
$got = merge($_->{one}, $_->{two});
is_deeply($got, $_->{out}, $_->{msg}) ||
diag explain $got;
}
done_testing(@tests + 1);
Hash-Merge-Extra-0.06/t/pod-coverage.t0000644000175000017500000000111313215022037016456 0ustar mixasmixas#!perl -T
use 5.006;
use strict;
use warnings FATAL => 'all';
use Test::More;
# Ensure a recent version of Test::Pod::Coverage
my $min_tpc = 1.08;
eval "use Test::Pod::Coverage $min_tpc";
plan skip_all => "Test::Pod::Coverage $min_tpc required for testing POD coverage"
if $@;
# Test::Pod::Coverage doesn't require a minimum Pod::Coverage version,
# but older versions don't recognize some common documentation styles
my $min_pc = 0.18;
eval "use Pod::Coverage $min_pc";
plan skip_all => "Pod::Coverage $min_pc required for testing POD coverage"
if $@;
all_pod_coverage_ok();
Hash-Merge-Extra-0.06/t/R_ADDITIVE.t0000644000175000017500000000345413215022037015567 0ustar mixasmixas#!perl -T
use strict;
use warnings FATAL => 'all';
use Test::More;
use Hash::Merge qw(merge);
use Hash::Merge::Extra;
ok(
Hash::Merge::set_behavior('R_ADDITIVE')
) || BAIL_OUT('Failed to set behavior');
my ($got, @tests);
@tests = (
{
one => 'alpha',
two => undef,
out => 'alpha',
msg => "scalar vs undef",
},
{
one => 'alpha',
two => 'beta',
out => 'beta',
msg => "scalar vs scalar",
},
{
one => 'alpha',
two => [],
out => [],
msg => "scalar vs array",
},
{
one => 'alpha',
two => {},
out => {},
msg => "scalar vs hash",
},
{
one => [],
two => undef,
out => [],
msg => "array vs undef",
},
{
one => [0, 1],
two => 'beta',
out => 'beta',
msg => "array vs scalar",
},
{
one => [0, 1],
two => [1, 2],
out => [1, 2, 0, 1],
msg => "array vs array",
},
{
one => [0, 1],
two => {a => 0, b => 1},
out => {a => 0, b => 1},
msg => "array vs hash",
},
{
one => {},
two => undef,
out => {},
msg => "hash vs undef",
},
{
one => {a => 0, b => 1},
two => 'beta',
out => 'beta',
msg => "hash vs scalar",
},
{
one => {a => 0, b => 1},
two => [1, 2],
out => [1, 2],
msg => "hash vs array",
},
{
one => {a => 0, b => 1},
two => {a => 9, c => 2},
out => {a => 9, b => 1, c => 2},
msg => "hash vs hash",
},
);
for (@tests) {
$got = merge($_->{one}, $_->{two});
is_deeply($got, $_->{out}, $_->{msg}) ||
diag explain $got;
}
done_testing(@tests + 1);
Hash-Merge-Extra-0.06/t/L_OVERRIDE.t0000644000175000017500000000276313215022037015611 0ustar mixasmixas#!perl -T
use strict;
use warnings FATAL => 'all';
use Test::More;
use Hash::Merge qw(merge);
use Hash::Merge::Extra;
ok(
Hash::Merge::set_behavior('L_OVERRIDE')
) || BAIL_OUT('Failed to set behavior');
my ($got, @tests);
@tests = (
{
one => 'alpha',
two => 'beta',
out => 'alpha',
msg => "scalar vs scalar",
},
{
one => 'alpha',
two => [],
out => 'alpha',
msg => "scalar vs array",
},
{
one => 'alpha',
two => {},
out => 'alpha',
msg => "scalar vs hash",
},
{
one => [0, 1],
two => 'beta',
out => [0, 1],
msg => "array vs scalar",
},
{
one => [0, 1],
two => [1, 2],
out => [0, 1],
msg => "array vs array",
},
{
one => [0, 1],
two => {a => 0, b => 1},
out => [0, 1],
msg => "array vs hash",
},
{
one => {a => 0, b => 1},
two => 'beta',
out => {a => 0, b => 1},
msg => "hash vs scalar",
},
{
one => {a => 0, b => 1},
two => [1, 2],
out => {a => 0, b => 1},
msg => "hash vs array",
},
{
one => {a => 0, b => 1},
two => {a => 9, c => 2},
out => {a => 0, b => 1, c => 2},
msg => "hash vs hash",
},
);
for (@tests) {
$got = merge($_->{one}, $_->{two});
is_deeply($got, $_->{out}, $_->{msg}) ||
diag explain $got;
}
done_testing(@tests + 1);
Hash-Merge-Extra-0.06/t/00-load.t0000644000175000017500000000037013215022037015243 0ustar mixasmixas#!perl -T
use 5.006;
use strict;
use warnings FATAL => 'all';
use Test::More;
plan tests => 1;
BEGIN {
use_ok( 'Hash::Merge::Extra' ) || print "Bail out!\n";
}
diag( "Testing Hash::Merge::Extra $Hash::Merge::Extra::VERSION, Perl $], $^X" );
Hash-Merge-Extra-0.06/README0000644000175000017500000000207713222703502014346 0ustar mixasmixasHash-Merge-Extra
Hash::Merge::Extra - Collection of extra behaviors for Hash::Merge
INSTALLATION
To install this module, run the following commands:
perl Makefile.PL
make
make test
make install
SUPPORT AND DOCUMENTATION
After installing, you can find documentation for this module with the
perldoc command.
perldoc Hash::Merge::Extra
You can also look for information at:
RT, CPAN's request tracker (report bugs here)
http://rt.cpan.org/NoAuth/Bugs.html?Dist=Hash-Merge-Extra
AnnoCPAN, Annotated CPAN documentation
http://annocpan.org/dist/Hash-Merge-Extra
CPAN Ratings
http://cpanratings.perl.org/d/Hash-Merge-Extra
Search CPAN
http://search.cpan.org/dist/Hash-Merge-Extra/
LICENSE AND COPYRIGHT
Copyright (C) 2017,2018 Michael Samoglyadov
This program is free software; you can redistribute it and/or modify it
under the terms of either: the GNU General Public License as published
by the Free Software Foundation; or the Artistic License.
See L for more information.