1 package Attribute::Builder::AttributeSet;
4 use Scalar::Util qw(blessed);
7 importing => [ 'Moo::Role' ],
8 subs => [ qw(has around) ];
11 my ($class, $target, $name, %opts) = @_;
13 my $builder_name = "${name}_builder";
15 my $arguments_name = "_${name}_builder_arguments";
17 my $final_arguments_name = "_final${arguments_name}";
19 my $clearer = $opts{clearer}||'';
21 if ($clearer eq '1') {
22 $clearer = $name =~ /^_/ ? "_clear${name}" : "clear_$name";
25 has $arguments_name => (
26 is => 'ro', init_arg => $name, default => sub { {} }
29 has $builder_name => (
34 ($clearer ? ($clearer => 'clear_object') : ()),
35 "${name}_class" => 'class',
36 "${name}_roles" => 'roles',
40 my %builder_opts = %{$opts{builder}||{}};
42 my %builder_args = %{$builder_opts{arguments}||{}};
46 my %default_args = %{$opts{default_arguments}||{}};
48 install $final_arguments_name => sub {
50 return { %default_args, %{$self->$arguments_name} };
53 install "_build_${builder_name}" => sub {
56 class => 'Object::Builder',
60 arguments => $self->$final_arguments_name