sub struct { my ($name, %args) = @_; localscope: { # we want to mangle the symbol table # so set 'no strict refs' no strict 'refs'; foreach my $a (keys %args) { *{"${name}::${a}"} = sub { my ($class, $val) = @_; # val means it needs updating if ($val) { nowarning: { no warnings 'redefine'; *{"${name}::${a}"} = sub { $val; }; } # end nowarning return $val; } return $args{$a} }; } } # end localscope } # Create a new struct struct 'Player' => ( count_var => 0, name => 'Zork', list_of_stuff => ['a', 'b'] ); print Player->name; # you can update a value in this "struct", like so Player->name('Zippy');