don't try and apply modifiers during role composition
[gitmo/Moo.git] / lib / Moo.pm
CommitLineData
b1eebd55 1package Moo;
6c74d087 2
3use strictures 1;
b1eebd55 4use Moo::_Utils;
6c74d087 5
6d71fae7 6our $VERSION = '0.009001'; # 0.9.1
7$VERSION = eval $VERSION;
8
14f32032 9our %MAKERS;
10
6c74d087 11sub import {
12 my $target = caller;
a16d301e 13 my $class = shift;
de3d4906 14 strictures->import;
6c74d087 15 *{_getglob("${target}::extends")} = sub {
fb5074f6 16 _load_module($_) for @_;
6c74d087 17 *{_getglob("${target}::ISA")} = \@_;
18 };
19 *{_getglob("${target}::with")} = sub {
b1eebd55 20 require Moo::Role;
6c74d087 21 die "Only one role supported at a time by with" if @_ > 1;
b1eebd55 22 Moo::Role->apply_role_to_package($_[0], $target);
6c74d087 23 };
a16d301e 24 $MAKERS{$target} = {};
14f32032 25 *{_getglob("${target}::has")} = sub {
26 my ($name, %spec) = @_;
27 ($MAKERS{$target}{accessor} ||= do {
28 require Method::Generate::Accessor;
29 Method::Generate::Accessor->new
30 })->generate_method($target, $name, \%spec);
a16d301e 31 $class->_constructor_maker_for($target)
32 ->register_attribute_specs($name, \%spec);
14f32032 33 };
6c74d087 34 foreach my $type (qw(before after around)) {
35 *{_getglob "${target}::${type}"} = sub {
dccea57d 36 require Class::Method::Modifiers;
6c74d087 37 _install_modifier($target, $type, @_);
38 };
39 }
40 {
41 no strict 'refs';
42 @{"${target}::ISA"} = do {
b1eebd55 43 require Moo::Object; ('Moo::Object');
6c74d087 44 } unless @{"${target}::ISA"};
45 }
46}
47
a16d301e 48sub _constructor_maker_for {
49 my ($class, $target) = @_;
50 return unless $MAKERS{$target};
51 $MAKERS{$target}{constructor} ||= do {
52 require Method::Generate::Constructor;
53 Method::Generate::Constructor
54 ->new(
55 package => $target,
56 accessor_generator => do {
57 require Method::Generate::Accessor;
58 Method::Generate::Accessor->new;
59 }
60 )
61 ->install_delayed
62 ->register_attribute_specs(do {
63 my @spec;
5d349892 64 # using the -last- entry in @ISA means that classes created by
65 # Role::Tiny as N roles + superclass will still get the attributes
66 # from the superclass
098a367b 67 if (my $super = do { no strict 'refs'; ${"${target}::ISA"}[-1] }) {
a16d301e 68 if (my $con = $MAKERS{$super}{constructor}) {
69 @spec = %{$con->all_attribute_specs};
70 }
71 }
72 @spec;
73 });
74 }
75}
76
6c74d087 771;