96c2a66dcef84fcee410621460de77c64a8a8bc5
[scpubgit/Q-Branch.git] / lib / with.pm
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   mro::set_mro($new_class, 'c3');
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;