Acme-Perl-VM
view release on metacpan or search on metacpan
lib/Acme/Perl/VM/Scope.pm view on Meta::CPAN
return;
}
no Mouse;
__PACKAGE__->meta->make_immutable();
package Acme::Perl::VM::Scope::Localizer; # ABSTRACT
use Mouse;
extends 'Acme::Perl::VM::Scope';
has gv => (
is => 'ro',
isa => 'B::GV',
);
has old_ref => (
is => 'rw',
isa => 'Ref',
);
sub save_type;
sub create_ref;
sub sv;
sub BUILD{
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';
( run in 0.704 second using v1.01-cache-2.11-cpan-5a3173703d6 )