Wrap some over-log has statements
[dbsrgits/SQL-Translator.git] / lib / SQL / Translator / Role / ListAttr.pm
CommitLineData
0fb58589 1package SQL::Translator::Role::ListAttr;
2use strictures 1;
3use SQL::Translator::Utils qw(parse_list_arg ex2err);
4use List::MoreUtils qw(uniq);
68d75205 5use Sub::Quote qw(quote_sub);
0fb58589 6
7use Package::Variant (
8 importing => {
9 'Moo::Role' => [],
10 },
11 subs => [qw(has around)],
12);
13
14
15sub make_variant {
16 my ($class, $target_package, $name, %arguments) = @_;
17
18 my $may_throw = delete $arguments{may_throw};
19 my $undef_if_empty = delete $arguments{undef_if_empty};
20 my $append = delete $arguments{append};
21 my $coerce = delete $arguments{uniq}
22 ? sub { [ uniq @{parse_list_arg($_[0])} ] }
23 : \&parse_list_arg;
24
25 has($name => (
26 is => 'rw',
27 (!$arguments{builder} ? (
68d75205 28 default => quote_sub(q{ [] }),
0fb58589 29 ) : ()),
30 coerce => $coerce,
31 %arguments,
32 ));
33
34 around($name => sub {
35 my ($orig, $self) = (shift, shift);
36 my $list = parse_list_arg(@_);
37 $self->$orig([ @{$append ? $self->$orig : []}, @$list ])
38 if @$list;
39
40 my $return;
41 if ($may_throw) {
42 $return = ex2err($orig, $self) or return;
43 }
44 else {
45 $return = $self->$orig;
46 }
47 my $scalar_return = !@{$return} && $undef_if_empty ? undef : $return;
48 return wantarray ? @{$return} : $scalar_return;
49 });
50}
51
521;