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, |
5d4463f6 |
21 | @comp_classes, $class |
b73fb1b6 |
22 | ); |
5d4463f6 |
23 | mro::set_mro($new_class, 'c3'); |
b73fb1b6 |
24 | return $new_class unless ref($inv); |
25 | return bless($inv, $new_class); |
26 | } |
27 | |
28 | sub roles { |
29 | my ($inv, @roles) = @_; |
30 | my $class = ref($inv) || $inv; |
31 | require Role::Tiny; |
32 | my $new_class = Role::Tiny->create_class_with_roles($class, |
33 | map +(/^\+(.+)$/ ? "${class}::$1" : $_), @roles |
34 | ); |
35 | return $new_class unless ref($inv); |
36 | return bless($inv, $new_class); |
37 | } |
38 | |
39 | 1; |