ChangeLog and adding yuval to authors everywhere
[gitmo/Class-MOP.git] / lib / Class / MOP / Package.pm
CommitLineData
2243a22b 1
2package Class::MOP::Package;
3
4use strict;
5use warnings;
6
7use Scalar::Util 'blessed';
6d5355c3 8use Carp 'confess';
2243a22b 9
10our $VERSION = '0.01';
11
12# introspection
13
14sub meta {
15 require Class::MOP::Class;
16 Class::MOP::Class->initialize(blessed($_[0]) || $_[0]);
17}
18
6d5355c3 19# creation ...
20
21sub initialize {
22 my ($class, $package) = @_;
23 bless { '$:package' => $package } => $class;
24}
25
26# Attributes
27
28# NOTE:
29# all these attribute readers will be bootstrapped
30# away in the Class::MOP bootstrap section
31
32sub name { $_[0]->{'$:package'} }
33
34# Class attributes
35
c0cbf4d9 36{
37 my %SIGIL_MAP = (
38 '$' => 'SCALAR',
39 '@' => 'ARRAY',
40 '%' => 'HASH',
41 '&' => 'CODE',
42 );
6d5355c3 43
c0cbf4d9 44 sub add_package_symbol {
45 my ($self, $variable, $initial_value) = @_;
6d5355c3 46
c0cbf4d9 47 (defined $variable)
48 || confess "You must pass a variable name";
6d5355c3 49
c0cbf4d9 50 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
6d5355c3 51
c0cbf4d9 52 (defined $sigil)
53 || confess "The variable name must include a sigil";
6d5355c3 54
c0cbf4d9 55 (exists $SIGIL_MAP{$sigil})
56 || confess "I do not recognize that sigil '$sigil'";
6d5355c3 57
c0cbf4d9 58 no strict 'refs';
59 no warnings 'misc';
60 *{$self->name . '::' . $name} = $initial_value;
61 }
6d5355c3 62
c0cbf4d9 63 sub has_package_symbol {
64 my ($self, $variable) = @_;
65 (defined $variable)
66 || confess "You must pass a variable name";
6d5355c3 67
c0cbf4d9 68 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
6d5355c3 69
c0cbf4d9 70 (defined $sigil)
71 || confess "The variable name must include a sigil";
6d5355c3 72
c0cbf4d9 73 (exists $SIGIL_MAP{$sigil})
74 || confess "I do not recognize that sigil '$sigil'";
6d5355c3 75
c0cbf4d9 76 no strict 'refs';
77 defined *{$self->name . '::' . $name}{$SIGIL_MAP{$sigil}} ? 1 : 0;
6d5355c3 78
c0cbf4d9 79 }
6d5355c3 80
c0cbf4d9 81 sub get_package_symbol {
82 my ($self, $variable) = @_;
83 (defined $variable)
84 || confess "You must pass a variable name";
6d5355c3 85
c0cbf4d9 86 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
6d5355c3 87
c0cbf4d9 88 (defined $sigil)
89 || confess "The variable name must include a sigil";
6d5355c3 90
c0cbf4d9 91 (exists $SIGIL_MAP{$sigil})
92 || confess "I do not recognize that sigil '$sigil'";
6d5355c3 93
c0cbf4d9 94 no strict 'refs';
95 return *{$self->name . '::' . $name}{$SIGIL_MAP{$sigil}};
6d5355c3 96
c0cbf4d9 97 }
6d5355c3 98
c0cbf4d9 99 sub remove_package_symbol {
100 my ($self, $variable) = @_;
6d5355c3 101
c0cbf4d9 102 (defined $variable)
103 || confess "You must pass a variable name";
6d5355c3 104
c0cbf4d9 105 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
106
107 (defined $sigil)
108 || confess "The variable name must include a sigil";
109
110 (exists $SIGIL_MAP{$sigil})
111 || confess "I do not recognize that sigil '$sigil'";
112
113 no strict 'refs';
114 if ($SIGIL_MAP{$sigil} eq 'SCALAR') {
115 undef ${$self->name . '::' . $name};
116 }
117 elsif ($SIGIL_MAP{$sigil} eq 'ARRAY') {
118 undef @{$self->name . '::' . $name};
119 }
120 elsif ($SIGIL_MAP{$sigil} eq 'HASH') {
121 undef %{$self->name . '::' . $name};
122 }
123 elsif ($SIGIL_MAP{$sigil} eq 'CODE') {
124 undef &{$self->name . '::' . $name};
125 }
126 else {
127 confess "This should never ever ever happen";
128 }
7f436b8c 129 }
c0cbf4d9 130
6d5355c3 131}
132
2243a22b 1331;
134
135__END__
136
137=pod
138
139=head1 NAME
140
141Class::MOP::Package - Package Meta Object
142
143=head1 SYNOPSIS
144
145=head1 DESCRIPTION
146
147=head1 METHODS
148
149=over 4
150
151=item B<meta>
152
6d5355c3 153=item B<initialize>
154
155=item B<name>
156
58d75218 157=item B<add_package_symbol>
6d5355c3 158
58d75218 159=item B<get_package_symbol>
6d5355c3 160
58d75218 161=item B<has_package_symbol>
6d5355c3 162
58d75218 163=item B<remove_package_symbol>
6d5355c3 164
2243a22b 165=back
166
1a09d9cc 167=head1 AUTHORS
2243a22b 168
169Stevan Little E<lt>stevan@iinteractive.comE<gt>
170
1a09d9cc 171Yuval Kogman E<lt>nothingmuch@woobling.comE<gt>
172
2243a22b 173=head1 COPYRIGHT AND LICENSE
174
175Copyright 2006 by Infinity Interactive, Inc.
176
177L<http://www.iinteractive.com>
178
179This library is free software; you can redistribute it and/or modify
180it under the same terms as Perl itself.
181
182=cut