extent is optional, so it can take an empty string