Load XML-Feed-0.01 into trunk.
[catagits/XML-Feed.git] / inc / Module / Install / Metadata.pm
CommitLineData
0d5e38d1 1#line 1 "inc/Module/Install/Metadata.pm - /Library/Perl/5.8.1/Module/Install/Metadata.pm"
2# $File: //depot/cpan/Module-Install/lib/Module/Install/Metadata.pm $ $Author: autrijus $
3# $Revision: #32 $ $Change: 1885 $ $DateTime: 2004/03/11 05:55:27 $ vim: expandtab shiftwidth=4
4
5package Module::Install::Metadata;
6use Module::Install::Base; @ISA = qw(Module::Install::Base);
7
8$VERSION = '0.04';
9
10use strict 'vars';
11use vars qw($VERSION);
12
13sub Meta { shift }
14
15my @scalar_keys = qw(
16 name module_name version abstract author license
17 distribution_type sign perl_version
18);
19my @tuple_keys = qw(build_requires requires recommends bundles);
20
21foreach my $key (@scalar_keys) {
22 *$key = sub {
23 my $self = shift;
24 return $self->{'values'}{$key} unless @_;
25 $self->{'values'}{$key} = shift;
26 return $self;
27 };
28}
29
30foreach my $key (@tuple_keys) {
31 *$key = sub {
32 my $self = shift;
33 return $self->{'values'}{$key} unless @_;
34 my @rv;
35 while (@_) {
36 my $module = shift or last;
37 my $version = shift || 0;
38 if ($module eq 'perl') {
39 $version =~ s{^(\d+)\.(\d+)\.(\d+)}
40 {$1 + $2/1_000 + $3/1_000_000}e;
41 $self->perl_version($version);
42 next;
43 }
44 my $rv = [$module, $version];
45 push @{$self->{'values'}{$key}}, $rv;
46 push @rv, $rv;
47 }
48 return @rv;
49 };
50}
51
52sub features {
53 my $self = shift;
54 while (my ($name, $mods) = splice(@_, 0, 2)) {
55 my $count = 0;
56 push @{$self->{'values'}{'features'}}, ($name => [
57 map { (++$count % 2 and ref($_) and ($count += $#$_)) ? @$_ : $_ } @$mods
58 ] );
59 }
60 return @{$self->{'values'}{'features'}};
61}
62
63sub no_index {
64 my $self = shift;
65 my $type = shift;
66 push @{$self->{'values'}{'no_index'}{$type}}, @_ if $type;
67 return $self->{'values'}{'no_index'};
68}
69
70sub _dump {
71 my $self = shift;
72 my $package = ref($self->_top);
73 my $version = $self->_top->VERSION;
74 my %values = %{$self->{'values'}};
75
76 delete $values{sign};
77 if (my $perl_version = delete $values{perl_version}) {
78 # Always canonical to three-dot version
79 $perl_version =~ s{^(\d+)\.(\d\d\d)(\d*)}{join('.', $1, int($2), int($3))}e
80 if $perl_version >= 5.006;
81 $values{requires} = [
82 [perl => $perl_version],
83 @{$values{requires}||[]},
84 ];
85 }
86
87 warn "No license specified, setting license = 'unknown'\n"
88 unless $values{license};
89
90 $values{license} ||= 'unknown';
91 $values{distribution_type} ||= 'module';
92 $values{name} ||= do {
93 my $name = $values{module_name};
94 $name =~ s/::/-/g;
95 $name;
96 } if $values{module_name};
97
98 if ($values{name} =~ /::/) {
99 my $name = $values{name};
100 $name =~ s/::/-/g;
101 die "Error in name(): '$values{name}' should be '$name'!\n";
102 }
103
104 my $dump = '';
105 foreach my $key (@scalar_keys) {
106 $dump .= "$key: $values{$key}\n" if exists $values{$key};
107 }
108 foreach my $key (@tuple_keys) {
109 next unless exists $values{$key};
110 $dump .= "$key:\n";
111 foreach (@{$values{$key}}) {
112 $dump .= " $_->[0]: $_->[1]\n";
113 }
114 }
115
116 if (my $no_index = $values{no_index}) {
117 push @{$no_index->{'directory'}}, 'inc';
118 require YAML;
119 local $YAML::UseHeader = 0;
120 $dump .= YAML::Dump({ no_index => $no_index});
121 }
122 else {
123 $dump .= << "META";
124no_index:
125 directory:
126 - inc
127META
128 }
129
130 $dump .= "generated_by: $package version $version\n";
131 return $dump;
132}
133
134sub read {
135 my $self = shift;
136 $self->include_deps( 'YAML', 0 );
137 require YAML;
138 my $data = YAML::LoadFile( 'META.yml' );
139 # Call methods explicitly in case user has already set some values.
140 while ( my ($key, $value) = each %$data ) {
141 next unless $self->can( $key );
142 if (ref $value eq 'HASH') {
143 while (my ($module, $version) = each %$value) {
144 $self->$key( $module => $version );
145 }
146 }
147 else {
148 $self->$key( $value );
149 }
150 }
151 return $self;
152}
153
154sub write {
155 my $self = shift;
156 return $self unless $self->is_admin;
157
158 META_NOT_OURS: {
159 local *FH;
160 if (open FH, "META.yml") {
161 while (<FH>) {
162 last META_NOT_OURS if /^generated_by: Module::Install\b/;
163 }
164 return $self if -s FH;
165 }
166 }
167
168 warn "Writing META.yml\n";
169 open META, "> META.yml" or warn "Cannot write to META.yml: $!";
170 print META $self->_dump;
171 close META;
172 return $self;
173}
174
175sub version_from {
176 my ($self, $version_from) = @_;
177 require ExtUtils::MM_Unix;
178 $self->version(ExtUtils::MM_Unix->parse_version($version_from));
179}
180
181sub abstract_from {
182 my ($self, $abstract_from) = @_;
183 require ExtUtils::MM_Unix;
184 $self->abstract(
185 bless( { DISTNAME => $self->name }, 'ExtUtils::MM_Unix')
186 ->parse_abstract($abstract_from)
187 );
188}
189
1901;