summaryrefslogtreecommitdiffstats
path: root/lib/MooseX/Exporter/Easy/Meta/Role/Package.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/MooseX/Exporter/Easy/Meta/Role/Package.pm')
-rw-r--r--lib/MooseX/Exporter/Easy/Meta/Role/Package.pm128
1 files changed, 128 insertions, 0 deletions
diff --git a/lib/MooseX/Exporter/Easy/Meta/Role/Package.pm b/lib/MooseX/Exporter/Easy/Meta/Role/Package.pm
new file mode 100644
index 0000000..755b50a
--- /dev/null
+++ b/lib/MooseX/Exporter/Easy/Meta/Role/Package.pm
@@ -0,0 +1,128 @@
+package MooseX::Exporter::Easy::Meta::Role::Package;
+use Moose::Role;
+
+has with_meta => (
+ traits => ['Array'],
+ isa => 'ArrayRef[Str]',
+ default => sub { [] },
+ handles => {
+ with_meta => 'elements',
+ _add_with_meta => 'push',
+ }
+);
+
+sub add_with_meta {
+ my $self = shift;
+ my ($name, $sub) = @_;
+ $self->add_package_symbol('&' . $name, $sub);
+ $self->_add_with_meta($name);
+}
+
+has as_is => (
+ traits => ['Array'],
+ isa => 'ArrayRef[Str]',
+ default => sub { [] },
+ handles => {
+ as_is => 'elements',
+ _add_as_is => 'push',
+ }
+);
+
+sub add_as_is {
+ my $self = shift;
+ my ($name, $sub) = @_;
+ $self->add_package_symbol('&' . $name, $sub);
+ $self->_add_as_is($name);
+}
+
+has also => (
+ traits => ['Array'],
+ isa => 'ArrayRef[Str]',
+ default => sub { [] },
+ handles => {
+ also => 'elements',
+ add_also => 'push',
+ }
+);
+
+has class_metaroles => (
+ is => 'rw',
+ isa => 'HashRef[ArrayRef[Str]]',
+ predicate => 'has_class_metaroles',
+);
+
+has role_metaroles => (
+ is => 'rw',
+ isa => 'HashRef[ArrayRef[Str]]',
+ predicate => 'has_role_metaroles',
+);
+
+has base_class_roles => (
+ traits => ['Array'],
+ isa => 'ArrayRef[Str]',
+ default => sub { [] },
+ handles => {
+ base_class_roles => 'elements',
+ add_base_class_roles => 'push',
+ has_base_class_roles => 'count',
+ }
+);
+
+sub setup_exporter {
+ my $self = shift;;
+
+ my ($import, $unimport, $init_meta) = Moose::Exporter->build_import_methods(
+ exporting_package => $self->name,
+ with_meta => [$self->with_meta],
+ as_is => [$self->as_is],
+ also => [$self->also],
+ $self->has_class_metaroles
+ ? (class_metaroles => $self->class_metaroles)
+ : (),
+ $self->has_role_metaroles
+ ? (role_metaroles => $self->role_metaroles)
+ : (),
+ $self->has_base_class_roles
+ ? (base_class_roles => [$self->base_class_roles])
+ : (),
+ );
+
+ $self->add_package_symbol('&import' =>
+ ($self->has_package_symbol('&import_extra')
+ ? sub {
+ my ($package, @args) = @_;
+ $package->import_extra(@args);
+ goto $import;
+ }
+ : $import)
+ );
+ $self->add_package_symbol('&unimport' =>
+ ($self->has_package_symbol('&unimport_extra')
+ ? sub {
+ my ($package, @args) = @_;
+ $package->unimport_extra(@args);
+ goto $unimport;
+ }
+ : $unimport)
+ );
+ if ($init_meta) {
+ $self->add_package_symbol('&init_meta' =>
+ ($self->has_package_symbol('&init_meta_extra')
+ ? sub {
+ my ($package, @args) = @_;
+ $package->init_meta_extra(@args);
+ goto $init_meta;
+ }
+ : $init_meta)
+ );
+ }
+ elsif ($self->has_package_symbol('&init_meta_extra')) {
+ $self->add_package_symbol('&init_meta' =>
+ sub { goto $_[0]->can('init_meta_extra') }
+ );
+ }
+}
+
+no Moose::Role;
+
+1;