Thanks moritz, this looks like the cleanest solution.
I didn't know about the :lvalue attribute -- that's quite handy. Sure beats what I was doing for accessors/mutators before:
sub classvar {
my $self = shift;
$self->{classvar} = shift if @_;
return $self->{classvar};
}