Class::MOP - closer
[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
283=back
284
8b978dd5 285=head3 Attributes
94b19069 286
ca843097 287It should be noted that since there is no one consistent way to define
288the attributes of a class in Perl 5. These methods can only work with
289the information given, and can not easily discover information on
290their own.
94b19069 291
292=over 4
293
8b978dd5 294=item B<add_attribute ($attribute_name, $attribute_meta_object)>
138f87a7 295
ca843097 296This stores a C<$attribute_meta_object> in the Class object and
297associates it with the C<$attribute_name>. Unlike methods, attributes
298within the MOP are stored as meta-information only. They will be used
8b978dd5 299later to construct instances from (see C<construct_instance> above).
300More details about the attribute meta-objects can be found in the
301L<The Attribute protocol> section of this document.
138f87a7 302
8b978dd5 303=item B<has_attribute ($attribute_name)>
138f87a7 304
ca843097 305Checks to see if this Class has an attribute by the name of
306C<$attribute_name> and returns a boolean.
138f87a7 307
8b978dd5 308=item B<get_attribute ($attribute_name)>
138f87a7 309
ca843097 310Returns the attribute meta-object associated with C<$attribute_name>,
311if none is found, it will return undef.
138f87a7 312
8b978dd5 313=item B<remove_attribute ($attribute_name)>
138f87a7 314
ca843097 315This will remove the attribute meta-object stored at
316C<$attribute_name>, then return the removed attribute meta-object.
94b19069 317
ca843097 318B<NOTE:> Removing an attribute will only affect future instances of
319the class, it will not make any attempt to remove the attribute from
320any existing instances of the class.
94b19069 321
8b978dd5 322=item B<get_attribute_list>
94b19069 323
ca843097 324This returns a list of attribute names which are defined in the local
325class. If you want a list of all applicable attributes for a class,
326use the C<compute_all_applicable_attributes> method.
94b19069 327
8b978dd5 328=item B<compute_all_applicable_attributes>
94b19069 329
ca843097 330This will traverse the inheritance heirachy and return a list of HASH
331references for all the applicable attributes for this class. The HASH
332references will contain the following information; the attribute name,
333the class which the attribute is associated with and the actual
334attribute meta-object
94b19069 335
8b978dd5 336=item B<create_all_accessors>
337
338This will communicate with all of the classes attributes to create
339and install the appropriate accessors. (see L<The Attribute Protocol>
340below for more details).
341
342=back
343
344=head2 The Attribute Protocol
345
346This protocol is almost entirely an invention of this module. This is
347because Perl 5 does not have consistent notion of what is an attribute
348of a class. There are so many ways in which this is done, and very few
349(if any) are discoverable by this module.
350
351So, all that said, this module attempts to inject some order into this
352chaos, by introducing a more consistent approach.
353
354=head3 Creation
355
356=over 4
357
358=item B<new ($name, %accessor_description, $class_initialization_arg, $default_value)>
359
360 Class::MOP::Attribute->new('$foo' => (
361 accessor => 'foo', # dual purpose get/set accessor
362 init_arg => '-foo', # class->new will look for a -foo key
363 default => 'BAR IS BAZ!' # if no -foo key is provided, use this
364 ));
365
366 Class::MOP::Attribute->new('$.bar' => (
367 reader => 'bar', # getter
368 writer => 'set_bar', # setter
369 init_arg => '-bar', # class->new will look for a -bar key
370 # no default value means it is undef
371 ));
372
373=back
374
375=head3 Informational
376
377=over 4
378
379=item B<name>
380
381=item B<accessor>
382
383=item B<reader>
384
385=item B<writer>
386
387=item B<init_arg>
388
389=item B<default>
390
94b19069 391=back
392
8b978dd5 393=head3 Informational predicates
394
395=over 4
396
397=item B<has_accessor>
398
399Returns true if this attribute uses a get/set accessor, and false
400otherwise
401
402=item B<has_reader>
403
404Returns true if this attribute has a reader, and false otherwise
405
406=item B<has_writer>
407
408Returns true if this attribute has a writer, and false otherwise
409
410=item B<has_init_arg>
411
412Returns true if this attribute has a class intialization argument, and
413false otherwise
414
415=item B<has_default>
416
417Returns true if this attribute has a default value, and false
418otherwise.
419
420=back
421
422=head3 Attribute Accessor generation
423
424=over 4
425
426=item B<generate_accessors>
427
428This allows the attribute to generate code for it's own accessor
429methods. This is mostly part of an internal protocol between the class
430and it's own attributes, see the C<create_all_accessors> method above.
431
432=back
433
434=head2 The Method Protocol
435
436This protocol is very small, since methods in Perl 5 are just
437subroutines within the particular package. Basically all we do is to
438bless the subroutine and provide some very simple introspection
439methods for it.
440
94b19069 441=head1 SEE ALSO
442
443=over 4
444
445=item "The Art of the Meta Object Protocol"
446
138f87a7 447=item "Advances in Object-Oriented Metalevel Architecture and Reflection"
94b19069 448
449=back
450
451=head1 AUTHOR
452
453Stevan Little E<gt>stevan@iinteractive.comE<lt>
454
455=head1 COPYRIGHT AND LICENSE
456
457Copyright 2006 by Infinity Interactive, Inc.
458
459L<http://www.iinteractive.com>
460
461This library is free software; you can redistribute it and/or modify
462it under the same terms as Perl itself.
463
464=cut