package Penguin::Compartment;
$VERSION = 3.00;
use Safe;
sub new {
my ($class, %args) = @_;
$self = { 'compartment' => new Safe,
'shares' => { },
'opset' => Safe::empty_opset,
};
bless $self, $class;
}
# if you share using 'register', then in the future,
# clients may be able to examine their own rights. Sharing
# using other methods might not permit them to do so.
sub register {
my ($self, %args) = @_;
my $share = $args{'Share'};
$self->{'compartment'}->share_from(scalar(caller), [$args{'Share'}]);
}
# unregister is not currently useful. The compartment is
# usually destructed and recreated instead. This may change,
# but unregister probably will too.
sub unregister {
my ($self, %args) = @_;
my ($share) = $args{'Share'};
undef $self->{'shares'}->{$share};
# reminder to myself: bother tim about unshare and clear_share.
1;
}
sub initialize {
my ($self, %args) = @_;
my $opstring = $args{'Operations'} || "";
$self->{'compartment'}->permit_only(Safe::ops_to_opset(split(/ +/, $opstring)));
1;
}
sub execute {
my ($self, %args) = @_;
$code = $args{'Code'};
$self->{'compartment'}->reval($code);
}
1;
syntax highlighted by Code2HTML, v. 0.9.1