summaryrefslogtreecommitdiffstats
path: root/lib/MooseX/Extension.pm
blob: f69c181950b934c87de4610a34828e56f14771b6 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
package MooseX::Extension;
use Moose ();
use Moose::Exporter;
use Moose::Util::MetaRole;
use Data::OptList qw(mkopt_hash);

my ($unimport, $on_unimport, $args);

sub import {
    my $caller = caller;
    shift;
    $args = mkopt_hash(\@_);
    my @also = grep { !defined $args->{$_} && delete $args->{$_} } keys %$args;
    my $import;
    ($import, $unimport) = Moose::Exporter->build_import_methods(
        also => \@also,
    );
    $args->{-on_import}->($caller) if defined $args->{-on_import};
    $on_unimport = delete $args->{-on_unimport};
    goto $import;
}

sub unimport {
    my $caller = caller;
    $on_unimport->($caller) if defined $on_unimport;
    goto $unimport;
}


sub init_meta {
    shift;
    my %options = @_;
    Moose->init_meta(%options);
    Moose::Util::MetaRole::apply_metaclass_roles(
        for_class => $options{for_class},
    );
    Moose::Util::MetaRole::apply_base_class_roles(
        for_class => $options{for_class},
    );
    return Class::MOP::class_of($options{for_class});
}

1;