return;
}
+my %SIGIL_MAP = (
+ '$' => 'SCALAR',
+ '@' => 'ARRAY',
+ '%' => 'HASH',
+ '&' => 'CODE',
+ '*' => 'GLOB',
+);
+
+sub _deconstruct_variable_name {
+ my($self, $variable) = @_;
+
+ (defined $variable)
+ || $self->throw_error("You must pass a variable name");
+
+ my $sigil = substr($variable, 0, 1, '');
+
+ (defined $sigil)
+ || $self->throw_error("The variable name must include a sigil");
+
+ (exists $SIGIL_MAP{$sigil})
+ || $self->throw_error("I do not recognize that sigil '$sigil'");
+
+ return ($variable, $SIGIL_MAP{$sigil});
+}
+
+sub has_package_symbol {
+ my($self, $variable) = @_;
+
+ my($name, $type) = $self->_deconstruct_variable_name($variable);
+
+ my $namespace = $self->namespace;
+
+ return 0 unless exists $namespace->{$name};
+
+ my $entry_ref = \$namespace->{$name};
+ if ( ref($entry_ref) eq 'GLOB' ) {
+ return defined( *{$entry_ref}{$type} );
+ }
+ else {
+ # a symbol table entry can be -1 (stub), string (stub with prototype),
+ # or reference (constant)
+ return $type eq 'CODE';
+ }
+}
+
+sub get_package_symbol {
+ my ($self, $variable) = @_;
+
+ my($name, $type) = $self->_deconstruct_variable_name($variable);
+
+ my $namespace = $self->namespace;
+
+ return undef
+ unless exists $namespace->{$name};
+
+ my $entry_ref = \$namespace->{$name};
+
+ if ( ref($entry_ref) eq 'GLOB' ) {
+ return *{$entry_ref}{$type};
+ }
+ else {
+ if ( $type eq 'CODE' ) {
+ no strict 'refs';
+ return \&{ $self->name . '::' . $name };
+ }
+ else {
+ return undef;
+ }
+ }
+}
+
package
Mouse::Meta::Class;