package Plugin;

use strict;
use warnings;

my $load_callback;

sub set_load_callback {
	($load_callback) = @_;
};

sub load_plugin {
	my ($logger, $config, $module) = @_;
	(my $path = $module) =~ s,::,/,g;

	return "$module is already loaded, no changes made" if grep {$_ eq $module} @{$config->{active_plugins}};

	eval {
		require $path . ".pm";
	} or do {
		chomp $@;
		$logger->($@);
		return "Cannot load $module: $!";
	};

	if (not $module->can("configure")) {
		$logger->("Loaded $module but it can't be configured. Probably not a module for us");
		return "Can't configure $module. It probably isn't a module for me. Unloaded it.";
	}

	push @{$config->{active_plugins}}, $module;
	$load_callback->($module);
	return undef;
}

sub unload_plugin {
	my ($logger, $config, $module) = @_;

	return "$module is not loaded, no changes made" unless grep {$_ eq $module} @{$config->{active_plugins}};

	my @new_plugins = grep {$_ ne $module} @{$config->{active_plugins}};
	$config->{active_plugins} = \@new_plugins;
	return undef;
}
1;