summaryrefslogtreecommitdiffstats
path: root/lib/Bot/Games/OO/Game.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Bot/Games/OO/Game.pm')
-rw-r--r--lib/Bot/Games/OO/Game.pm47
1 files changed, 47 insertions, 0 deletions
diff --git a/lib/Bot/Games/OO/Game.pm b/lib/Bot/Games/OO/Game.pm
new file mode 100644
index 0000000..b95b33a
--- /dev/null
+++ b/lib/Bot/Games/OO/Game.pm
@@ -0,0 +1,47 @@
+package Bot::Games::OO::Game;
+use Bot::Games::OO ();
+
+sub command {
+ my $class = shift;
+ my ($name, $code, %args) = @_;
+ my $method_meta = $class->meta->get_method($name);
+ my $superclass = Moose::blessed($method_meta) || 'Moose::Meta::Method';
+ my $method_metaclass = Moose::Meta::Class->create_anon_class(
+ superclasses => [$superclass],
+ roles => ['Bot::Games::Meta::Role::Command'],
+ cache => 1,
+ );
+ if ($method_meta) {
+ $method_metaclass->rebless_instance($method_meta);
+ }
+ else {
+ $method_meta = $method_metaclass->name->wrap(
+ $code,
+ package_name => $class,
+ name => $name,
+ );
+ $class->meta->add_method($name, $method_meta);
+ }
+ for my $attr (Bot::Games::Meta::Role::Command->meta->get_attribute_list) {
+ $method_meta->$attr($args{$attr}) if exists $args{$attr};
+ }
+}
+
+Moose::Exporter->setup_import_methods(
+ with_caller => ['command'],
+ also => ['Bot::Games::OO'],
+);
+
+sub init_meta {
+ shift;
+ my %options = @_;
+ Moose->init_meta(%options);
+ Moose::Util::MetaRole::apply_metaclass_roles(
+ for_class => $options{for_class},
+ attribute_metaclass_roles => ['Bot::Games::Meta::Role::Attribute'],
+ metaclass_roles => ['Bot::Games::Meta::Role::Class'],
+ );
+ return $options{for_class}->meta;
+}
+
+1;