Commit | Line | Data |
94b19069 |
1 | |
2 | package Class::MOP; |
3 | |
4 | use strict; |
5 | use warnings; |
6 | |
8b978dd5 |
7 | use Scalar::Util 'blessed'; |
8 | |
94b19069 |
9 | our $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 |
17 | 1; |
18 | |
19 | __END__ |
20 | |
21 | =pod |
22 | |
23 | =head1 NAME |
24 | |
25 | Class::MOP - A Meta Object Protocol for Perl 5 |
26 | |
27 | =head1 SYNOPSIS |
28 | |
29 | # ... coming soon |
30 | |
31 | =head1 DESCRIPTON |
32 | |
33 | This module is an attempt to create a meta object protocol for the |
34 | Perl 5 object system. It makes no attempt to change the behavior or |
35 | characteristics of the Perl 5 object system, only to create a |
27e31eaf |
36 | protocol for its manipulation and introspection. |
94b19069 |
37 | |
38 | That said, it does attempt to create the tools for building a rich |
39 | set of extensions to the Perl 5 object system. Every attempt has been |
40 | made for these tools to keep to the spirit of the Perl 5 object |
41 | system that we all know and love. |
42 | |
bfe4d0fc |
43 | =head2 What is a Meta Object Protocol? |
44 | |
45 | A meta object protocol is an API to an object system. |
46 | |
47 | To be more specific, it is a set of abstractions of the components of |
48 | an object system (typically things like; classes, object, methods, |
49 | object attributes, etc.). These abstractions can then be used to both |
50 | inspect and manipulate the object system which they describe. |
51 | |
52 | It can be said that there are two MOPs for any object system; the |
53 | implicit MOP, and the explicit MOP. The implicit MOP handles things |
54 | like method dispatch or inheritance, which happen automatically as |
55 | part of how the object system works. The explicit MOP typically |
56 | handles the introspection/reflection features of the object system. |
57 | All object systems have implicit MOPs, without one, they would not |
58 | work. Explict MOPs however as less common, and depending on the |
59 | language can vary from restrictive (Reflection in Java or C#) to |
60 | wide open (CLOS is a perfect example). |
61 | |
94b19069 |
62 | =head2 Who is this module for? |
63 | |
64 | This module is specifically for anyone who has ever created or |
65 | wanted to create a module for the Class:: namespace. The tools which |
66 | this module will provide will hopefully make it easier to do more |
67 | complex things with Perl 5 classes by removing such barriers as |
68 | the need to hack the symbol tables, or understand the fine details |
69 | of method dispatch. |
70 | |
bfe4d0fc |
71 | =head2 What changes do I have to make to use this module? |
72 | |
73 | This module was designed to be as unintrusive as possible. So many of |
74 | it's features are accessible without B<any> change to your existsing |
75 | code at all. It is meant to be a compliment to your existing code and |
76 | not an intrusion on your code base. |
77 | |
78 | The only feature which requires additions to your code are the |
79 | attribute handling and instance construction features. The only reason |
80 | for this is because Perl 5's object system does not actually have |
81 | these features built in. More information about this feature can be |
82 | found below. |
83 | |
84 | =head2 A Note about Performance? |
85 | |
86 | It is a common misconception that explict MOPs are performance drains. |
87 | But this is not a universal truth at all, it is an side-effect of |
88 | specific implementations. For instance, using Java reflection is much |
89 | slower because the JVM cannot take advantage of any compiler |
90 | optimizations, and the JVM has to deal with much more runtime type |
91 | information as well. Reflection in C# is marginally better as it was |
92 | designed into the language and runtime (the CLR). In contrast, CLOS |
93 | (the Common Lisp Object System) was built to support an explicit MOP, |
94 | and so performance is tuned for it. |
95 | |
96 | This library in particular does it's absolute best to avoid putting |
97 | B<any> drain at all upon your code's performance, while still trying |
98 | to make sure it is fast as well (although only as a secondary |
99 | concern). |
100 | |
94b19069 |
101 | =head1 PROTOCOLS |
102 | |
103 | The protocol is divided into 3 main sub-protocols: |
104 | |
105 | =over 4 |
106 | |
107 | =item The Class protocol |
108 | |
109 | This provides a means of manipulating and introspecting a Perl 5 |
110 | class. It handles all of symbol table hacking for you, and provides |
111 | a rich set of methods that go beyond simple package introspection. |
112 | |
552e3d24 |
113 | See L<Class::MOP::Class> for more details. |
114 | |
94b19069 |
115 | =item The Attribute protocol |
116 | |
117 | This provides a consistent represenation for an attribute of a |
118 | Perl 5 class. Since there are so many ways to create and handle |
119 | atttributes in Perl 5 OO, this attempts to provide as much of a |
120 | unified approach as possible, while giving the freedom and |
121 | flexibility to subclass for specialization. |
122 | |
552e3d24 |
123 | See L<Class::MOP::Attribute> for more details. |
124 | |
94b19069 |
125 | =item The Method protocol |
126 | |
127 | This provides a means of manipulating and introspecting methods in |
128 | the Perl 5 object system. As with attributes, there are many ways to |
129 | approach this topic, so we try to keep it pretty basic, while still |
130 | making it possible to extend the system in many ways. |
131 | |
552e3d24 |
132 | See L<Class::MOP::Method> for more details. |
94b19069 |
133 | |
134 | =back |
135 | |
552e3d24 |
136 | =head1 SEE ALSO |
8b978dd5 |
137 | |
552e3d24 |
138 | =head2 Books |
8b978dd5 |
139 | |
140 | =over 4 |
141 | |
552e3d24 |
142 | =item "The Art of the Meta Object Protocol" |
8b978dd5 |
143 | |
552e3d24 |
144 | =item "Advances in Object-Oriented Metalevel Architecture and Reflection" |
8b978dd5 |
145 | |
94b19069 |
146 | =back |
147 | |
552e3d24 |
148 | =head2 Prior Art |
8b978dd5 |
149 | |
150 | =over 4 |
151 | |
552e3d24 |
152 | =item The Perl 6 MetaModel work |
8b978dd5 |
153 | |
154 | =over 4 |
155 | |
552e3d24 |
156 | =item L<http://svn.openfoundry.org/pugs/perl5/Perl6-MetaModel> |
8b978dd5 |
157 | |
552e3d24 |
158 | =item L<http://svn.openfoundry.org/pugs/perl5/Perl6-ObjectSpace> |
8b978dd5 |
159 | |
160 | =back |
161 | |
94b19069 |
162 | =back |
163 | |
164 | =head1 AUTHOR |
165 | |
166 | Stevan Little E<gt>stevan@iinteractive.comE<lt> |
167 | |
552e3d24 |
168 | Rob Kinyon E<gt>rob@iinteractive.comE<lt> |
169 | |
94b19069 |
170 | =head1 COPYRIGHT AND LICENSE |
171 | |
172 | Copyright 2006 by Infinity Interactive, Inc. |
173 | |
174 | L<http://www.iinteractive.com> |
175 | |
176 | This library is free software; you can redistribute it and/or modify |
177 | it under the same terms as Perl itself. |
178 | |
179 | =cut |