Acme-Perl-VM
view release on metacpan or search on metacpan
lib/Acme/Perl/VM/Scope.pm view on Meta::CPAN
my($self) = @_;
my $glob_ref = $self->gv->object_2svref;
$self->old_ref( *{$glob_ref}{ $self->save_type } );
*{$glob_ref} = $self->create_ref();
return;
}
sub leave{
my($self) = @_;
*{$self->gv->object_2svref} = $self->old_ref;
return;
}
no Mouse;
__PACKAGE__->meta->make_immutable();
package Acme::Perl::VM::Scope::Scalar;
use Mouse;
extends 'Acme::Perl::VM::Scope::Localizer';
sub _save{
my($self) = @_;
return Acme::Perl::VM::gv_fullname($self->gv, '$');
}
sub save_type(){ 'SCALAR' }
sub create_ref{
my($self) = @_;
if($self->gv->SV->MAGICAL){
bless $self, 'Acme::Perl::VM::Scope::Scalar::Magical';
$self->old_value(${$self->old_ref});
return \local(${*{ $self->gv->object_2svref }}); # to copy MAGIC
}
else{
return \my $scalar;
}
}
sub sv{
my($self) = @_;
return $self->gv->SV;
}
no Mouse;
__PACKAGE__->meta->make_immutable();
package Acme::Perl::VM::Scope::Scalar::Magical;
use Mouse;
extends 'Acme::Perl::VM::Scope::Scalar';
has old_value => (
is => 'rw',
);
sub leave{
my($self) = @_;
$self->SUPER::leave();
${$self->old_ref} = $self->old_value;
return;
}
no Mouse;
__PACKAGE__->meta->make_immutable();
package Acme::Perl::VM::Scope::Array;
use Mouse;
extends 'Acme::Perl::VM::Scope::Localizer';
sub _save{
my($self) = @_;
return Acme::Perl::VM::gv_fullname($self->gv, '@');
}
sub save_type(){ 'ARRAY' }
sub create_ref{
my($self) = @_;
return \local @{*{ $self->gv->object_2svref }};
}
sub sv{
my($self) = @_;
return $self->gv->AV;
}
no Mouse;
__PACKAGE__->meta->make_immutable();
package Acme::Perl::VM::Scope::Hash;
use Mouse;
extends 'Acme::Perl::VM::Scope::Localizer';
sub _save{
my($self) = @_;
return Acme::Perl::VM::gv_fullname($self->gv, '%');
}
sub save_type(){ 'HASH' }
sub create_ref{
my($self) = @_;
return \local %{*{ $self->gv->object_2svref }};
}
sub sv{
my($self) = @_;
return $self->gv->HV;
}
no Mouse;
__PACKAGE__->meta->make_immutable();
__END__
=head1 NAME
Acme::Perl::VM::Scope - Scope classes for APVM
=head1 SYNOPSIS
( run in 3.549 seconds using v1.01-cache-2.11-cpan-b16cb0d3907 )