sub userid { my $self = shift; $self->session->param('userid') and return $self->session->param('userid'); my $username = $self->authen->username or return; $self->session->param( 'userid' => ($self->_get_user_id($username) or confess()) ); } sub _get_user_id( my ($self,$username) = @_; # your way of accessing the user id # even if it's heavy, it's called once per session }