sub _engine { trace() if $ENV{TRACE}; my $self = shift; my $p = shift; my $struct = shift; my $engine = defined $p->{engine} ? $p->{engine} : $self->{params}{engine}; if (not $engine or $engine eq ''){ return $struct; } my $cref; if (not ref($engine) eq 'CODE'){ # engine is a name my $engine_module = $self->{namespace} . "::Engine"; my $compiler = $engine_module->new; # engine isn't in the dispatch table if (! $compiler->exists($engine)){ confess "engine '$engine' is not implemented.\n"; } eval { $cref = $compiler->{engines}{$engine}->(); }; # engine has bad func val in dispatch table, but key is ok if ($@){ $@ = "\n[Devel::Examine::Subs speaking] " . "dispatch table in Devel::Examine::Subs::Engine " . "has a mistyped function as a value, but the key is ok\n\n" . $@; confess $@; } } if (ref($engine) eq 'CODE'){ $cref = $engine; } if ($self->{params}{engine_dump}){ my $subs = $cref->($p, $struct); print Dumper $subs; exit; } return $cref; }