public AddressRange toRange(AddressFactory factory) {
			AddressSpace space = factory.getAddressSpace(spaceId);
			return new AddressRangeImpl(space.getAddress(min), space.getAddress(max));
		}
A factory for creating object stores for classes extending {@link DBAnnotatedObject}

<p>
See {@link DBAnnotatedObject} for more documentation, including an example object definition. To
create a store, e.g., for {@code Person}:

<pre>
interface MyDomainObject {
	Person createPerson(String name, String address);

	Person getPerson(long id);

	Collection<? extends Person> getPeopleNamed(String name);
}

public class DBMyDomainObject extends DBCachedDomainObjectAdapter implements MyDomainObject {
	private final DBCachedObjectStoreFactory factory;
	private final DBCachedObjectStore<DBPerson> people;
	private final DBCachedObjectIndex<String, DBPerson> peopleByName;

	public DBMyDomainObject() { // Constructor parameters elided
		// super() invocation elided
		factory = new DBCachedObjectStoreFactory(this);
		try {
			people = factory.getOrCreateCachedStore(DBPerson.TABLE_NAME, DBPerson.class,
				DBPerson::new, false);
			peopleByName = people.getIndex(String.class, DBPerson.NAME_COLUMN);
		}
		catch (VersionException e) {
			// ...
		}
		catch (IOException e) {
			// ...
		}
	}

	&#64;Override
	public Person createPerson(String name, String address) {
		// Locking details elided
		DBPerson person = people.create();
		person.set(name, address);
		return person;
	}

	&#64;Override
	public Person getPerson(int id) {
		// Locking details elided
		return people.getAt(id);
	}

	&#64;Override
	public Collection<Person> getPeopleNamed(String name) {
		// Locking details elided
		return peopleByName.get(name);
	}
}
</pre>

<p>
The factory manages tables on behalf of the domain object, so it is typically the first thing
constructed. In practice, complex domain objects should be composed of several managers, each of
which constructs its own stores, but for simplicity in this example, we construct the people
store in the domain object. This will check the schema and could throw a
{@link VersionException}. Typically, immediately after constructing the store, all desired
indexes of the store are retrieved. The domain object then provides API methods for creating and
retrieving people. Providing direct API client access to the store from a domain object is highly
discouraged.

@implNote This class bears the responsibility of processing the {@link DBAnnotatedField},
          {@link DBAnnotatedColumn}, and {@link DBAnnotatedObjectInfo} annotations. The relevant
          entry point is {{@link #buildInfo(Class)}. It creates a {@link TableInfo} for the given
          class, which builds the schema for creating the {@link Table} that backs an object
          store for that class.
Ghidra/Debug/ProposedUtils/src/main/java/ghidra/util/database/DBCachedObjectStoreFactory.java