use v5.14;
use strict;
use warnings;
# Ugly hack code
#
package MooseX::AttributeShouldIgnoreFalse {
BEGIN { $INC{'MooseX/AttributeShouldIgnoreFalse.pm'} = __FILE__ };
use Sub::Exporter -setup => {
exports => ['attribute_should_ignore_false'],
groups => {
default => ['attribute_should_ignore_false'],
},
};
sub attribute_should_ignore_false {
my @attrs = @_;
my $meta = (scalar caller)->meta;
$meta->add_around_method_modifier(BUILDARGS => sub {
my $orig = shift;
my $self = shift;
my $parm = $self->$orig(@_);
$parm->{$_} || delete $parm->{$_} for @attrs;
$parm;
});
}
}
# Lovely declarative code
#
package Foo {
use Moose;
use MooseX::AttributeShouldIgnoreFalse;
has foo => (is => 'ro', default => 'whatever');
attribute_should_ignore_false 'foo';
}
my $value = 'hello';
print Foo->new(foo => $value)->dump;
$value = '';
print Foo->new(foo => $value)->dump;
package Cow { use Moo; has name => (is => 'lazy', default => sub { 'Mooington' }) } say Cow->new->name
|