diff options
author | doy <doy@tozt.net> | 2009-01-25 17:17:18 -0500 |
---|---|---|
committer | doy <doy@tozt.net> | 2009-01-25 17:17:18 -0500 |
commit | d8c5eaa5b686b2146001a46a943c57b5f2fc750a (patch) | |
tree | 2290ec2e5c5d9f5bcf909cf3b9d3523cde3ea243 | |
parent | 8bdc98875a5e6f70baff898489ed313cbe9e839d (diff) | |
download | bot-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.pm | 20 |
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; |