Commit | Line | Data |
38bf2a25 |
1 | |
2 | package Class::MOP::Module; |
3 | |
4 | use strict; |
5 | use warnings; |
6 | |
7 | use Carp 'confess'; |
8 | use Scalar::Util 'blessed'; |
9 | |
38bf2a25 |
10 | use base 'Class::MOP::Package'; |
11 | |
12 | sub _new { |
13 | my $class = shift; |
14 | return Class::MOP::Class->initialize($class)->new_object(@_) |
15 | if $class ne __PACKAGE__; |
16 | |
17 | my $params = @_ == 1 ? $_[0] : {@_}; |
18 | return bless { |
9c1bf11e |
19 | # Need to quote package to avoid a problem with PPI mis-parsing this |
20 | # as a package statement. |
38bf2a25 |
21 | |
22 | # from Class::MOP::Package |
9c1bf11e |
23 | 'package' => $params->{package}, |
38bf2a25 |
24 | namespace => \undef, |
25 | |
26 | # attributes |
27 | version => \undef, |
28 | authority => \undef |
29 | } => $class; |
30 | } |
31 | |
32 | sub version { |
33 | my $self = shift; |
34 | ${$self->get_or_add_package_symbol('$VERSION')}; |
35 | } |
36 | |
37 | sub authority { |
38 | my $self = shift; |
39 | ${$self->get_or_add_package_symbol('$AUTHORITY')}; |
40 | } |
41 | |
42 | sub identifier { |
43 | my $self = shift; |
44 | join '-' => ( |
45 | $self->name, |
46 | ($self->version || ()), |
47 | ($self->authority || ()), |
48 | ); |
49 | } |
50 | |
51 | sub create { |
0db1c8dc |
52 | my $class = shift; |
53 | my @args = @_; |
54 | |
55 | unshift @args, 'package' if @args % 2 == 1; |
56 | my %options = @args; |
57 | |
58 | my $package = delete $options{package}; |
59 | my $version = delete $options{version}; |
60 | my $authority = delete $options{authority}; |
61 | |
62 | my $meta = $class->SUPER::create($package => %options); |
63 | |
64 | $meta->_instantiate_module($version, $authority); |
65 | |
66 | return $meta; |
38bf2a25 |
67 | } |
68 | |
0db1c8dc |
69 | sub _anon_package_prefix { 'Class::MOP::Module::__ANON__::SERIAL::' } |
70 | sub _anon_cache_key { confess "Modules are not cacheable" } |
71 | |
72 | |
38bf2a25 |
73 | sub _instantiate_module { |
74 | my($self, $version, $authority) = @_; |
75 | my $package_name = $self->name; |
76 | |
77 | Class::MOP::_is_valid_class_name($package_name) |
78 | || confess "creation of $package_name failed: invalid package name"; |
79 | |
38f8dd86 |
80 | $self->add_package_symbol('$VERSION' => $version) |
81 | if defined $version; |
82 | $self->add_package_symbol('$AUTHORITY' => $authority) |
83 | if defined $authority; |
38bf2a25 |
84 | |
85 | return; |
86 | } |
87 | |
88 | 1; |
89 | |
90 | # ABSTRACT: Module Meta Object |
91 | |
92 | __END__ |
93 | |
94 | =pod |
95 | |
96 | =head1 NAME |
97 | |
98 | Class::MOP::Module - Module Meta Object |
99 | |
100 | =head1 DESCRIPTION |
101 | |
102 | A module is essentially a L<Class::MOP::Package> with metadata, in our |
103 | case the version and authority. |
104 | |
105 | =head1 INHERITANCE |
106 | |
107 | B<Class::MOP::Module> is a subclass of L<Class::MOP::Package>. |
108 | |
109 | =head1 METHODS |
110 | |
111 | =over 4 |
112 | |
f605d4d8 |
113 | =item B<< Class::MOP::Module->create($package, %options) >> |
114 | |
115 | Overrides C<create> from L<Class::MOP::Package> to provide these additional |
116 | options: |
117 | |
118 | =over 4 |
119 | |
120 | =item C<version> |
121 | |
122 | A version number, to be installed in the C<$VERSION> package global variable. |
123 | |
124 | =item C<authority> |
125 | |
126 | An authority, to be installed in the C<$AUTHORITY> package global variable. |
127 | |
128 | =back |
129 | |
38bf2a25 |
130 | =item B<< $metamodule->version >> |
131 | |
132 | This is a read-only attribute which returns the C<$VERSION> of the |
133 | package, if one exists. |
134 | |
135 | =item B<< $metamodule->authority >> |
136 | |
137 | This is a read-only attribute which returns the C<$AUTHORITY> of the |
138 | package, if one exists. |
139 | |
140 | =item B<< $metamodule->identifier >> |
141 | |
142 | This constructs a string which combines the name, version and |
143 | authority. |
144 | |
145 | =item B<< Class::MOP::Module->meta >> |
146 | |
147 | This will return a L<Class::MOP::Class> instance for this class. |
148 | |
149 | =back |
150 | |
151 | =cut |