package LockedBox; use Moose; use MooseX::StrictConstructor; use Hash::Util qw[ lock_keys lock_value ]; has bar => ( is => 'ro' ); sub BUILD { my $self = shift; lock_keys( %$self ); foreach my $attr ( $self->meta->get_all_attributes ) { lock_value( %$self, $attr->name ) } } #### my $foo = LockedBox->new( bar => 10 ); #### my $foo = LockedBox->new( bar => 10, baz => 100 ); #### $foo->{baz} = 20; #### $foo->{bar} = 20;