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;
256 *{$full_method_name} = $method;
260 my ($self, $method_name, $method) = @_;
261 (defined $method_name && $method_name)
262 || confess "You must define a method name";
263 # use reftype here to allow for blessed subs ...
264 (reftype($method) && reftype($method) eq 'CODE')
265 || confess "Your code block must be a CODE reference";
266 my $full_method_name = ($self->name . '::' . $method_name);
269 no warnings 'redefine';
270 *{$full_method_name} = $method;
275 ## private utility functions for has_method
276 my $_find_subroutine_package_name = sub { eval { svref_2object($_[0])->GV->STASH->NAME } || '' };
277 my $_find_subroutine_name = sub { eval { svref_2object($_[0])->GV->NAME } || '' };
280 my ($self, $method_name) = @_;
281 (defined $method_name && $method_name)
282 || confess "You must define a method name";
284 my $sub_name = ($self->name . '::' . $method_name);
287 return 0 if !defined(&{$sub_name});
288 return 0 if $_find_subroutine_package_name->(\&{$sub_name}) ne $self->name &&
289 $_find_subroutine_name->(\&{$sub_name}) ne '__ANON__';
296 my ($self, $method_name) = @_;
297 (defined $method_name && $method_name)
298 || confess "You must define a method name";
301 return \&{$self->name . '::' . $method_name}
302 if $self->has_method($method_name);
303 return; # <- make sure to return undef
307 my ($self, $method_name) = @_;
308 (defined $method_name && $method_name)
309 || confess "You must define a method name";
311 my $removed_method = $self->get_method($method_name);
314 delete ${$self->name . '::'}{$method_name}
315 if defined $removed_method;
317 return $removed_method;
320 sub get_method_list {
323 grep { $self->has_method($_) } %{$self->name . '::'};
326 sub compute_all_applicable_methods {
329 # keep a record of what we have seen
330 # here, this will handle all the
331 # inheritence issues because we are
332 # using the &class_precedence_list
333 my (%seen_class, %seen_method);
334 foreach my $class ($self->class_precedence_list()) {
335 next if $seen_class{$class};
336 $seen_class{$class}++;
337 # fetch the meta-class ...
338 my $meta = $self->initialize($class);
339 foreach my $method_name ($meta->get_method_list()) {
340 next if exists $seen_method{$method_name};
341 $seen_method{$method_name}++;
343 name => $method_name,
345 code => $meta->get_method($method_name)
352 sub find_all_methods_by_name {
353 my ($self, $method_name) = @_;
354 (defined $method_name && $method_name)
355 || confess "You must define a method name to find";
357 # keep a record of what we have seen
358 # here, this will handle all the
359 # inheritence issues because we are
360 # using the &class_precedence_list
362 foreach my $class ($self->class_precedence_list()) {
363 next if $seen_class{$class};
364 $seen_class{$class}++;
365 # fetch the meta-class ...
366 my $meta = $self->initialize($class);;
368 name => $method_name,
370 code => $meta->get_method($method_name)
371 } if $meta->has_method($method_name);
381 # either we have an attribute object already
382 # or we need to create one from the args provided
383 my $attribute = blessed($_[0]) ? $_[0] : $self->attribute_metaclass->new(@_);
384 # make sure it is derived from the correct type though
385 ($attribute->isa('Class::MOP::Attribute'))
386 || confess "Your attribute must be an instance of Class::MOP::Attribute (or a subclass)";
387 $attribute->attach_to_class($self);
388 $attribute->install_accessors();
389 $self->get_attribute_map->{$attribute->name} = $attribute;
393 my ($self, $attribute_name) = @_;
394 (defined $attribute_name && $attribute_name)
395 || confess "You must define an attribute name";
396 exists $self->get_attribute_map->{$attribute_name} ? 1 : 0;
400 my ($self, $attribute_name) = @_;
401 (defined $attribute_name && $attribute_name)
402 || confess "You must define an attribute name";
403 return $self->get_attribute_map->{$attribute_name}
404 if $self->has_attribute($attribute_name);
407 sub remove_attribute {
408 my ($self, $attribute_name) = @_;
409 (defined $attribute_name && $attribute_name)
410 || confess "You must define an attribute name";
411 my $removed_attribute = $self->get_attribute_map->{$attribute_name};
412 delete $self->get_attribute_map->{$attribute_name}
413 if defined $removed_attribute;
414 $removed_attribute->remove_accessors();
415 $removed_attribute->detach_from_class();
416 return $removed_attribute;
419 sub get_attribute_list {
421 keys %{$self->get_attribute_map};
424 sub compute_all_applicable_attributes {
427 # keep a record of what we have seen
428 # here, this will handle all the
429 # inheritence issues because we are
430 # using the &class_precedence_list
431 my (%seen_class, %seen_attr);
432 foreach my $class ($self->class_precedence_list()) {
433 next if $seen_class{$class};
434 $seen_class{$class}++;
435 # fetch the meta-class ...
436 my $meta = $self->initialize($class);
437 foreach my $attr_name ($meta->get_attribute_list()) {
438 next if exists $seen_attr{$attr_name};
439 $seen_attr{$attr_name}++;
440 push @attrs => $meta->get_attribute($attr_name);
448 sub add_package_variable {
449 my ($self, $variable, $initial_value) = @_;
450 (defined $variable && $variable =~ /^[\$\@\%]/)
451 || confess "variable name does not have a sigil";
453 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
454 if (defined $initial_value) {
456 *{$self->name . '::' . $name} = $initial_value;
459 eval $sigil . $self->name . '::' . $name;
460 confess "Could not create package variable ($variable) because : $@" if $@;
464 sub has_package_variable {
465 my ($self, $variable) = @_;
466 (defined $variable && $variable =~ /^[\$\@\%]/)
467 || confess "variable name does not have a sigil";
468 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
470 defined ${$self->name . '::'}{$name} ? 1 : 0;
473 sub get_package_variable {
474 my ($self, $variable) = @_;
475 (defined $variable && $variable =~ /^[\$\@\%]/)
476 || confess "variable name does not have a sigil";
477 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
479 # try to fetch it first,.. see what happens
480 eval '\\' . $sigil . $self->name . '::' . $name;
481 confess "Could not get the package variable ($variable) because : $@" if $@;
482 # if we didn't die, then we can return it
484 # this is not ideal, better suggestions are welcome
485 eval '\\' . $sigil . $self->name . '::' . $name;
488 sub remove_package_variable {
489 my ($self, $variable) = @_;
490 (defined $variable && $variable =~ /^[\$\@\%]/)
491 || confess "variable name does not have a sigil";
492 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
494 delete ${$self->name . '::'}{$name};
505 Class::MOP::Class - Class Meta Object
509 # use this for introspection ...
511 # add a method to Foo ...
512 Foo->meta->add_method('bar' => sub { ... })
514 # get a list of all the classes searched
515 # the method dispatcher in the correct order
516 Foo->meta->class_precedence_list()
518 # remove a method from Foo
519 Foo->meta->remove_method('bar');
521 # or use this to actually create classes ...
523 Class::MOP::Class->create('Bar' => '0.01' => (
524 superclasses => [ 'Foo' ],
526 Class::MOP:::Attribute->new('$bar'),
527 Class::MOP:::Attribute->new('$baz'),
530 calculate_bar => sub { ... },
531 construct_baz => sub { ... }
537 This is the largest and currently most complex part of the Perl 5
538 meta-object protocol. It controls the introspection and
539 manipulation of Perl 5 classes (and it can create them too). The
540 best way to understand what this module can do, is to read the
541 documentation for each of it's methods.
545 =head2 Self Introspection
551 This will return a B<Class::MOP::Class> instance which is related
552 to this class. Thereby allowing B<Class::MOP::Class> to actually
555 As with B<Class::MOP::Attribute>, B<Class::MOP> will actually
556 bootstrap this module by installing a number of attribute meta-objects
557 into it's metaclass. This will allow this class to reap all the benifits
558 of the MOP when subclassing it.
562 =head2 Class construction
564 These methods will handle creating B<Class::MOP::Class> objects,
565 which can be used to both create new classes, and analyze
566 pre-existing classes.
568 This module will internally store references to all the instances
569 you create with these methods, so that they do not need to be
570 created any more than nessecary. Basically, they are singletons.
574 =item B<create ($package_name, ?$package_version,
575 superclasses =E<gt> ?@superclasses,
576 methods =E<gt> ?%methods,
577 attributes =E<gt> ?%attributes)>
579 This returns a B<Class::MOP::Class> object, bringing the specified
580 C<$package_name> into existence and adding any of the
581 C<$package_version>, C<@superclasses>, C<%methods> and C<%attributes>
584 =item B<initialize ($package_name)>
586 This initializes and returns returns a B<Class::MOP::Class> object
587 for a given a C<$package_name>.
589 =item B<construct_class_instance (%options)>
591 This will construct an instance of B<Class::MOP::Class>, it is
592 here so that we can actually "tie the knot" for B<Class::MOP::Class>
593 to use C<construct_instance> once all the bootstrapping is done. This
594 method is used internally by C<initialize> and should never be called
595 from outside of that method really.
597 =item B<check_metaclass_compatability>
599 This method is called as the very last thing in the
600 C<construct_class_instance> method. This will check that the
601 metaclass you are creating is compatible with the metaclasses of all
602 your ancestors. For more inforamtion about metaclass compatibility
603 see the C<About Metaclass compatibility> section in L<Class::MOP>.
607 =head2 Object instance construction and cloning
609 These methods are B<entirely optional>, it is up to you whether you want
614 =item B<new_object (%params)>
616 This is a convience method for creating a new object of the class, and
617 blessing it into the appropriate package as well. Ideally your class
618 would call a C<new> this method like so:
621 my ($class, %param) = @_;
622 $class->meta->new_object(%params);
625 Of course the ideal place for this would actually be in C<UNIVERSAL::>
626 but that is considered bad style, so we do not do that.
628 =item B<construct_instance (%params)>
630 This method is used to construct an instace structure suitable for
631 C<bless>-ing into your package of choice. It works in conjunction
632 with the Attribute protocol to collect all applicable attributes.
634 This will construct and instance using a HASH ref as storage
635 (currently only HASH references are supported). This will collect all
636 the applicable attributes and layout out the fields in the HASH ref,
637 it will then initialize them using either use the corresponding key
638 in C<%params> or any default value or initializer found in the
639 attribute meta-object.
641 =item B<clone_object ($instance, %params)>
643 This is a convience method for cloning an object instance, then
644 blessing it into the appropriate package. Ideally your class
645 would call a C<clone> this method like so:
648 my ($self, %param) = @_;
649 $self->meta->clone_object($self, %params);
652 Of course the ideal place for this would actually be in C<UNIVERSAL::>
653 but that is considered bad style, so we do not do that.
655 =item B<clone_instance($instance, %params)>
657 This method is a compliment of C<construct_instance> (which means if
658 you override C<construct_instance>, you need to override this one too).
660 This method will clone the C<$instance> structure created by the
661 C<construct_instance> method, and apply any C<%params> passed to it
662 to change the attribute values. The structure returned is (like with
663 C<construct_instance>) an unC<bless>ed HASH reference, it is your
664 responsibility to then bless this cloned structure into the right
675 This is a read-only attribute which returns the package name for the
676 given B<Class::MOP::Class> instance.
680 This is a read-only attribute which returns the C<$VERSION> of the
681 package for the given B<Class::MOP::Class> instance.
685 =head2 Inheritance Relationships
689 =item B<superclasses (?@superclasses)>
691 This is a read-write attribute which represents the superclass
692 relationships of the class the B<Class::MOP::Class> instance is
693 associated with. Basically, it can get and set the C<@ISA> for you.
696 Perl will occasionally perform some C<@ISA> and method caching, if
697 you decide to change your superclass relationship at runtime (which
698 is quite insane and very much not recommened), then you should be
699 aware of this and the fact that this module does not make any
700 attempt to address this issue.
702 =item B<class_precedence_list>
704 This computes the a list of all the class's ancestors in the same order
705 in which method dispatch will be done. This is similair to
706 what B<Class::ISA::super_path> does, but we don't remove duplicate names.
714 =item B<method_metaclass>
716 =item B<add_method ($method_name, $method)>
718 This will take a C<$method_name> and CODE reference to that
719 C<$method> and install it into the class's package.
722 This does absolutely nothing special to C<$method>
723 other than use B<Sub::Name> to make sure it is tagged with the
724 correct name, and therefore show up correctly in stack traces and
727 =item B<alias_method ($method_name, $method)>
729 This will take a C<$method_name> and CODE reference to that
730 C<$method> and alias the method into the class's package.
733 Unlike C<add_method>, this will B<not> try to name the
734 C<$method> using B<Sub::Name>, it only aliases the method in
737 =item B<has_method ($method_name)>
739 This just provides a simple way to check if the class implements
740 a specific C<$method_name>. It will I<not> however, attempt to check
741 if the class inherits the method (use C<UNIVERSAL::can> for that).
743 This will correctly handle functions defined outside of the package
744 that use a fully qualified name (C<sub Package::name { ... }>).
746 This will correctly handle functions renamed with B<Sub::Name> and
747 installed using the symbol tables. However, if you are naming the
748 subroutine outside of the package scope, you must use the fully
749 qualified name, including the package name, for C<has_method> to
750 correctly identify it.
752 This will attempt to correctly ignore functions imported from other
753 packages using B<Exporter>. It breaks down if the function imported
754 is an C<__ANON__> sub (such as with C<use constant>), which very well
755 may be a valid method being applied to the class.
757 In short, this method cannot always be trusted to determine if the
758 C<$method_name> is actually a method. However, it will DWIM about
759 90% of the time, so it's a small trade off I think.
761 =item B<get_method ($method_name)>
763 This will return a CODE reference of the specified C<$method_name>,
764 or return undef if that method does not exist.
766 =item B<remove_method ($method_name)>
768 This will attempt to remove a given C<$method_name> from the class.
769 It will return the CODE reference that it has removed, and will
770 attempt to use B<Sub::Name> to clear the methods associated name.
772 =item B<get_method_list>
774 This will return a list of method names for all I<locally> defined
775 methods. It does B<not> provide a list of all applicable methods,
776 including any inherited ones. If you want a list of all applicable
777 methods, use the C<compute_all_applicable_methods> method.
779 =item B<compute_all_applicable_methods>
781 This will return a list of all the methods names this class will
782 respond to, taking into account inheritance. The list will be a list of
783 HASH references, each one containing the following information; method
784 name, the name of the class in which the method lives and a CODE
785 reference for the actual method.
787 =item B<find_all_methods_by_name ($method_name)>
789 This will traverse the inheritence hierarchy and locate all methods
790 with a given C<$method_name>. Similar to
791 C<compute_all_applicable_methods> it returns a list of HASH references
792 with the following information; method name (which will always be the
793 same as C<$method_name>), the name of the class in which the method
794 lives and a CODE reference for the actual method.
796 The list of methods produced is a distinct list, meaning there are no
797 duplicates in it. This is especially useful for things like object
798 initialization and destruction where you only want the method called
799 once, and in the correct order.
805 It should be noted that since there is no one consistent way to define
806 the attributes of a class in Perl 5. These methods can only work with
807 the information given, and can not easily discover information on
808 their own. See L<Class::MOP::Attribute> for more details.
812 =item B<attribute_metaclass>
814 =item B<get_attribute_map>
816 =item B<add_attribute ($attribute_name, $attribute_meta_object)>
818 This stores a C<$attribute_meta_object> in the B<Class::MOP::Class>
819 instance associated with the given class, and associates it with
820 the C<$attribute_name>. Unlike methods, attributes within the MOP
821 are stored as meta-information only. They will be used later to
822 construct instances from (see C<construct_instance> above).
823 More details about the attribute meta-objects can be found in the
824 L<Class::MOP::Attribute> or the L<Class::MOP/The Attribute protocol>
827 It should be noted that any accessor, reader/writer or predicate
828 methods which the C<$attribute_meta_object> has will be installed
829 into the class at this time.
831 =item B<has_attribute ($attribute_name)>
833 Checks to see if this class has an attribute by the name of
834 C<$attribute_name> and returns a boolean.
836 =item B<get_attribute ($attribute_name)>
838 Returns the attribute meta-object associated with C<$attribute_name>,
839 if none is found, it will return undef.
841 =item B<remove_attribute ($attribute_name)>
843 This will remove the attribute meta-object stored at
844 C<$attribute_name>, then return the removed attribute meta-object.
847 Removing an attribute will only affect future instances of
848 the class, it will not make any attempt to remove the attribute from
849 any existing instances of the class.
851 It should be noted that any accessor, reader/writer or predicate
852 methods which the attribute meta-object stored at C<$attribute_name>
853 has will be removed from the class at this time. This B<will> make
854 these attributes somewhat inaccessable in previously created
855 instances. But if you are crazy enough to do this at runtime, then
856 you are crazy enough to deal with something like this :).
858 =item B<get_attribute_list>
860 This returns a list of attribute names which are defined in the local
861 class. If you want a list of all applicable attributes for a class,
862 use the C<compute_all_applicable_attributes> method.
864 =item B<compute_all_applicable_attributes>
866 This will traverse the inheritance heirachy and return a list of all
867 the applicable attributes for this class. It does not construct a
868 HASH reference like C<compute_all_applicable_methods> because all
869 that same information is discoverable through the attribute
874 =head2 Package Variables
876 Since Perl's classes are built atop the Perl package system, it is
877 fairly common to use package scoped variables for things like static
878 class variables. The following methods are convience methods for
879 the creation and inspection of package scoped variables.
883 =item B<add_package_variable ($variable_name, ?$initial_value)>
885 Given a C<$variable_name>, which must contain a leading sigil, this
886 method will create that variable within the package which houses the
887 class. It also takes an optional C<$initial_value>, which must be a
888 reference of the same type as the sigil of the C<$variable_name>
891 =item B<get_package_variable ($variable_name)>
893 This will return a reference to the package variable in
896 =item B<has_package_variable ($variable_name)>
898 Returns true (C<1>) if there is a package variable defined for
899 C<$variable_name>, and false (C<0>) otherwise.
901 =item B<remove_package_variable ($variable_name)>
903 This will attempt to remove the package variable at C<$variable_name>.
909 Stevan Little E<lt>stevan@iinteractive.comE<gt>
911 =head1 COPYRIGHT AND LICENSE
913 Copyright 2006 by Infinity Interactive, Inc.
915 L<http://www.iinteractive.com>
917 This library is free software; you can redistribute it and/or modify
918 it under the same terms as Perl itself.