2 package Class::MOP::Class;
8 use Scalar::Util 'blessed', 'reftype';
9 use Sub::Name 'subname';
10 use B 'svref_2object';
12 our $VERSION = '0.01';
17 # Metaclasses are singletons, so we cache them here.
18 # there is no need to worry about destruction though
19 # because they should die only when the program dies.
20 # After all, do package definitions even get reaped?
23 my ($class, $package_name) = @_;
24 (defined $package_name && $package_name)
25 || confess "You must pass a package name";
26 $METAS{$package_name} ||= bless [ $package_name, {} ] => blessed($class) || $class;
31 my ($class, $package_name, $package_version, %options) = @_;
32 (defined $package_name && $package_name)
33 || confess "You must pass a package name";
34 my $code = "package $package_name;";
35 $code .= "\$$package_name\:\:VERSION = '$package_version';"
36 if defined $package_version;
38 confess "creation of $package_name failed : $@" if $@;
39 my $meta = $class->initialize($package_name);
40 $meta->superclasses(@{$options{superclasses}})
41 if exists $options{superclasses};
42 if (exists $options{methods}) {
43 foreach my $method_name (keys %{$options{methods}}) {
44 $meta->add_method($method_name, $options{methods}->{$method_name});
52 sub name { ${$_[0]}[0] }
57 ${$self->name . '::VERSION'};
67 @{$self->name . '::ISA'} = @supers;
69 @{$self->name . '::ISA'};
72 sub class_precedence_list {
75 # We need to check for ciruclar inheirtance here.
76 # This will do nothing if all is well, and blow
77 # up otherwise. Yes, it's an ugly hack, better
78 # suggestions are welcome.
79 { $self->name->isa('This is a test for circular inheritance') }
80 # ... and no back to our regularly scheduled program
84 $self->initialize($_)->class_precedence_list()
85 } $self->superclasses()
92 my ($self, $method_name, $method) = @_;
93 (defined $method_name && $method_name)
94 || confess "You must define a method name";
95 # use reftype here to allow for blessed subs ...
96 (reftype($method) && reftype($method) eq 'CODE')
97 || confess "Your code block must be a CODE reference";
98 my $full_method_name = ($self->name . '::' . $method_name);
101 no warnings 'redefine';
102 *{$full_method_name} = subname $full_method_name => $method;
107 ## private utility functions for has_method
108 my $_find_subroutine_package_name = sub { eval { svref_2object($_[0])->GV->STASH->NAME } };
109 my $_find_subroutine_name = sub { eval { svref_2object($_[0])->GV->NAME } };
112 my ($self, $method_name) = @_;
113 (defined $method_name && $method_name)
114 || confess "You must define a method name";
116 my $sub_name = ($self->name . '::' . $method_name);
119 return 0 if !defined(&{$sub_name});
120 return 0 if $_find_subroutine_package_name->(\&{$sub_name}) ne $self->name &&
121 $_find_subroutine_name->(\&{$sub_name}) ne '__ANON__';
128 my ($self, $method_name) = @_;
129 (defined $method_name && $method_name)
130 || confess "You must define a method name";
133 return \&{$self->name . '::' . $method_name}
134 if $self->has_method($method_name);
135 return; # <- make sure to return undef
139 my ($self, $method_name) = @_;
140 (defined $method_name && $method_name)
141 || confess "You must define a method name";
143 my $removed_method = $self->get_method($method_name);
146 delete ${$self->name . '::'}{$method_name}
147 if defined $removed_method;
149 return $removed_method;
152 sub get_method_list {
155 grep { $self->has_method($_) } %{$self->name . '::'};
158 sub compute_all_applicable_methods {
161 # keep a record of what we have seen
162 # here, this will handle all the
163 # inheritence issues because we are
164 # using the &class_precedence_list
165 my (%seen_class, %seen_method);
166 foreach my $class ($self->class_precedence_list()) {
167 next if $seen_class{$class};
168 $seen_class{$class}++;
169 # fetch the meta-class ...
170 my $meta = $self->initialize($class);
171 foreach my $method_name ($meta->get_method_list()) {
172 next if exists $seen_method{$method_name};
173 $seen_method{$method_name}++;
175 name => $method_name,
177 code => $meta->get_method($method_name)
184 ## Recursive Version of compute_all_applicable_methods
185 # sub compute_all_applicable_methods {
186 # my ($self, $seen) = @_;
190 # if (exists $seen->{$_}) {
197 # class => $self->name,
198 # code => $self->get_method($_)
201 # } $self->get_method_list()),
203 # $self->initialize($_)->compute_all_applicable_methods($seen)
204 # } $self->superclasses()
208 sub find_all_methods_by_name {
209 my ($self, $method_name) = @_;
210 (defined $method_name && $method_name)
211 || confess "You must define a method name to find";
213 # keep a record of what we have seen
214 # here, this will handle all the
215 # inheritence issues because we are
216 # using the &class_precedence_list
218 foreach my $class ($self->class_precedence_list()) {
219 next if $seen_class{$class};
220 $seen_class{$class}++;
221 # fetch the meta-class ...
222 my $meta = $self->initialize($class);
224 name => $method_name,
226 code => $meta->get_method($method_name)
227 } if $meta->has_method($method_name);
238 sub remove_attribute {}
239 sub get_attribute_list {}
240 sub compute_all_applicable_attributes {}
241 sub create_all_accessors {}
251 Class::MOP::Class - Class Meta Object
259 =head2 Class construction
261 These methods handle creating Class objects, which can be used to
262 both create new classes, and analyze pre-existing ones.
264 This module will internally store references to all the instances
265 you create with these methods, so that they do not need to be
266 created any more than nessecary. Basically, they are singletons.
270 =item B<create ($package_name, ?$package_version,
271 superclasses => ?@superclasses,
272 methods => ?%methods,
273 attributes => ?%attributes)>
275 This returns the basic Class object, bringing the specified
276 C<$package_name> into existence and adding any of the
277 C<$package_version>, C<@superclasses>, C<%methods> and C<%attributes>
280 =item B<initialize ($package_name)>
282 This initializes a Class object for a given a C<$package_name>.
286 =head2 Instance construction
290 =item B<construct_instance ($canidate, %params)>
292 This will construct and instance using the C<$canidate> as storage
293 (currently only HASH references are supported). This will collect all
294 the applicable attribute meta-objects and layout out the fields in the
295 C<$canidate>, it will then initialize them using either use the
296 corresponding key in C<%params> or any default value or initializer
297 found in the attribute meta-object.
307 This is a read-only attribute which returns the package name that
308 the Class is stored in.
312 This is a read-only attribute which returns the C<$VERSION> of the
313 package the Class is stored in.
317 =head2 Inheritance Relationships
321 =item B<superclasses (?@superclasses)>
323 This is a read-write attribute which represents the superclass
324 relationships of this Class. Basically, it can get and set the
327 =item B<class_precedence_list>
329 This computes the a list of the Class's ancestors in the same order
330 in which method dispatch will be done.
338 =item B<add_method ($method_name, $method)>
340 This will take a C<$method_name> and CODE reference to that
341 C<$method> and install it into the Class.
343 B<NOTE> : This does absolutely nothing special to C<$method>
344 other than use B<Sub::Name> to make sure it is tagged with the
345 correct name, and therefore show up correctly in stack traces and
348 =item B<has_method ($method_name)>
350 This just provides a simple way to check if the Class implements
351 a specific C<$method_name>. It will I<not> however, attempt to check
352 if the class inherits the method.
354 This will correctly handle functions defined outside of the package
355 that use a fully qualified name (C<sub Package::name { ... }>).
357 This will correctly handle functions renamed with B<Sub::Name> and
358 installed using the symbol tables. However, if you are naming the
359 subroutine outside of the package scope, you must use the fully
360 qualified name, including the package name, for C<has_method> to
361 correctly identify it.
363 This will attempt to correctly ignore functions imported from other
364 packages using B<Exporter>. It breaks down if the function imported
365 is an C<__ANON__> sub (such as with C<use constant>), which very well
366 may be a valid method being applied to the class.
368 In short, this method cannot always be trusted to determine if the
369 C<$method_name> is actually a method. However, it will DWIM about
370 90% of the time, so it's a small trade off IMO.
372 =item B<get_method ($method_name)>
374 This will return a CODE reference of the specified C<$method_name>,
375 or return undef if that method does not exist.
377 =item B<remove_method ($method_name)>
379 This will attempt to remove a given C<$method_name> from the Class.
380 It will return the CODE reference that it has removed, and will
381 attempt to use B<Sub::Name> to clear the methods associated name.
383 =item B<get_method_list>
385 This will return a list of method names for all I<locally> defined
386 methods. It does B<not> provide a list of all applicable methods,
387 including any inherited ones. If you want a list of all applicable
388 methods, use the C<compute_all_applicable_methods> method.
390 =item B<compute_all_applicable_methods>
392 This will return a list of all the methods names this Class will
393 support, taking into account inheritance. The list will be a list of
394 HASH references, each one containing the following information; method
395 name, the name of the class in which the method lives and a CODE
396 reference for the actual method.
398 =item B<find_all_methods_by_name ($method_name)>
400 This will traverse the inheritence hierarchy and locate all methods
401 with a given C<$method_name>. Similar to
402 C<compute_all_applicable_methods> it returns a list of HASH references
403 with the following information; method name (which will always be the
404 same as C<$method_name>), the name of the class in which the method
405 lives and a CODE reference for the actual method.
407 The list of methods produced is a distinct list, meaning there are no
408 duplicates in it. This is especially useful for things like object
409 initialization and destruction where you only want the method called
410 once, and in the correct order.
416 It should be noted that since there is no one consistent way to define
417 the attributes of a class in Perl 5. These methods can only work with
418 the information given, and can not easily discover information on
423 =item B<add_attribute ($attribute_name, $attribute_meta_object)>
425 This stores a C<$attribute_meta_object> in the Class object and
426 associates it with the C<$attribute_name>. Unlike methods, attributes
427 within the MOP are stored as meta-information only. They will be used
428 later to construct instances from (see C<construct_instance> above).
429 More details about the attribute meta-objects can be found in the
430 L<The Attribute protocol> section of this document.
432 =item B<has_attribute ($attribute_name)>
434 Checks to see if this Class has an attribute by the name of
435 C<$attribute_name> and returns a boolean.
437 =item B<get_attribute ($attribute_name)>
439 Returns the attribute meta-object associated with C<$attribute_name>,
440 if none is found, it will return undef.
442 =item B<remove_attribute ($attribute_name)>
444 This will remove the attribute meta-object stored at
445 C<$attribute_name>, then return the removed attribute meta-object.
447 B<NOTE:> Removing an attribute will only affect future instances of
448 the class, it will not make any attempt to remove the attribute from
449 any existing instances of the class.
451 =item B<get_attribute_list>
453 This returns a list of attribute names which are defined in the local
454 class. If you want a list of all applicable attributes for a class,
455 use the C<compute_all_applicable_attributes> method.
457 =item B<compute_all_applicable_attributes>
459 This will traverse the inheritance heirachy and return a list of HASH
460 references for all the applicable attributes for this class. The HASH
461 references will contain the following information; the attribute name,
462 the class which the attribute is associated with and the actual
463 attribute meta-object
465 =item B<create_all_accessors>
467 This will communicate with all of the classes attributes to create
468 and install the appropriate accessors. (see L<The Attribute Protocol>
469 below for more details).
475 Stevan Little E<gt>stevan@iinteractive.comE<lt>
477 =head1 COPYRIGHT AND LICENSE
479 Copyright 2006 by Infinity Interactive, Inc.
481 L<http://www.iinteractive.com>
483 This library is free software; you can redistribute it and/or modify
484 it under the same terms as Perl itself.