package plugin; my @callbacks; sub register { push @callbacks, shift; } sub load { my $plugindir = shift; @callbacks = (); opendir PLUGIN, $plugindir or die "Cannot open dir $plugindir: $!\n"; @plugins = grep { /\.pl$/ } readdir(PLUGIN); closedir PLUGIN; foreach $plugin (@plugins) { print "Loading $plugindir/$plugin...\n"; require "$plugindir/$plugin"; } return @callbacks; } 1; package example; sub new { return bless {}; } sub hello { my $self = shift; print "hello!\n"; } plugin::register(example->new); package main; use plugin; @plugins = plugin::load("a_directory"); foreach $plugin (@plugins) { $plugin->hello(); }