add with.pm to extras
[scpubgit/Q-Branch.git] / lib / with.pm
CommitLineData
b73fb1b6 1package with;
2
3# This must be its own dist later
4
5use strict;
6use warnings;
7use if $] < '5.010', 'MRO::Compat';
8use mro;
9
10my $comp = 'A001';
11
12sub 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
27sub 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
381;