1 package Tak::EvalService;
3 use Eval::WithLexicals;
4 use Data::Dumper::Concise;
5 use Capture::Tiny qw(capture);
8 with 'Tak::Role::Service';
10 has 'eval_withlexicals' => (is => 'lazy');
12 has 'service_client' => (is => 'ro', predicate => 'has_service_client');
14 sub _build_eval_withlexicals {
16 Eval::WithLexicals->new(
17 $self->has_service_client
18 ? (lexicals => { '$client' => \($self->service_client) })
24 my ($self, $perl) = @_;
26 die [ mistake => eval_input => "No code supplied" ];
28 if (my $ref = ref($perl)) {
29 die [ mistake => eval_input => "Code was a ${ref} reference" ];
32 my ($stdout, $stderr);
34 ($stdout, $stderr) = capture {
35 @ret = $self->eval_withlexicals->eval($perl);
41 ($ok, @ret) = (0, $@);
44 unless (eval { $dumped_ret = Dumper(@ret); 1 }) {
45 $dumped_ret = "Error dumping ${\($ok ? 'result' : 'exception')}: $@";
49 stdout => $stdout, stderr => $stderr,
50 ($ok ? 'return' : 'exception') => $dumped_ret