package Data::Revive; # This is (hopefully) the bare minimum of opcodes # necessary to use normal objects. # Pass in "-opcode" to disable any default opcode, # or any opcode not listed here to enable it. my @defaults = qw { const rv2sv rv2av rv2hv rv2gv pushmark anonlist anonhash refgen sassign leaveeval padany aelem helem null undef }; sub revive_object { my $object_text = $_[0]; my @options = @{ $_[1] or [] }; my @allowed_ops = grep { defined } grep !/^-/, ( @options, grep { my $this = $_; not grep /^-$this$/, @options } @defaults ); use Safe; my $safe_env = Safe->new(); $safe_env->permit_only(@allowed_ops); my $obj = $safe_env->reval($object_text) or die $@; if ((grep /^bless$/, @allowed_ops) and ref($obj)) { # Safe's restricted environment causes blessed objects to # lose their 'magic' when passed back out. Here we simply # re-bless the object to correct that. bless $obj, ref($obj); } return $obj; } 1;