I'd consider leaving provides and adding providesForGuests.  That could return an empty list if virt_limit is not set or zero, otherwise the provided products or derived provided products.  It'd be a lot more readable imo, but functionally the same, so up to you.