Commit | Line | Data |
b73fb1b6 |
1 | package with; |
2 | |
3 | # This must be its own dist later |
4 | |
5 | use strict; |
6 | use warnings; |
7 | use if $] < '5.010', 'MRO::Compat'; |
8 | use mro; |
9 | |
10 | my $comp = 'A001'; |
11 | |
12 | sub components { |
13 | my ($inv, @comp) = @_; |
14 | my $class = ref($inv) || $inv; |
15 | my $new_class = join('::', $class, $comp++); |
16 | require Class::C3::Componentised; |
17 | my @comp_classes = map +(/^\+(.+)$/ ? "${class}::$1" : $_), @comp; |
18 | Class::C3::Componentised->ensure_class_loaded($_) for @comp_classes; |
19 | Class::C3::Componentised->inject_base( |
20 | $new_class, |
21 | @comp_classes, $class, |
22 | ); |
23 | return $new_class unless ref($inv); |
24 | return bless($inv, $new_class); |
25 | } |
26 | |
27 | sub roles { |
28 | my ($inv, @roles) = @_; |
29 | my $class = ref($inv) || $inv; |
30 | require Role::Tiny; |
31 | my $new_class = Role::Tiny->create_class_with_roles($class, |
32 | map +(/^\+(.+)$/ ? "${class}::$1" : $_), @roles |
33 | ); |
34 | return $new_class unless ref($inv); |
35 | return bless($inv, $new_class); |
36 | } |
37 | |
38 | 1; |