summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordoy <doy@tozt.net>2009-01-25 17:17:18 -0500
committerdoy <doy@tozt.net>2009-01-25 17:17:18 -0500
commitd8c5eaa5b686b2146001a46a943c57b5f2fc750a (patch)
tree2290ec2e5c5d9f5bcf909cf3b9d3523cde3ea243
parent8bdc98875a5e6f70baff898489ed313cbe9e839d (diff)
downloadbot-games-d8c5eaa5b686b2146001a46a943c57b5f2fc750a.tar.gz
bot-games-d8c5eaa5b686b2146001a46a943c57b5f2fc750a.zip
can't just add methods directly to plugins, since they will probably already be immutable - handle this
-rw-r--r--lib/Bot/Games.pm20
1 files changed, 19 insertions, 1 deletions
diff --git a/lib/Bot/Games.pm b/lib/Bot/Games.pm
index f981c27..8476315 100644
--- a/lib/Bot/Games.pm
+++ b/lib/Bot/Games.pm
@@ -36,6 +36,24 @@ sub _get_command {
&& $method_meta->meta->does_role('Bot::Games::Meta::Role::Command');
}
+sub _add_method {
+ my $class = shift;
+ my ($name, $meth) = @_;
+ if ($class->meta->get_method($name)) {
+ warn "Not overriding method $name in $class";
+ return;
+ }
+ if ($class->meta->is_immutable) {
+ my %immutable_opts = %{ $class->meta->get_immutable_options };
+ $class->meta->make_mutable;
+ $class->meta->add_method($name => $meth);
+ $class->meta->make_immutable(%immutable_opts);
+ }
+ else {
+ $class->meta->add_method($name => $meth);
+ }
+}
+
sub said {
my $self = shift;
my ($args) = @_;
@@ -59,7 +77,7 @@ sub said {
if (!defined $game) {
my $game_package = $self->game_package($game_name);
eval "require $game_package";
- $game_package->meta->add_method(say => $say);
+ _add_method($game_package, say => $say);
$game = $game_package->new;
$self->active_games->{$game_name} = $game;
$self->done_init->{$game_name} = 0;