4 use Class::Tiny::_Utils;
12 *{_getglob("${target}::extends")} = sub {
13 *{_getglob("${target}::ISA")} = \@_;
15 *{_getglob("${target}::with")} = sub {
17 die "Only one role supported at a time by with" if @_ > 1;
18 Role::Tiny->apply_role_to_package($_[0], $target);
20 $MAKERS{$target} = {};
21 *{_getglob("${target}::has")} = sub {
22 my ($name, %spec) = @_;
23 ($MAKERS{$target}{accessor} ||= do {
24 require Method::Generate::Accessor;
25 Method::Generate::Accessor->new
26 })->generate_method($target, $name, \%spec);
27 $class->_constructor_maker_for($target)
28 ->register_attribute_specs($name, \%spec);
30 foreach my $type (qw(before after around)) {
31 *{_getglob "${target}::${type}"} = sub {
32 _install_modifier($target, $type, @_);
37 @{"${target}::ISA"} = do {
38 require Class::Tiny::Object; ('Class::Tiny::Object');
39 } unless @{"${target}::ISA"};
43 sub _constructor_maker_for {
44 my ($class, $target) = @_;
45 return unless $MAKERS{$target};
46 $MAKERS{$target}{constructor} ||= do {
47 require Method::Generate::Constructor;
48 Method::Generate::Constructor
51 accessor_generator => do {
52 require Method::Generate::Accessor;
53 Method::Generate::Accessor->new;
57 ->register_attribute_specs(do {
59 # using the -last- entry in @ISA means that classes created by
60 # Role::Tiny as N roles + superclass will still get the attributes
62 if (my $super = do { no strict 'refs'; ${"${target}::ISA"}[-1] }) {
63 if (my $con = $MAKERS{$super}{constructor}) {
64 @spec = %{$con->all_attribute_specs};