1 package Module::Install::Metadata;
4 use Module::Install::Base;
6 use vars qw{$VERSION $ISCORE @ISA};
10 @ISA = qw{Module::Install::Base};
35 sub Meta_ScalarKeys { @scalar_keys }
36 sub Meta_TupleKeys { @tuple_keys }
38 foreach my $key (@scalar_keys) {
41 return $self->{values}{$key} if defined wantarray and !@_;
42 $self->{values}{$key} = shift;
50 my $module = shift or last;
51 my $version = shift || 0;
52 push @{ $self->{values}->{requires} }, [ $module, $version ];
54 $self->{values}{requires};
60 my $module = shift or last;
61 my $version = shift || 0;
62 push @{ $self->{values}->{build_requires} }, [ $module, $version ];
64 $self->{values}{build_requires};
67 sub configure_requires {
70 my $module = shift or last;
71 my $version = shift || 0;
72 push @{ $self->{values}->{configure_requires} }, [ $module, $version ];
74 $self->{values}{configure_requires};
80 my $module = shift or last;
81 my $version = shift || 0;
82 push @{ $self->{values}->{recommends} }, [ $module, $version ];
84 $self->{values}{recommends};
90 my $module = shift or last;
91 my $version = shift || 0;
92 push @{ $self->{values}->{bundles} }, [ $module, $version ];
94 $self->{values}{bundles};
97 # Aliases for build_requires that will have alternative
98 # meanings in some future version of META.yml.
99 sub test_requires { shift->build_requires(@_) }
100 sub install_requires { shift->build_requires(@_) }
102 # Aliases for installdirs options
103 sub install_as_core { $_[0]->installdirs('perl') }
104 sub install_as_cpan { $_[0]->installdirs('site') }
105 sub install_as_site { $_[0]->installdirs('site') }
106 sub install_as_vendor { $_[0]->installdirs('vendor') }
110 return $self->{'values'}{'sign'} if defined wantarray and ! @_;
111 $self->{'values'}{'sign'} = ( @_ ? $_[0] : 1 );
118 warn "You MUST provide an explicit true/false value to dynamic_config, skipping\n";
121 $self->{values}{dynamic_config} = $_[0] ? 1 : 0;
126 my ( $self, $file ) = @_;
128 unless ( defined($file) ) {
129 my $name = $self->name
130 or die "all_from called with no args without setting name() first";
131 $file = join('/', 'lib', split(/-/, $name)) . '.pm';
132 $file =~ s{.*/}{} unless -e $file;
133 die "all_from: cannot find $file from $name" unless -e $file;
136 # Some methods pull from POD instead of code.
137 # If there is a matching .pod, use that instead
139 $pod =~ s/\.pm$/.pod/i;
140 $pod = $file unless -e $pod;
142 # Pull the different values
143 $self->name_from($file) unless $self->name;
144 $self->version_from($file) unless $self->version;
145 $self->perl_version_from($file) unless $self->perl_version;
146 $self->author_from($pod) unless $self->author;
147 $self->license_from($pod) unless $self->license;
148 $self->abstract_from($pod) unless $self->abstract;
155 my $provides = ( $self->{values}{provides} ||= {} );
156 %$provides = (%$provides, @_) if @_;
162 return $self unless $self->is_admin;
163 unless (-e 'MANIFEST') {
164 warn "Cannot deduce auto_provides without a MANIFEST, skipping\n";
167 # Avoid spurious warnings as we are not checking manifest here.
168 local $SIG{__WARN__} = sub {1};
169 require ExtUtils::Manifest;
170 local *ExtUtils::Manifest::manicheck = sub { return };
172 require Module::Build;
173 my $build = Module::Build->new(
174 dist_name => $self->name,
175 dist_version => $self->version,
176 license => $self->license,
178 $self->provides( %{ $build->find_dist_packages || {} } );
184 my $features = ( $self->{values}{features} ||= [] );
187 if ( @_ == 1 and ref( $_[0] ) ) {
188 # The user used ->feature like ->features by passing in the second
189 # argument as a reference. Accomodate for that.
199 ref($_) ? ( ref($_) eq 'HASH' ) ? %$_ : @$_ : $_
209 while ( my ( $name, $mods ) = splice( @_, 0, 2 ) ) {
210 $self->feature( $name, @$mods );
212 return $self->{values}->{features}
213 ? @{ $self->{values}->{features} }
220 push @{ $self->{values}{no_index}{$type} }, @_ if $type;
221 return $self->{values}{no_index};
226 $self->include_deps( 'YAML::Tiny', 0 );
229 my $data = YAML::Tiny::LoadFile('META.yml');
231 # Call methods explicitly in case user has already set some values.
232 while ( my ( $key, $value ) = each %$data ) {
233 next unless $self->can($key);
234 if ( ref $value eq 'HASH' ) {
235 while ( my ( $module, $version ) = each %$value ) {
236 $self->can($key)->($self, $module => $version );
239 $self->can($key)->($self, $value);
247 return $self unless $self->is_admin;
248 $self->admin->write_meta;
253 require ExtUtils::MM_Unix;
254 my ( $self, $file ) = @_;
255 $self->version( ExtUtils::MM_Unix->parse_version($file) );
259 require ExtUtils::MM_Unix;
260 my ( $self, $file ) = @_;
263 { DISTNAME => $self->name },
265 )->parse_abstract($file)
272 Module::Install::_read($_[0]) =~ m/
283 die "Cannot determine name from $_[0]\n";
288 sub perl_version_from {
291 Module::Install::_read($_[0]) =~ m/
299 my $perl_version = $1;
300 $perl_version =~ s{_}{}g;
301 $self->perl_version($perl_version);
303 warn "Cannot determine perl version info from $_[0]\n";
310 my $content = Module::Install::_read($_[0]);
312 =head \d \s+ (?:authors?)\b \s*
315 =head \d \s+ (?:licen[cs]e|licensing|copyright|legal)\b \s*
316 .*? copyright .*? \d\d\d[\d.]+ \s* (?:\bby\b)? \s*
319 my $author = $1 || $2;
320 $author =~ s{E<lt>}{<}g;
321 $author =~ s{E<gt>}{>}g;
322 $self->author($author);
324 warn "Cannot determine author info from $_[0]\n";
331 Module::Install::_read($_[0]) =~ m/
334 (?:licen[cs]e|licensing|copyright|legal)\b
340 my $license_text = $1;
342 'under the same (?:terms|license) as perl itself' => 'perl', 1,
343 'GNU public license' => 'gpl', 1,
344 'GNU lesser public license' => 'lgpl', 1,
345 'BSD license' => 'bsd', 1,
346 'Artistic license' => 'artistic', 1,
350 'Artistic' => 'artistic', 1,
352 'proprietary' => 'proprietary', 0,
354 while ( my ($pattern, $license, $osi) = splice(@phrases, 0, 3) ) {
355 $pattern =~ s{\s+}{\\s+}g;
356 if ( $license_text =~ /\b$pattern\b/i ) {
357 if ( $osi and $license_text =~ /All rights reserved/i ) {
358 warn "LEGAL WARNING: 'All rights reserved' may invalidate Open Source licenses. Consider removing it.";
360 $self->license($license);
366 warn "Cannot determine license info from $_[0]\n";
372 my $args = $self->makemaker_args;
373 my $exe = $args->{EXE_FILES} ||= [];
377 } elsif ( -d 'script' and -f "script/$_" ) {
378 push @$exe, "script/$_";
380 die "Cannot find script '$_'";