in reply to Dynamic loading of object-oriented plugins

That's allowed and quite fine, in my opinion. Another approach is to use a reference, as you say:
sub register_plugin { my $class = shift; if (defined(my $constructor = UNIVERSAL::can($class, 'new'))) { push @callbacks, sub { $constructor->($class) }; } } foreach my $callback (@callbacks) { my $obj = $callback->(); $obj->hello(); }
It's a little more paranoid, but I prefer your original version.