...but the downside is that the default-value is not declared with the attribute but buried in the BUILDer-code and to make this work the attribute has to be "rw".
How about using the initializer option?
use strict;
use warnings;
use 5.012;
package Dog;
use Moose;
has color => (
is => "ro",
initializer => sub { my ($self, $attr_val, $setter) = @_;
defined $attr_val or $setter->('black');
}
);
my $dog = Dog->new(color => undef);
say $dog->color;
--output:--
black
I am not so much interested in the feature itself, but it is interesting to see some examples of Moose-metaprogramming at work...
Never mind.