{ package Foo; print "Hello World\n"; } #### Package Foo; sub new { my $class = shift; my $this = bless {}, $class; $this->_init(); return $this; } sub _init { my $cpt = new Safe(); my $s = sub {eval q/print "PACKAGE is ",__PACKAGE__,"\n"/; }; # explicitly permit use of 'eval' $cpt->permit('entereval'); my $deparse = B::Deparse->new(); # prepend 'sub' so we have an anonymous sub later my $code_str = 'sub '.$deparse->coderef2text($s); # Seems to have no effect on behavior to remove package statements # $code_str =~ s/package \w+\;//g; print "DEPARSED $code_str\n"; my $result = $cpt->reval($parsed); die $@ if $@; $result->(); }