X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMouse%2FPurePerl.pm;h=383c0c8e69734d990062c05a6a980ee87cba2b49;hb=f18345f1ff14d11b71695cde4b67638ae942af8c;hp=f51b4c2540ff3ddfc4a56ae81767b51dc995e510;hpb=39a8df6342dd38b9e489f25ed48d9c3d79e1e288;p=gitmo%2FMouse.git diff --git a/lib/Mouse/PurePerl.pm b/lib/Mouse/PurePerl.pm index f51b4c2..383c0c8 100644 --- a/lib/Mouse/PurePerl.pm +++ b/lib/Mouse/PurePerl.pm @@ -199,6 +199,77 @@ sub add_method { 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;