summaryrefslogtreecommitdiffstats
path: root/lib/MooseX/Exporter/Easy.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/MooseX/Exporter/Easy.pm')
-rw-r--r--lib/MooseX/Exporter/Easy.pm72
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/MooseX/Exporter/Easy.pm b/lib/MooseX/Exporter/Easy.pm
index e69de29..f6d4d5b 100644
--- a/lib/MooseX/Exporter/Easy.pm
+++ b/lib/MooseX/Exporter/Easy.pm
@@ -0,0 +1,72 @@
+package MooseX::Exporter::Easy;
+use Moose ();
+use Moose::Exporter;
+
+use Carp qw(confess);
+use Scalar::Util qw(blessed);
+
+Moose::Exporter->setup_import_methods(
+ with_meta => [qw(with_meta as_is also
+ class_metaroles role_metaroles base_class_roles
+ export)],
+);
+
+sub with_meta {
+ my ($meta, $name, $sub) = @_;
+ confess "with_meta requires a name and a sub to export"
+ unless defined($name) && defined($sub) && ref($sub) eq 'CODE';
+ $meta->add_with_meta($name, $sub);
+}
+
+sub as_is {
+ my ($meta, $name, $sub) = @_;
+ confess "as_is requires a name and a sub to export"
+ unless defined($name) && defined($sub) && ref($sub) eq 'CODE';
+ $meta->add_as_is($name, $sub);
+}
+
+sub also {
+ my ($meta, @also) = @_;
+ $meta->add_also(@also);
+}
+
+sub class_metaroles {
+ my ($meta, $roles) = @_;
+ $meta->class_metaroles($roles);
+}
+
+sub role_metaroles {
+ my ($meta, $roles) = @_;
+ $meta->role_metaroles($roles);
+}
+
+sub base_class_roles {
+ my ($meta, @roles) = @_;
+ $meta->add_base_class_roles(@roles);
+}
+
+sub export {
+ my ($meta) = @_;
+ $meta->setup_exporter;
+}
+
+# move this into Moose::Util?
+sub with_traits {
+ my ($class, @roles) = @_;
+ return Moose::Meta::Class->create_anon_class(
+ superclasses => [$class],
+ roles => \@roles,
+ cache => 1,
+ )->name;
+}
+
+sub init_meta {
+ my $package = shift;
+ my %opts = @_;
+ my $meta_name = blessed(Class::MOP::class_of($opts{for_class}))
+ || 'Class::MOP::Package';
+ $meta_name = with_traits($meta_name, 'MooseX::Exporter::Easy::Meta::Role::Package');
+ my $meta = $meta_name->reinitialize($opts{for_class});
+}
+
+1;