28055b43b19542fe9cc37a74fd403b590cccd856
[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   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;