X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FClass%2FMOP%2FModule.pm;h=3290655ff1c26452d1fb0868e58398a7f1427469;hb=b4567caf469e38cef213b811061646ac62fcd4fc;hp=4d66366ad28519229b980e677c6c4c8369730d38;hpb=d5f6cadef8d83deaf7dd95302908cd4f61aeab8a;p=gitmo%2FMoose.git diff --git a/lib/Class/MOP/Module.pm b/lib/Class/MOP/Module.pm index 4d66366..3290655 100644 --- a/lib/Class/MOP/Module.pm +++ b/lib/Class/MOP/Module.pm @@ -16,9 +16,11 @@ sub _new { my $params = @_ == 1 ? $_[0] : {@_}; return bless { + # Need to quote package to avoid a problem with PPI mis-parsing this + # as a package statement. # from Class::MOP::Package - package => $params->{package}, + 'package' => $params->{package}, namespace => \undef, # attributes @@ -27,12 +29,12 @@ sub _new { } => $class; } -sub version { +sub version { my $self = shift; ${$self->get_or_add_package_symbol('$VERSION')}; } -sub authority { +sub authority { my $self = shift; ${$self->get_or_add_package_symbol('$AUTHORITY')}; } @@ -47,20 +49,35 @@ sub identifier { } sub create { - confess "The Class::MOP::Module->create method has been made a private object method.\n"; + my $class = shift; + my @args = @_; + + unshift @args, 'package' if @args % 2 == 1; + my %options = @args; + + my $package = delete $options{package}; + my $version = delete $options{version}; + my $authority = delete $options{authority}; + + my $meta = $class->SUPER::create($package => %options); + + $meta->_instantiate_module($version, $authority); + + return $meta; } +sub _anon_package_prefix { 'Class::MOP::Module::__ANON__::SERIAL::' } +sub _anon_cache_key { confess "Modules are not cacheable" } + + sub _instantiate_module { my($self, $version, $authority) = @_; my $package_name = $self->name; - Class::MOP::_is_valid_class_name($package_name) - || confess "creation of $package_name failed: invalid package name"; - - no strict 'refs'; - scalar %{ $package_name . '::' }; # touch the stash - ${ $package_name . '::VERSION' } = $version if defined $version; - ${ $package_name . '::AUTHORITY' } = $authority if defined $authority; + $self->add_package_symbol('$VERSION' => $version) + if defined $version; + $self->add_package_symbol('$AUTHORITY' => $authority) + if defined $authority; return; } @@ -73,10 +90,6 @@ __END__ =pod -=head1 NAME - -Class::MOP::Module - Module Meta Object - =head1 DESCRIPTION A module is essentially a L with metadata, in our @@ -90,6 +103,23 @@ B is a subclass of L. =over 4 +=item B<< Class::MOP::Module->create($package, %options) >> + +Overrides C from L to provide these additional +options: + +=over 4 + +=item C + +A version number, to be installed in the C<$VERSION> package global variable. + +=item C + +An authority, to be installed in the C<$AUTHORITY> package global variable. + +=back + =item B<< $metamodule->version >> This is a read-only attribute which returns the C<$VERSION> of the