Commit | Line | Data |
b1eebd55 |
1 | package Moo; |
6c74d087 |
2 | |
3 | use strictures 1; |
b1eebd55 |
4 | use Moo::_Utils; |
6c74d087 |
5 | |
6d71fae7 |
6 | our $VERSION = '0.009001'; # 0.9.1 |
7 | $VERSION = eval $VERSION; |
8 | |
14f32032 |
9 | our %MAKERS; |
10 | |
6c74d087 |
11 | sub 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 |
48 | sub _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 |
77 | 1; |