The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Mason::Plugin::LvalueAttributes::Interp;
$Mason::Plugin::LvalueAttributes::Interp::VERSION = '2.22';
use Mason::PluginRole;

after 'modify_loaded_class' => sub {
    my ( $self, $compc ) = @_;
    $self->_add_lvalue_attribute_methods($compc);
};

sub _add_lvalue_attribute_methods {
    my ( $self, $class ) = @_;

    my @attrs = $class->meta->get_all_attributes();
    foreach my $attr (@attrs) {
        if ( $attr->_is_metadata eq 'rw' ) {
            my $name = $attr->name;
            $class->meta->add_method(
                $name,
                sub : lvalue {
                    if ( defined( $_[1] ) ) {
                        $_[0]->{$name} = $_[1];
                    }
                    $_[0]->{$name};
                }
            );
        }
    }
}

1;