sub produce {
my ( $pkg, @args ) = @_;
my %args = %{ {@args} };
my $type = delete $args{type} || q{};
my %attr = %{ delete $args{attrs} || {} };
my ( $item_module, $item_class ) = $pkg->find_product( $type, %att
+r );
if ( !exists $already_required{$item_class} ) {
## compile inside eval, so we get a real error message at leas
+t once
local $EVAL_ERROR = q{};
my $is_compiled = eval {
require $item_module;
return 1;
};
if ( !$is_compiled ) {
$EVAL_ERROR ||= 'Unknown error';
confess "$item_module didn't compile: $EVAL_ERROR";
}
# track already compiled classes
my @parents;
{
no strict 'vars';
*parents = *{"$item_class\::ISA"}{ARRAY};
}
foreach my $p (@parents) {
next if ! $p =~ m/^TDP::/;
$already_required{$p} = ++$counter
}
$already_required{$item_class} = ++$counter;
}
return $item_class->new(%args);
}