some more docs for Class::MOP and the attribute functions for Class::MOP::Class
[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
e16da3e6 62=head2 Yet Another Class Builder!! Why?
63
64This is B<not> a class builder so much as it is a I<class builder
65B<builder>>. My intent is that an end user does not use this module
66directly, but instead this module is used by module authors to
67build extensions and features onto the Perl 5 object system.
68
94b19069 69=head2 Who is this module for?
70
71This module is specifically for anyone who has ever created or
72wanted to create a module for the Class:: namespace. The tools which
73this module will provide will hopefully make it easier to do more
74complex things with Perl 5 classes by removing such barriers as
75the need to hack the symbol tables, or understand the fine details
76of method dispatch.
77
bfe4d0fc 78=head2 What changes do I have to make to use this module?
79
80This module was designed to be as unintrusive as possible. So many of
81it's features are accessible without B<any> change to your existsing
82code at all. It is meant to be a compliment to your existing code and
83not an intrusion on your code base.
84
85The only feature which requires additions to your code are the
86attribute handling and instance construction features. The only reason
87for this is because Perl 5's object system does not actually have
88these features built in. More information about this feature can be
89found below.
90
91=head2 A Note about Performance?
92
93It is a common misconception that explict MOPs are performance drains.
94But this is not a universal truth at all, it is an side-effect of
95specific implementations. For instance, using Java reflection is much
96slower because the JVM cannot take advantage of any compiler
97optimizations, and the JVM has to deal with much more runtime type
98information as well. Reflection in C# is marginally better as it was
99designed into the language and runtime (the CLR). In contrast, CLOS
100(the Common Lisp Object System) was built to support an explicit MOP,
101and so performance is tuned for it.
102
103This library in particular does it's absolute best to avoid putting
104B<any> drain at all upon your code's performance, while still trying
105to make sure it is fast as well (although only as a secondary
106concern).
107
94b19069 108=head1 PROTOCOLS
109
110The protocol is divided into 3 main sub-protocols:
111
112=over 4
113
114=item The Class protocol
115
116This provides a means of manipulating and introspecting a Perl 5
117class. It handles all of symbol table hacking for you, and provides
118a rich set of methods that go beyond simple package introspection.
119
552e3d24 120See L<Class::MOP::Class> for more details.
121
94b19069 122=item The Attribute protocol
123
124This provides a consistent represenation for an attribute of a
125Perl 5 class. Since there are so many ways to create and handle
126atttributes in Perl 5 OO, this attempts to provide as much of a
127unified approach as possible, while giving the freedom and
128flexibility to subclass for specialization.
129
552e3d24 130See L<Class::MOP::Attribute> for more details.
131
94b19069 132=item The Method protocol
133
134This provides a means of manipulating and introspecting methods in
135the Perl 5 object system. As with attributes, there are many ways to
136approach this topic, so we try to keep it pretty basic, while still
137making it possible to extend the system in many ways.
138
552e3d24 139See L<Class::MOP::Method> for more details.
94b19069 140
141=back
142
552e3d24 143=head1 SEE ALSO
8b978dd5 144
552e3d24 145=head2 Books
8b978dd5 146
147=over 4
148
552e3d24 149=item "The Art of the Meta Object Protocol"
8b978dd5 150
552e3d24 151=item "Advances in Object-Oriented Metalevel Architecture and Reflection"
8b978dd5 152
94b19069 153=back
154
552e3d24 155=head2 Prior Art
8b978dd5 156
157=over 4
158
552e3d24 159=item The Perl 6 MetaModel work
8b978dd5 160
161=over 4
162
552e3d24 163=item L<http://svn.openfoundry.org/pugs/perl5/Perl6-MetaModel>
8b978dd5 164
552e3d24 165=item L<http://svn.openfoundry.org/pugs/perl5/Perl6-ObjectSpace>
8b978dd5 166
167=back
168
94b19069 169=back
170
171=head1 AUTHOR
172
173Stevan Little E<gt>stevan@iinteractive.comE<lt>
174
552e3d24 175Rob Kinyon E<gt>rob@iinteractive.comE<lt>
176
94b19069 177=head1 COPYRIGHT AND LICENSE
178
179Copyright 2006 by Infinity Interactive, Inc.
180
181L<http://www.iinteractive.com>
182
183This library is free software; you can redistribute it and/or modify
184it under the same terms as Perl itself.
185
186=cut