Attribute::Builder initial sketch
[scpubgit/Object-Builder.git] / lib / Attribute / Builder / AttributeSet.pm
CommitLineData
a20504a6 1package Attribute::Builder::AttributeSet;
2
3use strictures 1;
4use Scalar::Util qw(blessed);
5use Object::Builder;
6use Package::Variant
7 importing => [ 'Moo::Role' ],
8 subs => [ qw(has around) ];
9
10sub make_variant {
11 my ($class, $target, $name, %opts) = @_;
12
13 my $builder_name = "${name}_builder";
14
15 my $arguments_name = "_${name}_builder_arguments";
16
17 my $final_arguments_name = "_final${arguments_name}";
18
19 my $clearer = $opts{clearer}||'';
20
21 if ($clearer eq '1') {
22 $clearer = $name =~ /^_/ ? "_clear${name}" : "clear_$name";
23 }
24
25 has $arguments_name => (
26 is => 'ro', init_arg => $name, default => sub { {} }
27 );
28
29 has $builder_name => (
30 is => 'ro',
31 builder => 1,
32 handles => {
33 $name => 'object',
34 ($clearer ? ($clearer => 'clear_object') : ()),
35 "${name}_class" => 'class',
36 "${name}_roles" => 'roles',
37 },
38 );
39
40 my %builder_opts = %{$opts{builder}||{}};
41
42 my %builder_args = %{$builder_opts{arguments}||{}};
43
44 $builder_args{class
45
46 my %default_args = %{$opts{default_arguments}||{}};
47
48 install $final_arguments_name => sub {
49 my ($self) = @_;
50 return { %default_args, %{$self->$arguments_name} };
51 };
52
53 install "_build_${builder_name}" => sub {
54 my ($self) = @_;
55 Object::Builder->new(
56 class => 'Object::Builder',
57 %builder_opts,
58 arguments => {
59 %builder_args,
60 arguments => $self->$final_arguments_name
61 }
62 );
63 };
64}
65
661;