cached property decorator, because life is hard