Spelling errors
[gitmo/Class-MOP.git] / lib / Class / MOP.pm
1
2 package Class::MOP;
3
4 use strict;
5 use warnings;
6
7 our $VERSION = '0.01';
8
9 1;
10
11 __END__
12
13 =pod
14
15 =head1 NAME 
16
17 Class::MOP - A Meta Object Protocol for Perl 5
18
19 =head1 SYNOPSIS
20
21   # ... coming soon
22
23 =head1 DESCRIPTON
24
25 This module is an attempt to create a meta object protocol for the 
26 Perl 5 object system. It makes no attempt to change the behavior or 
27 characteristics of the Perl 5 object system, only to create a 
28 protocol for its manipulation and introspection.
29
30 That said, it does attempt to create the tools for building a rich 
31 set of extensions to the Perl 5 object system. Every attempt has been 
32 made for these tools to keep to the spirit of the Perl 5 object 
33 system that we all know and love.
34
35 =head2 Who is this module for?
36
37 This module is specifically for anyone who has ever created or 
38 wanted to create a module for the Class:: namespace. The tools which 
39 this module will provide will hopefully make it easier to do more 
40 complex things with Perl 5 classes by removing such barriers as 
41 the need to hack the symbol tables, or understand the fine details 
42 of method dispatch. 
43
44 =head1 PROTOCOLS
45
46 The protocol is divided into 3 main sub-protocols:
47
48 =over 4
49
50 =item The Class protocol
51
52 This provides a means of manipulating and introspecting a Perl 5 
53 class. It handles all of symbol table hacking for you, and provides 
54 a rich set of methods that go beyond simple package introspection.
55
56 =item The Attribute protocol
57
58 This provides a consistent represenation for an attribute of a 
59 Perl 5 class. Since there are so many ways to create and handle 
60 atttributes in Perl 5 OO, this attempts to provide as much of a 
61 unified approach as possible, while giving the freedom and 
62 flexibility to subclass for specialization.
63
64 =item The Method protocol
65
66 This provides a means of manipulating and introspecting methods in 
67 the Perl 5 object system. As with attributes, there are many ways to 
68 approach this topic, so we try to keep it pretty basic, while still 
69 making it possible to extend the system in many ways.
70
71 =back
72
73 What follows is a more detailed documentation on each specific sub 
74 protocol.
75
76 =head2 The Class protocol
77
78 =head3 Class construction
79
80 These methods handle creating Class objects, which can be used to 
81 both create new classes, and analyze pre-existing ones. 
82
83 Class::MOP will internally store weakened references to all the 
84 instances you create with these methods, so that they do not need 
85 to be created any more than nessecary. 
86
87 =over 4
88
89 =item B<create ($package_name, ?@superclasses, ?%methods, ?%attributes)>
90
91 This returns the basic Class object, bringing the specified 
92 C<$package_name> into existence and adding any of the 
93 C<@superclasses>, C<%methods> and C<%attributes> to it.
94
95 =item B<load ($package_name)>
96
97 This returns the basic Class object, after examining the given 
98 C<$package_name> and attempting to discover it's components (the 
99 methods, attributes and superclasses). 
100
101 B<NOTE>: This method makes every attempt to ignore subroutines
102 which have been exported by other packages into this one.
103
104 =item B<initialize ($package_name, @superclasses, %methods, %attributes)>
105
106 This creates the actual Class object given a C<$package_name>, 
107 an array of C<@superclasses>, a hash of C<%methods> and a hash 
108 of C<%attributes>. This method is used by both C<load> and 
109 C<create>.
110
111 =back
112
113 =head3 Instance construction
114
115 =over 4
116
117 =item <create_instance ($canidate, %params)>
118
119 This will construct and instance using the C<$canidate> as storage 
120 (currently only HASH references are supported). This will collect all 
121 the applicable attribute meta-objects and layout out the fields in the 
122 C<$canidate>, it will then initialize them using either use the 
123 corresponding key in C<%params> or any default value or initializer 
124 found in the attribute meta-object.
125
126 =back
127
128 =head3 Informational 
129
130 =over 4
131
132 =item C<name>
133
134 This is a read-only attribute which returns the package name that 
135 the Class is stored in.
136
137 =item C<version>
138
139 This is a read-only attribute which returns the C<$VERSION> of the 
140 package the Class is stored in.
141
142 =back
143
144 =head3 Inheritance Relationships
145
146 =over 4
147
148 =item C<superclasses (?@superclasses)>
149
150 This is a read-write attribute which represents the superclass 
151 relationships of this Class. Basically, it can get and set the 
152 C<@ISA> for you.
153
154 =item C<class_precendence_list>
155
156 This computes the a list of the Class's ancestors in the same order 
157 in which method dispatch will be done. 
158
159 =back
160
161 =head3 Methods
162
163 =over 4
164
165 =item C<add_method ($method_name, $method)>
166
167 This will take a C<$method_name> and CODE reference to that 
168 C<$method> and install it into the Class. 
169
170 B<NOTE> : This does absolutely nothing special to C<$method> 
171 other than use B<Sub::Name> to make sure it is tagged with the 
172 correct name, and therefore show up correctly in stack traces and 
173 such.
174
175 =item C<has_method ($method_name)>
176
177 This just provides a simple way to check if the Class implements 
178 a specific C<$method_name>. It will I<not> however, attempt to check 
179 if the class inherits the method.
180
181 =item C<get_method ($method_name)>
182
183 This will return a CODE reference of the specified C<$method_name>, 
184 or return undef if that method does not exist.
185
186 =item C<remove_method ($method_name)>
187
188 This will attempt to remove a given C<$method_name> from the Class. 
189 It will return the CODE reference that it has removed, and will 
190 attempt to use B<Sub::Name> to clear the methods associated name.
191
192 =item C<get_method_list>
193
194 This will return a list of method names for all I<locally> defined 
195 methods. It does B<not> provide a list of all applicable methods, 
196 including any inherited ones. If you want a list of all applicable 
197 methods, use the C<compute_all_applicable_methods> method.
198
199 =item C<compute_all_applicable_methods>
200
201 This will return a list of all the methods names this Class will 
202 support, taking into account inheritance. The list will be a list of 
203 HASH references, each one containing the following information; method 
204 name, the name of the class in which the method lives and a CODE 
205 reference for the actual method.
206
207 =item C<find_all_methods_by_name ($method_name)>
208
209 This will traverse the inheritence hierarchy and locate all methods 
210 with a given C<$method_name>. Similar to 
211 C<compute_all_applicable_methods> it returns a list of HASH references 
212 with the following information; method name (which will always be the 
213 same as C<$method_name>), the name of the class in which the method 
214 lives and a CODE reference for the actual method.
215
216 =back
217
218 =head2 Attributes
219
220 It should be noted that since there is no one consistent way to define 
221 the attributes of a class in Perl 5. These methods can only work with 
222 the information given, and can not easily discover information on 
223 their own.
224
225 =over 4
226
227 =item C<add_attribute ($attribute_name, $attribute_meta_object)>
228
229 This stores a C<$attribute_meta_object> in the Class object and 
230 associates it with the C<$attribute_name>. Unlike methods, attributes 
231 within the MOP are stored as meta-information only. They will be used 
232 later to construct instances from (see C<create_instance> above). More 
233 details about the attribute meta-objects can be found in the L<The 
234 Attribute protocol> section of this document.
235
236 =item C<has_attribute ($attribute_name)>
237
238 Checks to see if this Class has an attribute by the name of 
239 C<$attribute_name> and returns a boolean.
240
241 =item C<get_attribute ($attribute_name)>
242
243 Returns the attribute meta-object associated with C<$attribute_name>, 
244 if none is found, it will return undef. 
245
246 =item C<remove_attribute ($attribute_name)>
247
248 This will remove the attribute meta-object stored at 
249 C<$attribute_name>, then return the removed attribute meta-object. 
250
251 B<NOTE:> Removing an attribute will only affect future instances of 
252 the class, it will not make any attempt to remove the attribute from 
253 any existing instances of the class.
254
255 =item C<get_attribute_list>
256
257 This returns a list of attribute names which are defined in the local 
258 class. If you want a list of all applicable attributes for a class, 
259 use the C<compute_all_applicable_attributes> method.
260
261 =item C<compute_all_applicable_attributes>
262
263 This will traverse the inheritance heirachy and return a list of HASH 
264 references for all the applicable attributes for this class. The HASH 
265 references will contain the following information; the attribute name, 
266 the class which the attribute is associated with and the actual 
267 attribute meta-object
268
269 =back
270
271 =head1 SEE ALSO
272
273 =over 4
274
275 =item "The Art of the Meta Object Protocol"
276
277 =item "Advances in Object-Oriented Metalevel Architecture and Reflection"
278
279 =back
280
281 =head1 AUTHOR
282
283 Stevan Little E<gt>stevan@iinteractive.comE<lt>
284
285 =head1 COPYRIGHT AND LICENSE
286
287 Copyright 2006 by Infinity Interactive, Inc.
288
289 L<http://www.iinteractive.com>
290
291 This library is free software; you can redistribute it and/or modify
292 it under the same terms as Perl itself. 
293
294 =cut