use 5.010; use Class::Load qw/load_class/; sub compose { load_class($_) foreach @_; # Note "state" is Perl 5.10 mojo. For back compat, use # "my $count = 0" OUTSIDE the sub definition. That is, # create a closure over it. state $count = 0; my $package = sprintf('%s::__COMPOSED__::X%04x', __PACKAGE__, ++$count); { no strict 'refs'; @{"$package\::ISA"} = @_; } $package; } my $class = compose(qw/LWP::UserAgent Data::Dumper/); say $class; my $obj = $class->new; say $obj; say $obj->can('agent'); say $obj->can('Dumper'); # Or even... my $obj2 = compose(qw/LWP::UserAgent Data::Dumper HTTP::Request/)->new;