Port to Moo
[dbsrgits/DBIx-Class-DeploymentHandler.git] / lib / DBIx / Class / DeploymentHandler / WithApplicatorDumple2.pm
CommitLineData
a976d6e4 1package DBIx::Class::DeploymentHandler::WithApplicatorDumple2;
2
3use strict;
4use warnings;
5
6use Package::Variant
7 importing => {
8 'Module::Runtime' => ['require_module'],
9 'Moose::Role' => [],
10 },
11 subs => [qw(has require_module)];
12
13sub make_variant {
14 my ($class, $target, %args) = @_;
15
16 my $interface_role = $args{interface_role}
17 or die 'interface_role is required!';
18
19 my $class_name = $args{class_name}
20 or die 'class_name is required!';
21
22 my $delegate_name = $args{delegate_name}
23 or die 'delegate_name is required!';
24
25 my $attributes_to_copy = $args{attributes_to_copy} || [];
26 my $attributes_to_assume = $args{attributes_to_assume} || [];
27
28 require_module($class_name);
29
30 my $meta = Class::MOP::class_of($class_name);
31
32 has($_->name => %{ $_->clone })
33 for grep { $_ } map $meta->find_attribute_by_name($_), @{ $attributes_to_copy };
34
35 has($delegate_name => (
36 is => 'ro',
37 lazy_build => 1,
38 does => $interface_role,
39 handles => $interface_role,
40 ));
41
42 install '_build_'.$delegate_name => sub {
43 my $self = shift;
44
45 $class_name->new({
46 map { $_ => $self->$_ }
47 @{ $attributes_to_assume },
48 @{ $attributes_to_copy },
49 })
50 };
51};
52
531;
54
55# vim: ts=2 sw=2 expandtab
56
57__END__