2 package Class::MOP::Class;
8 use Scalar::Util 'blessed', 'reftype';
9 use Sub::Name 'subname';
10 use B 'svref_2object';
13 our $VERSION = '0.04';
17 sub meta { Class::MOP::Class->initialize(blessed($_[0]) || $_[0]) }
22 # Metaclasses are singletons, so we cache them here.
23 # there is no need to worry about destruction though
24 # because they should die only when the program dies.
25 # After all, do package definitions even get reaped?
30 my $package_name = shift;
31 (defined $package_name && $package_name)
32 || confess "You must pass a package name";
33 # make sure the package name is not blessed
34 $package_name = blessed($package_name) || $package_name;
35 $class->construct_class_instance(':package' => $package_name, @_);
38 # NOTE: (meta-circularity)
39 # this is a special form of &construct_instance
40 # (see below), which is used to construct class
41 # meta-object instances for any Class::MOP::*
42 # class. All other classes will use the more
43 # normal &construct_instance.
44 sub construct_class_instance {
47 my $package_name = $options{':package'};
48 (defined $package_name && $package_name)
49 || confess "You must pass a package name";
50 return $METAS{$package_name} if exists $METAS{$package_name};
51 $class = blessed($class) || $class;
52 # now create the metaclass
54 if ($class =~ /^Class::MOP::/) {
56 '$:package' => $package_name,
58 '$:attribute_metaclass' => $options{':attribute_metaclass'} || 'Class::MOP::Attribute',
59 '$:method_metaclass' => $options{':method_metaclass'} || 'Class::MOP::Method',
64 # it is safe to use meta here because
65 # class will always be a subclass of
66 # Class::MOP::Class, which defines meta
67 $meta = bless $class->meta->construct_instance(%options) => $class
69 # and check the metaclass compatibility
70 $meta->check_metaclass_compatability();
71 $METAS{$package_name} = $meta;
74 sub check_metaclass_compatability {
77 # this is always okay ...
78 return if blessed($self) eq 'Class::MOP::Class';
80 my @class_list = $self->class_precedence_list;
81 shift @class_list; # shift off $self->name
83 foreach my $class_name (@class_list) {
84 my $meta = $METAS{$class_name};
85 ($self->isa(blessed($meta)))
86 || confess $self->name . "->meta => (" . (blessed($self)) . ")" .
87 " is not compatible with the " .
88 $class_name . "->meta => (" . (blessed($meta)) . ")";
94 my ($class, $package_name, $package_version, %options) = @_;
95 (defined $package_name && $package_name)
96 || confess "You must pass a package name";
97 my $code = "package $package_name;";
98 $code .= "\$$package_name\:\:VERSION = '$package_version';"
99 if defined $package_version;
101 confess "creation of $package_name failed : $@" if $@;
102 my $meta = $class->initialize($package_name);
104 $meta->add_method('meta' => sub {
105 Class::MOP::Class->initialize(blessed($_[0]) || $_[0]);
108 $meta->superclasses(@{$options{superclasses}})
109 if exists $options{superclasses};
111 # process attributes first, so that they can
112 # install accessors, but locally defined methods
113 # can then overwrite them. It is maybe a little odd, but
114 # I think this should be the order of things.
115 if (exists $options{attributes}) {
116 foreach my $attr (@{$options{attributes}}) {
117 $meta->add_attribute($attr);
120 if (exists $options{methods}) {
121 foreach my $method_name (keys %{$options{methods}}) {
122 $meta->add_method($method_name, $options{methods}->{$method_name});
131 # all these attribute readers will be bootstrapped
132 # away in the Class::MOP bootstrap section
134 sub name { $_[0]->{'$:package'} }
135 sub get_attribute_map { $_[0]->{'%:attributes'} }
136 sub attribute_metaclass { $_[0]->{'$:attribute_metaclass'} }
137 sub method_metaclass { $_[0]->{'$:method_metaclass'} }
139 # Instance Construction & Cloning
144 # we need to protect the integrity of the
145 # Class::MOP::Class singletons here, so we
146 # delegate this to &construct_class_instance
147 # which will deal with the singletons
148 return $class->construct_class_instance(@_)
149 if $class->name->isa('Class::MOP::Class');
150 bless $class->construct_instance(@_) => $class->name;
153 sub construct_instance {
154 my ($class, %params) = @_;
156 foreach my $attr ($class->compute_all_applicable_attributes()) {
157 my $init_arg = $attr->init_arg();
158 # try to fetch the init arg from the %params ...
160 $val = $params{$init_arg} if exists $params{$init_arg};
161 # if nothing was in the %params, we can use the
162 # attribute's default value (if it has one)
163 $val ||= $attr->default($instance) if $attr->has_default();
164 $instance->{$attr->name} = $val;
171 my $instance = shift;
172 (blessed($instance) && $instance->isa($class->name))
173 || confess "You must pass an instance ($instance) of the metaclass (" . $class->name . ")";
175 # we need to protect the integrity of the
176 # Class::MOP::Class singletons here, they
177 # should not be cloned.
178 return $instance if $instance->isa('Class::MOP::Class');
179 bless $class->clone_instance($instance, @_) => blessed($instance);
183 my ($class, $instance, %params) = @_;
185 || confess "You can only clone instances, \$self is not a blessed instance";
187 # This will deep clone, which might
188 # not be what you always want. So
189 # the best thing is to write a more
190 # controled &clone method locally
191 # in the class (see Class::MOP)
192 my $clone = Clone::clone($instance);
193 foreach my $attr ($class->compute_all_applicable_attributes()) {
194 my $init_arg = $attr->init_arg();
195 # try to fetch the init arg from the %params ...
196 $clone->{$attr->name} = $params{$init_arg}
197 if exists $params{$init_arg};
204 # &name should be here too, but it is above
205 # because it gets bootstrapped away
210 ${$self->name . '::VERSION'};
220 @{$self->name . '::ISA'} = @supers;
222 @{$self->name . '::ISA'};
225 sub class_precedence_list {
228 # We need to check for ciruclar inheirtance here.
229 # This will do nothing if all is well, and blow
230 # up otherwise. Yes, it's an ugly hack, better
231 # suggestions are welcome.
232 { $self->name->isa('This is a test for circular inheritance') }
233 # ... and no back to our regularly scheduled program
237 $self->initialize($_)->class_precedence_list()
238 } $self->superclasses()
245 my ($self, $method_name, $method) = @_;
246 (defined $method_name && $method_name)
247 || confess "You must define a method name";
248 # use reftype here to allow for blessed subs ...
249 (reftype($method) && reftype($method) eq 'CODE')
250 || confess "Your code block must be a CODE reference";
251 my $full_method_name = ($self->name . '::' . $method_name);
254 no warnings 'redefine';
255 *{$full_method_name} = subname $full_method_name => $method;
259 my ($self, $method_name, $method) = @_;
260 (defined $method_name && $method_name)
261 || confess "You must define a method name";
262 # use reftype here to allow for blessed subs ...
263 (reftype($method) && reftype($method) eq 'CODE')
264 || confess "Your code block must be a CODE reference";
265 my $full_method_name = ($self->name . '::' . $method_name);
268 no warnings 'redefine';
269 *{$full_method_name} = $method;
274 ## private utility functions for has_method
275 my $_find_subroutine_package_name = sub { eval { svref_2object($_[0])->GV->STASH->NAME } || '' };
276 my $_find_subroutine_name = sub { eval { svref_2object($_[0])->GV->NAME } || '' };
279 my ($self, $method_name) = @_;
280 (defined $method_name && $method_name)
281 || confess "You must define a method name";
283 my $sub_name = ($self->name . '::' . $method_name);
286 return 0 if !defined(&{$sub_name});
287 return 0 if $_find_subroutine_package_name->(\&{$sub_name}) ne $self->name &&
288 $_find_subroutine_name->(\&{$sub_name}) ne '__ANON__';
295 my ($self, $method_name) = @_;
296 (defined $method_name && $method_name)
297 || confess "You must define a method name";
300 return \&{$self->name . '::' . $method_name}
301 if $self->has_method($method_name);
302 return; # <- make sure to return undef
306 my ($self, $method_name) = @_;
307 (defined $method_name && $method_name)
308 || confess "You must define a method name";
310 my $removed_method = $self->get_method($method_name);
313 delete ${$self->name . '::'}{$method_name}
314 if defined $removed_method;
316 return $removed_method;
319 sub get_method_list {
322 grep { $self->has_method($_) } %{$self->name . '::'};
325 sub compute_all_applicable_methods {
328 # keep a record of what we have seen
329 # here, this will handle all the
330 # inheritence issues because we are
331 # using the &class_precedence_list
332 my (%seen_class, %seen_method);
333 foreach my $class ($self->class_precedence_list()) {
334 next if $seen_class{$class};
335 $seen_class{$class}++;
336 # fetch the meta-class ...
337 my $meta = $self->initialize($class);
338 foreach my $method_name ($meta->get_method_list()) {
339 next if exists $seen_method{$method_name};
340 $seen_method{$method_name}++;
342 name => $method_name,
344 code => $meta->get_method($method_name)
351 sub find_all_methods_by_name {
352 my ($self, $method_name) = @_;
353 (defined $method_name && $method_name)
354 || confess "You must define a method name to find";
356 # keep a record of what we have seen
357 # here, this will handle all the
358 # inheritence issues because we are
359 # using the &class_precedence_list
361 foreach my $class ($self->class_precedence_list()) {
362 next if $seen_class{$class};
363 $seen_class{$class}++;
364 # fetch the meta-class ...
365 my $meta = $self->initialize($class);;
367 name => $method_name,
369 code => $meta->get_method($method_name)
370 } if $meta->has_method($method_name);
380 # either we have an attribute object already
381 # or we need to create one from the args provided
382 my $attribute = blessed($_[0]) ? $_[0] : $self->attribute_metaclass->new(@_);
383 # make sure it is derived from the correct type though
384 ($attribute->isa('Class::MOP::Attribute'))
385 || confess "Your attribute must be an instance of Class::MOP::Attribute (or a subclass)";
386 $attribute->attach_to_class($self);
387 $attribute->install_accessors();
388 $self->get_attribute_map->{$attribute->name} = $attribute;
392 my ($self, $attribute_name) = @_;
393 (defined $attribute_name && $attribute_name)
394 || confess "You must define an attribute name";
395 exists $self->get_attribute_map->{$attribute_name} ? 1 : 0;
399 my ($self, $attribute_name) = @_;
400 (defined $attribute_name && $attribute_name)
401 || confess "You must define an attribute name";
402 return $self->get_attribute_map->{$attribute_name}
403 if $self->has_attribute($attribute_name);
406 sub remove_attribute {
407 my ($self, $attribute_name) = @_;
408 (defined $attribute_name && $attribute_name)
409 || confess "You must define an attribute name";
410 my $removed_attribute = $self->get_attribute_map->{$attribute_name};
411 delete $self->get_attribute_map->{$attribute_name}
412 if defined $removed_attribute;
413 $removed_attribute->remove_accessors();
414 $removed_attribute->detach_from_class();
415 return $removed_attribute;
418 sub get_attribute_list {
420 keys %{$self->get_attribute_map};
423 sub compute_all_applicable_attributes {
426 # keep a record of what we have seen
427 # here, this will handle all the
428 # inheritence issues because we are
429 # using the &class_precedence_list
430 my (%seen_class, %seen_attr);
431 foreach my $class ($self->class_precedence_list()) {
432 next if $seen_class{$class};
433 $seen_class{$class}++;
434 # fetch the meta-class ...
435 my $meta = $self->initialize($class);
436 foreach my $attr_name ($meta->get_attribute_list()) {
437 next if exists $seen_attr{$attr_name};
438 $seen_attr{$attr_name}++;
439 push @attrs => $meta->get_attribute($attr_name);
447 sub add_package_variable {
448 my ($self, $variable, $initial_value) = @_;
449 (defined $variable && $variable =~ /^[\$\@\%]/)
450 || confess "variable name does not have a sigil";
452 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
453 if (defined $initial_value) {
455 *{$self->name . '::' . $name} = $initial_value;
458 eval $sigil . $self->name . '::' . $name;
459 confess "Could not create package variable ($variable) because : $@" if $@;
463 sub has_package_variable {
464 my ($self, $variable) = @_;
465 (defined $variable && $variable =~ /^[\$\@\%]/)
466 || confess "variable name does not have a sigil";
467 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
469 defined ${$self->name . '::'}{$name} ? 1 : 0;
472 sub get_package_variable {
473 my ($self, $variable) = @_;
474 (defined $variable && $variable =~ /^[\$\@\%]/)
475 || confess "variable name does not have a sigil";
476 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
478 # try to fetch it first,.. see what happens
479 eval '\\' . $sigil . $self->name . '::' . $name;
480 confess "Could not get the package variable ($variable) because : $@" if $@;
481 # if we didn't die, then we can return it
483 # this is not ideal, better suggestions are welcome
484 eval '\\' . $sigil . $self->name . '::' . $name;
487 sub remove_package_variable {
488 my ($self, $variable) = @_;
489 (defined $variable && $variable =~ /^[\$\@\%]/)
490 || confess "variable name does not have a sigil";
491 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
493 delete ${$self->name . '::'}{$name};
504 Class::MOP::Class - Class Meta Object
508 # use this for introspection ...
510 # add a method to Foo ...
511 Foo->meta->add_method('bar' => sub { ... })
513 # get a list of all the classes searched
514 # the method dispatcher in the correct order
515 Foo->meta->class_precedence_list()
517 # remove a method from Foo
518 Foo->meta->remove_method('bar');
520 # or use this to actually create classes ...
522 Class::MOP::Class->create('Bar' => '0.01' => (
523 superclasses => [ 'Foo' ],
525 Class::MOP:::Attribute->new('$bar'),
526 Class::MOP:::Attribute->new('$baz'),
529 calculate_bar => sub { ... },
530 construct_baz => sub { ... }
536 This is the largest and currently most complex part of the Perl 5
537 meta-object protocol. It controls the introspection and
538 manipulation of Perl 5 classes (and it can create them too). The
539 best way to understand what this module can do, is to read the
540 documentation for each of it's methods.
544 =head2 Self Introspection
550 This will return a B<Class::MOP::Class> instance which is related
551 to this class. Thereby allowing B<Class::MOP::Class> to actually
554 As with B<Class::MOP::Attribute>, B<Class::MOP> will actually
555 bootstrap this module by installing a number of attribute meta-objects
556 into it's metaclass. This will allow this class to reap all the benifits
557 of the MOP when subclassing it.
561 =head2 Class construction
563 These methods will handle creating B<Class::MOP::Class> objects,
564 which can be used to both create new classes, and analyze
565 pre-existing classes.
567 This module will internally store references to all the instances
568 you create with these methods, so that they do not need to be
569 created any more than nessecary. Basically, they are singletons.
573 =item B<create ($package_name, ?$package_version,
574 superclasses =E<gt> ?@superclasses,
575 methods =E<gt> ?%methods,
576 attributes =E<gt> ?%attributes)>
578 This returns a B<Class::MOP::Class> object, bringing the specified
579 C<$package_name> into existence and adding any of the
580 C<$package_version>, C<@superclasses>, C<%methods> and C<%attributes>
583 =item B<initialize ($package_name)>
585 This initializes and returns returns a B<Class::MOP::Class> object
586 for a given a C<$package_name>.
588 =item B<construct_class_instance (%options)>
590 This will construct an instance of B<Class::MOP::Class>, it is
591 here so that we can actually "tie the knot" for B<Class::MOP::Class>
592 to use C<construct_instance> once all the bootstrapping is done. This
593 method is used internally by C<initialize> and should never be called
594 from outside of that method really.
596 =item B<check_metaclass_compatability>
598 This method is called as the very last thing in the
599 C<construct_class_instance> method. This will check that the
600 metaclass you are creating is compatible with the metaclasses of all
601 your ancestors. For more inforamtion about metaclass compatibility
602 see the C<About Metaclass compatibility> section in L<Class::MOP>.
606 =head2 Object instance construction and cloning
608 These methods are B<entirely optional>, it is up to you whether you want
613 =item B<new_object (%params)>
615 This is a convience method for creating a new object of the class, and
616 blessing it into the appropriate package as well. Ideally your class
617 would call a C<new> this method like so:
620 my ($class, %param) = @_;
621 $class->meta->new_object(%params);
624 Of course the ideal place for this would actually be in C<UNIVERSAL::>
625 but that is considered bad style, so we do not do that.
627 =item B<construct_instance (%params)>
629 This method is used to construct an instace structure suitable for
630 C<bless>-ing into your package of choice. It works in conjunction
631 with the Attribute protocol to collect all applicable attributes.
633 This will construct and instance using a HASH ref as storage
634 (currently only HASH references are supported). This will collect all
635 the applicable attributes and layout out the fields in the HASH ref,
636 it will then initialize them using either use the corresponding key
637 in C<%params> or any default value or initializer found in the
638 attribute meta-object.
640 =item B<clone_object ($instance, %params)>
642 This is a convience method for cloning an object instance, then
643 blessing it into the appropriate package. Ideally your class
644 would call a C<clone> this method like so:
647 my ($self, %param) = @_;
648 $self->meta->clone_object($self, %params);
651 Of course the ideal place for this would actually be in C<UNIVERSAL::>
652 but that is considered bad style, so we do not do that.
654 =item B<clone_instance($instance, %params)>
656 This method is a compliment of C<construct_instance> (which means if
657 you override C<construct_instance>, you need to override this one too).
659 This method will clone the C<$instance> structure created by the
660 C<construct_instance> method, and apply any C<%params> passed to it
661 to change the attribute values. The structure returned is (like with
662 C<construct_instance>) an unC<bless>ed HASH reference, it is your
663 responsibility to then bless this cloned structure into the right
674 This is a read-only attribute which returns the package name for the
675 given B<Class::MOP::Class> instance.
679 This is a read-only attribute which returns the C<$VERSION> of the
680 package for the given B<Class::MOP::Class> instance.
684 =head2 Inheritance Relationships
688 =item B<superclasses (?@superclasses)>
690 This is a read-write attribute which represents the superclass
691 relationships of the class the B<Class::MOP::Class> instance is
692 associated with. Basically, it can get and set the C<@ISA> for you.
695 Perl will occasionally perform some C<@ISA> and method caching, if
696 you decide to change your superclass relationship at runtime (which
697 is quite insane and very much not recommened), then you should be
698 aware of this and the fact that this module does not make any
699 attempt to address this issue.
701 =item B<class_precedence_list>
703 This computes the a list of all the class's ancestors in the same order
704 in which method dispatch will be done. This is similair to
705 what B<Class::ISA::super_path> does, but we don't remove duplicate names.
713 =item B<method_metaclass>
715 =item B<add_method ($method_name, $method)>
717 This will take a C<$method_name> and CODE reference to that
718 C<$method> and install it into the class's package.
721 This does absolutely nothing special to C<$method>
722 other than use B<Sub::Name> to make sure it is tagged with the
723 correct name, and therefore show up correctly in stack traces and
726 =item B<alias_method ($method_name, $method)>
728 This will take a C<$method_name> and CODE reference to that
729 C<$method> and alias the method into the class's package.
732 Unlike C<add_method>, this will B<not> try to name the
733 C<$method> using B<Sub::Name>, it only aliases the method in
736 =item B<has_method ($method_name)>
738 This just provides a simple way to check if the class implements
739 a specific C<$method_name>. It will I<not> however, attempt to check
740 if the class inherits the method (use C<UNIVERSAL::can> for that).
742 This will correctly handle functions defined outside of the package
743 that use a fully qualified name (C<sub Package::name { ... }>).
745 This will correctly handle functions renamed with B<Sub::Name> and
746 installed using the symbol tables. However, if you are naming the
747 subroutine outside of the package scope, you must use the fully
748 qualified name, including the package name, for C<has_method> to
749 correctly identify it.
751 This will attempt to correctly ignore functions imported from other
752 packages using B<Exporter>. It breaks down if the function imported
753 is an C<__ANON__> sub (such as with C<use constant>), which very well
754 may be a valid method being applied to the class.
756 In short, this method cannot always be trusted to determine if the
757 C<$method_name> is actually a method. However, it will DWIM about
758 90% of the time, so it's a small trade off I think.
760 =item B<get_method ($method_name)>
762 This will return a CODE reference of the specified C<$method_name>,
763 or return undef if that method does not exist.
765 =item B<remove_method ($method_name)>
767 This will attempt to remove a given C<$method_name> from the class.
768 It will return the CODE reference that it has removed, and will
769 attempt to use B<Sub::Name> to clear the methods associated name.
771 =item B<get_method_list>
773 This will return a list of method names for all I<locally> defined
774 methods. It does B<not> provide a list of all applicable methods,
775 including any inherited ones. If you want a list of all applicable
776 methods, use the C<compute_all_applicable_methods> method.
778 =item B<compute_all_applicable_methods>
780 This will return a list of all the methods names this class will
781 respond to, taking into account inheritance. The list will be a list of
782 HASH references, each one containing the following information; method
783 name, the name of the class in which the method lives and a CODE
784 reference for the actual method.
786 =item B<find_all_methods_by_name ($method_name)>
788 This will traverse the inheritence hierarchy and locate all methods
789 with a given C<$method_name>. Similar to
790 C<compute_all_applicable_methods> it returns a list of HASH references
791 with the following information; method name (which will always be the
792 same as C<$method_name>), the name of the class in which the method
793 lives and a CODE reference for the actual method.
795 The list of methods produced is a distinct list, meaning there are no
796 duplicates in it. This is especially useful for things like object
797 initialization and destruction where you only want the method called
798 once, and in the correct order.
804 It should be noted that since there is no one consistent way to define
805 the attributes of a class in Perl 5. These methods can only work with
806 the information given, and can not easily discover information on
807 their own. See L<Class::MOP::Attribute> for more details.
811 =item B<attribute_metaclass>
813 =item B<get_attribute_map>
815 =item B<add_attribute ($attribute_name, $attribute_meta_object)>
817 This stores a C<$attribute_meta_object> in the B<Class::MOP::Class>
818 instance associated with the given class, and associates it with
819 the C<$attribute_name>. Unlike methods, attributes within the MOP
820 are stored as meta-information only. They will be used later to
821 construct instances from (see C<construct_instance> above).
822 More details about the attribute meta-objects can be found in the
823 L<Class::MOP::Attribute> or the L<Class::MOP/The Attribute protocol>
826 It should be noted that any accessor, reader/writer or predicate
827 methods which the C<$attribute_meta_object> has will be installed
828 into the class at this time.
830 =item B<has_attribute ($attribute_name)>
832 Checks to see if this class has an attribute by the name of
833 C<$attribute_name> and returns a boolean.
835 =item B<get_attribute ($attribute_name)>
837 Returns the attribute meta-object associated with C<$attribute_name>,
838 if none is found, it will return undef.
840 =item B<remove_attribute ($attribute_name)>
842 This will remove the attribute meta-object stored at
843 C<$attribute_name>, then return the removed attribute meta-object.
846 Removing an attribute will only affect future instances of
847 the class, it will not make any attempt to remove the attribute from
848 any existing instances of the class.
850 It should be noted that any accessor, reader/writer or predicate
851 methods which the attribute meta-object stored at C<$attribute_name>
852 has will be removed from the class at this time. This B<will> make
853 these attributes somewhat inaccessable in previously created
854 instances. But if you are crazy enough to do this at runtime, then
855 you are crazy enough to deal with something like this :).
857 =item B<get_attribute_list>
859 This returns a list of attribute names which are defined in the local
860 class. If you want a list of all applicable attributes for a class,
861 use the C<compute_all_applicable_attributes> method.
863 =item B<compute_all_applicable_attributes>
865 This will traverse the inheritance heirachy and return a list of all
866 the applicable attributes for this class. It does not construct a
867 HASH reference like C<compute_all_applicable_methods> because all
868 that same information is discoverable through the attribute
873 =head2 Package Variables
875 Since Perl's classes are built atop the Perl package system, it is
876 fairly common to use package scoped variables for things like static
877 class variables. The following methods are convience methods for
878 the creation and inspection of package scoped variables.
882 =item B<add_package_variable ($variable_name, ?$initial_value)>
884 Given a C<$variable_name>, which must contain a leading sigil, this
885 method will create that variable within the package which houses the
886 class. It also takes an optional C<$initial_value>, which must be a
887 reference of the same type as the sigil of the C<$variable_name>
890 =item B<get_package_variable ($variable_name)>
892 This will return a reference to the package variable in
895 =item B<has_package_variable ($variable_name)>
897 Returns true (C<1>) if there is a package variable defined for
898 C<$variable_name>, and false (C<0>) otherwise.
900 =item B<remove_package_variable ($variable_name)>
902 This will attempt to remove the package variable at C<$variable_name>.
908 Stevan Little E<lt>stevan@iinteractive.comE<gt>
910 =head1 COPYRIGHT AND LICENSE
912 Copyright 2006 by Infinity Interactive, Inc.
914 L<http://www.iinteractive.com>
916 This library is free software; you can redistribute it and/or modify
917 it under the same terms as Perl itself.