in reply to Question about defined loop

Depending on when you want to set $self->{_not_exposed_reason},
sub not_exposed_reason { my ($self, $not_exposed_reason) = @_; return $self->{_not_exposed_reason} = defined($not_exposed_reason) ? $not_exposed_reason : "No exposed reason"; }
or
sub not_exposed_reason { my ($self, $not_exposed_reason) = @_; if (defined($not_exposed_reason)) { return $self->{_not_exposed_reason} = $not_exposed_reason; } else { return "No exposed reason"; } }

Note that

defined(X) ? X : Y
can be written as
X // Y
since Perl 5.10.