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 )