Class::MOP - all the method methods and tests
[gitmo/Class-MOP.git] / lib / Class / MOP.pm
CommitLineData
94b19069 1
2package Class::MOP;
3
4use strict;
5use warnings;
6
8b978dd5 7use Scalar::Util 'blessed';
8
94b19069 9our $VERSION = '0.01';
10
bfe4d0fc 11# my %METAS;
12# sub UNIVERSAL::meta {
13# my $class = blessed($_[0]) || $_[0];
14# $METAS{$class} ||= Class::MOP::Class->initialize($class)
15# }
8b978dd5 16
94b19069 171;
18
19__END__
20
21=pod
22
23=head1 NAME
24
25Class::MOP - A Meta Object Protocol for Perl 5
26
27=head1 SYNOPSIS
28
29 # ... coming soon
30
31=head1 DESCRIPTON
32
33This module is an attempt to create a meta object protocol for the
34Perl 5 object system. It makes no attempt to change the behavior or
35characteristics of the Perl 5 object system, only to create a
27e31eaf 36protocol for its manipulation and introspection.
94b19069 37
38That said, it does attempt to create the tools for building a rich
39set of extensions to the Perl 5 object system. Every attempt has been
40made for these tools to keep to the spirit of the Perl 5 object
41system that we all know and love.
42
bfe4d0fc 43=head2 What is a Meta Object Protocol?
44
45A meta object protocol is an API to an object system.
46
47To be more specific, it is a set of abstractions of the components of
48an object system (typically things like; classes, object, methods,
49object attributes, etc.). These abstractions can then be used to both
50inspect and manipulate the object system which they describe.
51
52It can be said that there are two MOPs for any object system; the
53implicit MOP, and the explicit MOP. The implicit MOP handles things
54like method dispatch or inheritance, which happen automatically as
55part of how the object system works. The explicit MOP typically
56handles the introspection/reflection features of the object system.
57All object systems have implicit MOPs, without one, they would not
58work. Explict MOPs however as less common, and depending on the
59language can vary from restrictive (Reflection in Java or C#) to
60wide open (CLOS is a perfect example).
61
94b19069 62=head2 Who is this module for?
63
64This module is specifically for anyone who has ever created or
65wanted to create a module for the Class:: namespace. The tools which
66this module will provide will hopefully make it easier to do more
67complex things with Perl 5 classes by removing such barriers as
68the need to hack the symbol tables, or understand the fine details
69of method dispatch.
70
bfe4d0fc 71=head2 What changes do I have to make to use this module?
72
73This module was designed to be as unintrusive as possible. So many of
74it's features are accessible without B<any> change to your existsing
75code at all. It is meant to be a compliment to your existing code and
76not an intrusion on your code base.
77
78The only feature which requires additions to your code are the
79attribute handling and instance construction features. The only reason
80for this is because Perl 5's object system does not actually have
81these features built in. More information about this feature can be
82found below.
83
84=head2 A Note about Performance?
85
86It is a common misconception that explict MOPs are performance drains.
87But this is not a universal truth at all, it is an side-effect of
88specific implementations. For instance, using Java reflection is much
89slower because the JVM cannot take advantage of any compiler
90optimizations, and the JVM has to deal with much more runtime type
91information as well. Reflection in C# is marginally better as it was
92designed into the language and runtime (the CLR). In contrast, CLOS
93(the Common Lisp Object System) was built to support an explicit MOP,
94and so performance is tuned for it.
95
96This library in particular does it's absolute best to avoid putting
97B<any> drain at all upon your code's performance, while still trying
98to make sure it is fast as well (although only as a secondary
99concern).
100
94b19069 101=head1 PROTOCOLS
102
103The protocol is divided into 3 main sub-protocols:
104
105=over 4
106
107=item The Class protocol
108
109This provides a means of manipulating and introspecting a Perl 5
110class. It handles all of symbol table hacking for you, and provides
111a rich set of methods that go beyond simple package introspection.
112
113=item The Attribute protocol
114
115This provides a consistent represenation for an attribute of a
116Perl 5 class. Since there are so many ways to create and handle
117atttributes in Perl 5 OO, this attempts to provide as much of a
118unified approach as possible, while giving the freedom and
119flexibility to subclass for specialization.
120
121=item The Method protocol
122
123This provides a means of manipulating and introspecting methods in
124the Perl 5 object system. As with attributes, there are many ways to
125approach this topic, so we try to keep it pretty basic, while still
126making it possible to extend the system in many ways.
127
128=back
129
130What follows is a more detailed documentation on each specific sub
131protocol.
132
133=head2 The Class protocol
134
138f87a7 135=head3 Class construction
94b19069 136
137These methods handle creating Class objects, which can be used to
138both create new classes, and analyze pre-existing ones.
139
140Class::MOP will internally store weakened references to all the
141instances you create with these methods, so that they do not need
142to be created any more than nessecary.
143
144=over 4
145
8b978dd5 146=item B<create ($package_name, ?$package_version,
147 superclasses => ?@superclasses,
148 methods => ?%methods,
149 attributes => ?%attributes)>
94b19069 150
151This returns the basic Class object, bringing the specified
152C<$package_name> into existence and adding any of the
8b978dd5 153C<$package_version>, C<@superclasses>, C<%methods> and C<%attributes>
154to it.
94b19069 155
8b978dd5 156=item B<initialize ($package_name)>
94b19069 157
8b978dd5 158This initializes a Class object for a given a C<$package_name>.
94b19069 159
138f87a7 160=back
161
162=head3 Instance construction
163
164=over 4
165
8b978dd5 166=item B<construct_instance ($canidate, %params)>
138f87a7 167
168This will construct and instance using the C<$canidate> as storage
27e31eaf 169(currently only HASH references are supported). This will collect all
138f87a7 170the applicable attribute meta-objects and layout out the fields in the
171C<$canidate>, it will then initialize them using either use the
172corresponding key in C<%params> or any default value or initializer
173found in the attribute meta-object.
94b19069 174
175=back
176
177=head3 Informational
178
179=over 4
180
8b978dd5 181=item B<name>
94b19069 182
183This is a read-only attribute which returns the package name that
184the Class is stored in.
185
8b978dd5 186=item B<version>
94b19069 187
188This is a read-only attribute which returns the C<$VERSION> of the
189package the Class is stored in.
190
191=back
192
193=head3 Inheritance Relationships
194
195=over 4
196
8b978dd5 197=item B<superclasses (?@superclasses)>
94b19069 198
199This is a read-write attribute which represents the superclass
200relationships of this Class. Basically, it can get and set the
201C<@ISA> for you.
202
8b978dd5 203=item B<class_precedence_list>
94b19069 204
205This computes the a list of the Class's ancestors in the same order
206in which method dispatch will be done.
207
208=back
209
210=head3 Methods
211
212=over 4
213
8b978dd5 214=item B<add_method ($method_name, $method)>
94b19069 215
216This will take a C<$method_name> and CODE reference to that
217C<$method> and install it into the Class.
218
219B<NOTE> : This does absolutely nothing special to C<$method>
220other than use B<Sub::Name> to make sure it is tagged with the
221correct name, and therefore show up correctly in stack traces and
222such.
223
8b978dd5 224=item B<has_method ($method_name)>
94b19069 225
226This just provides a simple way to check if the Class implements
227a specific C<$method_name>. It will I<not> however, attempt to check
228if the class inherits the method.
229
bfe4d0fc 230This will correctly handle functions defined outside of the package
231that use a fully qualified name (C<sub Package::name { ... }>).
60d90bbc 232
bfe4d0fc 233This will correctly handle functions renamed with B<Sub::Name> and
234installed using the symbol tables. However, if you are naming the
235subroutine outside of the package scope, you must use the fully
236qualified name, including the package name, for C<has_method> to
237correctly identify it.
60d90bbc 238
bfe4d0fc 239This will attempt to correctly ignore functions imported from other
240packages using B<Exporter>. It breaks down if the function imported
241is an C<__ANON__> sub (such as with C<use constant>), which very well
242may be a valid method being applied to the class.
60d90bbc 243
bfe4d0fc 244In short, this method cannot always be trusted to determine if the
245C<$method_name> is actually a method. However, it will DWIM about
24690% of the time, so it's a small trade off IMO.
60d90bbc 247
8b978dd5 248=item B<get_method ($method_name)>
94b19069 249
250This will return a CODE reference of the specified C<$method_name>,
251or return undef if that method does not exist.
252
8b978dd5 253=item B<remove_method ($method_name)>
94b19069 254
255This will attempt to remove a given C<$method_name> from the Class.
256It will return the CODE reference that it has removed, and will
257attempt to use B<Sub::Name> to clear the methods associated name.
258
8b978dd5 259=item B<get_method_list>
94b19069 260
261This will return a list of method names for all I<locally> defined
262methods. It does B<not> provide a list of all applicable methods,
263including any inherited ones. If you want a list of all applicable
264methods, use the C<compute_all_applicable_methods> method.
265
8b978dd5 266=item B<compute_all_applicable_methods>
94b19069 267
268This will return a list of all the methods names this Class will
269support, taking into account inheritance. The list will be a list of
270HASH references, each one containing the following information; method
ca843097 271name, the name of the class in which the method lives and a CODE
272reference for the actual method.
94b19069 273
8b978dd5 274=item B<find_all_methods_by_name ($method_name)>
94b19069 275
276This will traverse the inheritence hierarchy and locate all methods
ca843097 277with a given C<$method_name>. Similar to
278C<compute_all_applicable_methods> it returns a list of HASH references
279with the following information; method name (which will always be the
280same as C<$method_name>), the name of the class in which the method
281lives and a CODE reference for the actual method.
94b19069 282
a5eca695 283The list of methods produced is a distinct list, meaning there are no
284duplicates in it. This is especially useful for things like object
285initialization and destruction where you only want the method called
286once, and in the correct order.
287
94b19069 288=back
289
8b978dd5 290=head3 Attributes
94b19069 291
ca843097 292It should be noted that since there is no one consistent way to define
293the attributes of a class in Perl 5. These methods can only work with
294the information given, and can not easily discover information on
295their own.
94b19069 296
297=over 4
298
8b978dd5 299=item B<add_attribute ($attribute_name, $attribute_meta_object)>
138f87a7 300
ca843097 301This stores a C<$attribute_meta_object> in the Class object and
302associates it with the C<$attribute_name>. Unlike methods, attributes
303within the MOP are stored as meta-information only. They will be used
8b978dd5 304later to construct instances from (see C<construct_instance> above).
305More details about the attribute meta-objects can be found in the
306L<The Attribute protocol> section of this document.
138f87a7 307
8b978dd5 308=item B<has_attribute ($attribute_name)>
138f87a7 309
ca843097 310Checks to see if this Class has an attribute by the name of
311C<$attribute_name> and returns a boolean.
138f87a7 312
8b978dd5 313=item B<get_attribute ($attribute_name)>
138f87a7 314
ca843097 315Returns the attribute meta-object associated with C<$attribute_name>,
316if none is found, it will return undef.
138f87a7 317
8b978dd5 318=item B<remove_attribute ($attribute_name)>
138f87a7 319
ca843097 320This will remove the attribute meta-object stored at
321C<$attribute_name>, then return the removed attribute meta-object.
94b19069 322
ca843097 323B<NOTE:> Removing an attribute will only affect future instances of
324the class, it will not make any attempt to remove the attribute from
325any existing instances of the class.
94b19069 326
8b978dd5 327=item B<get_attribute_list>
94b19069 328
ca843097 329This returns a list of attribute names which are defined in the local
330class. If you want a list of all applicable attributes for a class,
331use the C<compute_all_applicable_attributes> method.
94b19069 332
8b978dd5 333=item B<compute_all_applicable_attributes>
94b19069 334
ca843097 335This will traverse the inheritance heirachy and return a list of HASH
336references for all the applicable attributes for this class. The HASH
337references will contain the following information; the attribute name,
338the class which the attribute is associated with and the actual
339attribute meta-object
94b19069 340
8b978dd5 341=item B<create_all_accessors>
342
343This will communicate with all of the classes attributes to create
344and install the appropriate accessors. (see L<The Attribute Protocol>
345below for more details).
346
347=back
348
349=head2 The Attribute Protocol
350
351This protocol is almost entirely an invention of this module. This is
352because Perl 5 does not have consistent notion of what is an attribute
353of a class. There are so many ways in which this is done, and very few
354(if any) are discoverable by this module.
355
356So, all that said, this module attempts to inject some order into this
357chaos, by introducing a more consistent approach.
358
359=head3 Creation
360
361=over 4
362
363=item B<new ($name, %accessor_description, $class_initialization_arg, $default_value)>
364
365 Class::MOP::Attribute->new('$foo' => (
366 accessor => 'foo', # dual purpose get/set accessor
367 init_arg => '-foo', # class->new will look for a -foo key
368 default => 'BAR IS BAZ!' # if no -foo key is provided, use this
369 ));
370
371 Class::MOP::Attribute->new('$.bar' => (
372 reader => 'bar', # getter
373 writer => 'set_bar', # setter
374 init_arg => '-bar', # class->new will look for a -bar key
375 # no default value means it is undef
376 ));
377
378=back
379
380=head3 Informational
381
382=over 4
383
384=item B<name>
385
386=item B<accessor>
387
388=item B<reader>
389
390=item B<writer>
391
392=item B<init_arg>
393
394=item B<default>
395
94b19069 396=back
397
8b978dd5 398=head3 Informational predicates
399
400=over 4
401
402=item B<has_accessor>
403
404Returns true if this attribute uses a get/set accessor, and false
405otherwise
406
407=item B<has_reader>
408
409Returns true if this attribute has a reader, and false otherwise
410
411=item B<has_writer>
412
413Returns true if this attribute has a writer, and false otherwise
414
415=item B<has_init_arg>
416
417Returns true if this attribute has a class intialization argument, and
418false otherwise
419
420=item B<has_default>
421
422Returns true if this attribute has a default value, and false
423otherwise.
424
425=back
426
427=head3 Attribute Accessor generation
428
429=over 4
430
431=item B<generate_accessors>
432
433This allows the attribute to generate code for it's own accessor
434methods. This is mostly part of an internal protocol between the class
435and it's own attributes, see the C<create_all_accessors> method above.
436
437=back
438
439=head2 The Method Protocol
440
441This protocol is very small, since methods in Perl 5 are just
442subroutines within the particular package. Basically all we do is to
443bless the subroutine and provide some very simple introspection
444methods for it.
445
94b19069 446=head1 SEE ALSO
447
448=over 4
449
450=item "The Art of the Meta Object Protocol"
451
138f87a7 452=item "Advances in Object-Oriented Metalevel Architecture and Reflection"
94b19069 453
454=back
455
456=head1 AUTHOR
457
458Stevan Little E<gt>stevan@iinteractive.comE<lt>
459
460=head1 COPYRIGHT AND LICENSE
461
462Copyright 2006 by Infinity Interactive, Inc.
463
464L<http://www.iinteractive.com>
465
466This library is free software; you can redistribute it and/or modify
467it under the same terms as Perl itself.
468
469=cut