2 package Class::MOP::Class;
8 use Scalar::Util 'blessed', 'reftype';
9 use Hash::Util 'lock_keys';
10 use Sub::Name 'subname';
11 use B 'svref_2object';
13 our $VERSION = '0.03';
17 sub meta { Class::MOP::Class->initialize($_[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 if ($class =~ /^Class::MOP::/) {
53 $METAS{$package_name} = bless {
54 '$:package' => $package_name,
56 '$:attribute_metaclass' => 'Class::MOP::Attribute',
57 '$:method_metaclass' => 'Class::MOP::Method',
62 # it is safe to use meta here because
63 # class will always be a subclass of
64 # Class::MOP::Class, which defines meta
65 $METAS{$package_name} = bless $class->meta->construct_instance(%options) => $class
71 my ($class, $package_name, $package_version, %options) = @_;
72 (defined $package_name && $package_name)
73 || confess "You must pass a package name";
74 my $code = "package $package_name;";
75 $code .= "\$$package_name\:\:VERSION = '$package_version';"
76 if defined $package_version;
78 confess "creation of $package_name failed : $@" if $@;
79 my $meta = $class->initialize($package_name);
80 $meta->superclasses(@{$options{superclasses}})
81 if exists $options{superclasses};
83 # process attributes first, so that they can
84 # install accessors, but locally defined methods
85 # can then overwrite them. It is maybe a little odd, but
86 # I think this should be the order of things.
87 if (exists $options{attributes}) {
88 foreach my $attr (@{$options{attributes}}) {
89 $meta->add_attribute($attr);
92 if (exists $options{methods}) {
93 foreach my $method_name (keys %{$options{methods}}) {
94 $meta->add_method($method_name, $options{methods}->{$method_name});
103 # all these attribute readers will be bootstrapped
104 # away in the Class::MOP bootstrap section
106 sub name { $_[0]->{'$:package'} }
107 sub get_attribute_map { $_[0]->{'%:attributes'} }
108 sub attribute_metaclass { $_[0]->{'$:attribute_metaclass'} }
109 sub method_metaclass { $_[0]->{'$:method_metaclass'} }
111 # Instance Construction & Cloning
116 # we need to protect the integrity of the
117 # Class::MOP::Class singletons here, so we
118 # delegate this to &construct_class_instance
119 # which will deal with the singletons
120 return $class->construct_class_instance(@_)
121 if $class->name->isa('Class::MOP::Class');
122 bless $class->construct_instance(@_) => $class->name;
125 sub construct_instance {
126 my ($class, %params) = @_;
128 foreach my $attr ($class->compute_all_applicable_attributes()) {
129 my $init_arg = $attr->init_arg();
130 # try to fetch the init arg from the %params ...
132 $val = $params{$init_arg} if exists $params{$init_arg};
133 # if nothing was in the %params, we can use the
134 # attribute's default value (if it has one)
135 $val ||= $attr->default($instance) if $attr->has_default();
136 $instance->{$attr->name} = $val;
143 my $instance = shift;
144 (blessed($instance) && $instance->isa($class->name))
145 || confess "You must pass an instance ($instance) of the metaclass (" . $class->name . ")";
147 # we need to protect the integrity of the
148 # Class::MOP::Class singletons here, they
149 # should not be cloned
150 return $instance if $instance->isa('Class::MOP::Class');
151 bless $class->clone_instance($instance, @_) => blessed($instance);
156 # my ($object, $cache) = @_;
157 # return $object unless ref($object);
158 # # check for an active cache
159 # return _deep_clone_ref($object, ($cache = {}), 'HASH') if not defined $cache;
160 # # if we have it in the cache them return the cached clone
161 # return $cache->{$object} if exists $cache->{$object};
162 # # now try it as an object, which will in
163 # # turn try it as ref if its not an object
164 # # and store it in case we run into a circular ref
165 # $cache->{$object} = _deep_clone_object($object, $cache);
168 # sub _deep_clone_object {
169 # my ($object, $cache) = @_;
170 # # check to see if its an object, with a clone method
171 # # or if we have an object, with no clone method, then
172 # # we will respect its encapsulation, and not muck with
173 # # its internals. Basically, we assume it does not want
175 # return $cache->{$object} = ($object->can('clone') ? $object->clone() : $object)
176 # if blessed($object);
177 # return $cache->{$object} = _deep_clone_ref($object, $cache);
180 # sub _deep_clone_ref {
181 # my ($object, $cache, $ref_type) = @_;
182 # $ref_type ||= ref($object);
183 # my ($clone, $tied);
184 # if ($ref_type eq 'HASH') {
186 # tie %{$clone}, ref $tied if $tied = tied(%{$object});
187 # %{$clone} = map { ref($_) ? _deep_clone($_, $cache) : $_ } %{$object};
189 # elsif ($ref_type eq 'ARRAY') {
191 # tie @{$clone}, ref $tied if $tied = tied(@{$object});
192 # @{$clone} = map { ref($_) ? _deep_clone($_, $cache) : $_ } @{$object};
194 # elsif ($ref_type eq 'REF' or $ref_type eq 'SCALAR') {
197 # tie ${$clone}, ref $tied if $tied = tied(${$object});
198 # ${$clone} = _deep_clone(${$object}, $cache);
201 # # shallow copy reference to code, glob, regex
204 # # store it in our cache
205 # $cache->{$object} = $clone;
206 # # and return the clone
212 my ($class, $instance, %params) = @_;
214 || confess "You can only clone instances, \$self is not a blessed instance";
216 # this should actually do a deep clone
217 # instead of this cheap hack. I will
219 # (use the Class::Cloneable::Util code)
220 my $clone = { %{$instance} }; #_deep_clone($instance);
221 foreach my $attr ($class->compute_all_applicable_attributes()) {
222 my $init_arg = $attr->init_arg();
223 # try to fetch the init arg from the %params ...
224 $clone->{$attr->name} = $params{$init_arg}
225 if exists $params{$init_arg};
232 # &name should be here too, but it is above
233 # because it gets bootstrapped away
238 ${$self->name . '::VERSION'};
248 @{$self->name . '::ISA'} = @supers;
250 @{$self->name . '::ISA'};
253 sub class_precedence_list {
256 # We need to check for ciruclar inheirtance here.
257 # This will do nothing if all is well, and blow
258 # up otherwise. Yes, it's an ugly hack, better
259 # suggestions are welcome.
260 { $self->name->isa('This is a test for circular inheritance') }
261 # ... and no back to our regularly scheduled program
265 $self->initialize($_)->class_precedence_list()
266 } $self->superclasses()
273 my ($self, $method_name, $method) = @_;
274 (defined $method_name && $method_name)
275 || confess "You must define a method name";
276 # use reftype here to allow for blessed subs ...
277 (reftype($method) && reftype($method) eq 'CODE')
278 || confess "Your code block must be a CODE reference";
279 my $full_method_name = ($self->name . '::' . $method_name);
282 no warnings 'redefine';
283 *{$full_method_name} = subname $full_method_name => $method;
288 ## private utility functions for has_method
289 my $_find_subroutine_package_name = sub { eval { svref_2object($_[0])->GV->STASH->NAME } || '' };
290 my $_find_subroutine_name = sub { eval { svref_2object($_[0])->GV->NAME } || '' };
293 my ($self, $method_name) = @_;
294 (defined $method_name && $method_name)
295 || confess "You must define a method name";
297 my $sub_name = ($self->name . '::' . $method_name);
300 return 0 if !defined(&{$sub_name});
301 return 0 if $_find_subroutine_package_name->(\&{$sub_name}) ne $self->name &&
302 $_find_subroutine_name->(\&{$sub_name}) ne '__ANON__';
309 my ($self, $method_name) = @_;
310 (defined $method_name && $method_name)
311 || confess "You must define a method name";
314 return \&{$self->name . '::' . $method_name}
315 if $self->has_method($method_name);
316 return; # <- make sure to return undef
320 my ($self, $method_name) = @_;
321 (defined $method_name && $method_name)
322 || confess "You must define a method name";
324 my $removed_method = $self->get_method($method_name);
327 delete ${$self->name . '::'}{$method_name}
328 if defined $removed_method;
330 return $removed_method;
333 sub get_method_list {
336 grep { $self->has_method($_) } %{$self->name . '::'};
339 sub compute_all_applicable_methods {
342 # keep a record of what we have seen
343 # here, this will handle all the
344 # inheritence issues because we are
345 # using the &class_precedence_list
346 my (%seen_class, %seen_method);
347 foreach my $class ($self->class_precedence_list()) {
348 next if $seen_class{$class};
349 $seen_class{$class}++;
350 # fetch the meta-class ...
351 my $meta = $self->initialize($class);
352 foreach my $method_name ($meta->get_method_list()) {
353 next if exists $seen_method{$method_name};
354 $seen_method{$method_name}++;
356 name => $method_name,
358 code => $meta->get_method($method_name)
365 sub find_all_methods_by_name {
366 my ($self, $method_name) = @_;
367 (defined $method_name && $method_name)
368 || confess "You must define a method name to find";
370 # keep a record of what we have seen
371 # here, this will handle all the
372 # inheritence issues because we are
373 # using the &class_precedence_list
375 foreach my $class ($self->class_precedence_list()) {
376 next if $seen_class{$class};
377 $seen_class{$class}++;
378 # fetch the meta-class ...
379 my $meta = $self->initialize($class);
381 name => $method_name,
383 code => $meta->get_method($method_name)
384 } if $meta->has_method($method_name);
394 # either we have an attribute object already
395 # or we need to create one from the args provided
396 my $attribute = blessed($_[0]) ? $_[0] : $self->attribute_metaclass->new(@_);
397 # make sure it is derived from the correct type though
398 ($attribute->isa('Class::MOP::Attribute'))
399 || confess "Your attribute must be an instance of Class::MOP::Attribute (or a subclass)";
400 $attribute->attach_to_class($self);
401 $attribute->install_accessors();
402 $self->get_attribute_map->{$attribute->name} = $attribute;
406 my ($self, $attribute_name) = @_;
407 (defined $attribute_name && $attribute_name)
408 || confess "You must define an attribute name";
409 exists $self->get_attribute_map->{$attribute_name} ? 1 : 0;
413 my ($self, $attribute_name) = @_;
414 (defined $attribute_name && $attribute_name)
415 || confess "You must define an attribute name";
416 return $self->get_attribute_map->{$attribute_name}
417 if $self->has_attribute($attribute_name);
420 sub remove_attribute {
421 my ($self, $attribute_name) = @_;
422 (defined $attribute_name && $attribute_name)
423 || confess "You must define an attribute name";
424 my $removed_attribute = $self->get_attribute_map->{$attribute_name};
425 delete $self->get_attribute_map->{$attribute_name}
426 if defined $removed_attribute;
427 $removed_attribute->remove_accessors();
428 $removed_attribute->detach_from_class();
429 return $removed_attribute;
432 sub get_attribute_list {
434 keys %{$self->get_attribute_map};
437 sub compute_all_applicable_attributes {
440 # keep a record of what we have seen
441 # here, this will handle all the
442 # inheritence issues because we are
443 # using the &class_precedence_list
444 my (%seen_class, %seen_attr);
445 foreach my $class ($self->class_precedence_list()) {
446 next if $seen_class{$class};
447 $seen_class{$class}++;
448 # fetch the meta-class ...
449 my $meta = $self->initialize($class);
450 foreach my $attr_name ($meta->get_attribute_list()) {
451 next if exists $seen_attr{$attr_name};
452 $seen_attr{$attr_name}++;
453 push @attrs => $meta->get_attribute($attr_name);
461 sub add_package_variable {
462 my ($self, $variable, $initial_value) = @_;
463 (defined $variable && $variable =~ /^[\$\@\%]/)
464 || confess "variable name does not have a sigil";
466 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
467 if (defined $initial_value) {
469 *{$self->name . '::' . $name} = $initial_value;
472 eval $sigil . $self->name . '::' . $name;
473 confess "Could not create package variable ($variable) because : $@" if $@;
477 sub has_package_variable {
478 my ($self, $variable) = @_;
479 (defined $variable && $variable =~ /^[\$\@\%]/)
480 || confess "variable name does not have a sigil";
481 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
483 defined ${$self->name . '::'}{$name} ? 1 : 0;
486 sub get_package_variable {
487 my ($self, $variable) = @_;
488 (defined $variable && $variable =~ /^[\$\@\%]/)
489 || confess "variable name does not have a sigil";
490 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
492 # try to fetch it first,.. see what happens
493 eval '\\' . $sigil . $self->name . '::' . $name;
494 confess "Could not get the package variable ($variable) because : $@" if $@;
495 # if we didn't die, then we can return it
497 # this is not ideal, better suggestions are welcome
498 eval '\\' . $sigil . $self->name . '::' . $name;
501 sub remove_package_variable {
502 my ($self, $variable) = @_;
503 (defined $variable && $variable =~ /^[\$\@\%]/)
504 || confess "variable name does not have a sigil";
505 my ($sigil, $name) = ($variable =~ /^(.)(.*)$/);
507 delete ${$self->name . '::'}{$name};
518 Class::MOP::Class - Class Meta Object
522 # use this for introspection ...
525 sub meta { Class::MOP::Class->initialize(__PACKAGE__) }
527 # elsewhere in the code ...
529 # add a method to Foo ...
530 Foo->meta->add_method('bar' => sub { ... })
532 # get a list of all the classes searched
533 # the method dispatcher in the correct order
534 Foo->meta->class_precedence_list()
536 # remove a method from Foo
537 Foo->meta->remove_method('bar');
539 # or use this to actually create classes ...
541 Class::MOP::Class->create('Bar' => '0.01' => (
542 superclasses => [ 'Foo' ],
544 Class::MOP:::Attribute->new('$bar'),
545 Class::MOP:::Attribute->new('$baz'),
548 calculate_bar => sub { ... },
549 construct_baz => sub { ... }
555 This is the largest and currently most complex part of the Perl 5
556 meta-object protocol. It controls the introspection and
557 manipulation of Perl 5 classes (and it can create them too). The
558 best way to understand what this module can do, is to read the
559 documentation for each of it's methods.
563 =head2 Self Introspection
569 This will return a B<Class::MOP::Class> instance which is related
570 to this class. Thereby allowing B<Class::MOP::Class> to actually
573 As with B<Class::MOP::Attribute>, B<Class::MOP> will actually
574 bootstrap this module by installing a number of attribute meta-objects
575 into it's metaclass. This will allow this class to reap all the benifits
576 of the MOP when subclassing it.
580 =head2 Class construction
582 These methods will handle creating B<Class::MOP::Class> objects,
583 which can be used to both create new classes, and analyze
584 pre-existing classes.
586 This module will internally store references to all the instances
587 you create with these methods, so that they do not need to be
588 created any more than nessecary. Basically, they are singletons.
592 =item B<create ($package_name, ?$package_version,
593 superclasses =E<gt> ?@superclasses,
594 methods =E<gt> ?%methods,
595 attributes =E<gt> ?%attributes)>
597 This returns a B<Class::MOP::Class> object, bringing the specified
598 C<$package_name> into existence and adding any of the
599 C<$package_version>, C<@superclasses>, C<%methods> and C<%attributes>
602 =item B<initialize ($package_name)>
604 This initializes and returns returns a B<Class::MOP::Class> object
605 for a given a C<$package_name>.
607 =item B<construct_class_instance (%options)>
609 This will construct an instance of B<Class::MOP::Class>, it is
610 here so that we can actually "tie the knot" for B<Class::MOP::Class>
611 to use C<construct_instance> once all the bootstrapping is done. This
612 method is used internally by C<initialize> and should never be called
613 from outside of that method really.
617 =head2 Object instance construction and cloning
619 These methods are B<entirely optional>, it is up to you whether you want
624 =item B<new_object (%params)>
626 This is a convience method for creating a new object of the class, and
627 blessing it into the appropriate package as well. Ideally your class
628 would call a C<new> this method like so:
631 my ($class, %param) = @_;
632 $class->meta->new_object(%params);
635 Of course the ideal place for this would actually be in C<UNIVERSAL::>
636 but that is considered bad style, so we do not do that.
638 =item B<construct_instance (%params)>
640 This method is used to construct an instace structure suitable for
641 C<bless>-ing into your package of choice. It works in conjunction
642 with the Attribute protocol to collect all applicable attributes.
644 This will construct and instance using a HASH ref as storage
645 (currently only HASH references are supported). This will collect all
646 the applicable attributes and layout out the fields in the HASH ref,
647 it will then initialize them using either use the corresponding key
648 in C<%params> or any default value or initializer found in the
649 attribute meta-object.
651 =item B<clone_object ($instance, %params)>
653 This is a convience method for cloning an object instance, then
654 blessing it into the appropriate package. Ideally your class
655 would call a C<clone> this method like so:
658 my ($self, %param) = @_;
659 $self->meta->clone_object($self, %params);
662 Of course the ideal place for this would actually be in C<UNIVERSAL::>
663 but that is considered bad style, so we do not do that.
665 =item B<clone_instance($instance, %params)>
667 This method is a compliment of C<construct_instance> (which means if
668 you override C<construct_instance>, you need to override this one too).
670 This method will clone the C<$instance> structure created by the
671 C<construct_instance> method, and apply any C<%params> passed to it
672 to change the attribute values. The structure returned is (like with
673 C<construct_instance>) an unC<bless>ed HASH reference, it is your
674 responsibility to then bless this cloned structure into the right
685 This is a read-only attribute which returns the package name for the
686 given B<Class::MOP::Class> instance.
690 This is a read-only attribute which returns the C<$VERSION> of the
691 package for the given B<Class::MOP::Class> instance.
695 =head2 Inheritance Relationships
699 =item B<superclasses (?@superclasses)>
701 This is a read-write attribute which represents the superclass
702 relationships of the class the B<Class::MOP::Class> instance is
703 associated with. Basically, it can get and set the C<@ISA> for you.
706 Perl will occasionally perform some C<@ISA> and method caching, if
707 you decide to change your superclass relationship at runtime (which
708 is quite insane and very much not recommened), then you should be
709 aware of this and the fact that this module does not make any
710 attempt to address this issue.
712 =item B<class_precedence_list>
714 This computes the a list of all the class's ancestors in the same order
715 in which method dispatch will be done. This is similair to
716 what B<Class::ISA::super_path> does, but we don't remove duplicate names.
724 =item B<method_metaclass>
726 =item B<add_method ($method_name, $method)>
728 This will take a C<$method_name> and CODE reference to that
729 C<$method> and install it into the class's package.
732 This does absolutely nothing special to C<$method>
733 other than use B<Sub::Name> to make sure it is tagged with the
734 correct name, and therefore show up correctly in stack traces and
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.