//! (static)
Util::Reference<TexCoordAttributeAccessor> TexCoordAttributeAccessor::create(MeshVertexData & _vData, Util::StringIdentifier name) {
    const VertexAttribute & attr = assertAttribute(_vData, name);
    if(attr.getNumValues() == 2 && attr.getDataType() == GL_FLOAT) {
        return new TexCoordAttributeAccessor(_vData, attr);
    } else {
        throw std::invalid_argument(unimplementedFormatMsg + name.toString() + '\'');
    }
}
//! (static)
Util::Reference<UIntAttributeAccessor> UIntAttributeAccessor::create(MeshVertexData & _vData, Util::StringIdentifier name) {
	const VertexAttribute & attr = assertAttribute(_vData, name);
	if(attr.getDataType() == GL_UNSIGNED_INT) {
		return new UIntAttributeAccessor(_vData, attr);
	} else {
		throw std::invalid_argument(unimplementedFormatMsg + name.toString() + '\'');
	}
}
//! (static) Factory
Util::Reference<ColorAttributeAccessor> ColorAttributeAccessor::create(MeshVertexData & _vData, Util::StringIdentifier name) {
    const VertexAttribute & attr = assertAttribute(_vData, name);
    if(attr.getNumValues() >= 4 && attr.getDataType() == GL_FLOAT) {
        return new ColorAttributeAccessor4f(_vData, attr);
    } else if(attr.getNumValues() >= 3 && attr.getDataType() == GL_FLOAT) {
        return new ColorAttributeAccessor3f(_vData, attr);
    } else if(attr.getNumValues() >= 4 && attr.getDataType() == GL_UNSIGNED_BYTE) {
        return new ColorAttributeAccessor4ub(_vData, attr);
    } else {
        throw std::invalid_argument(unimplementedFormatMsg + name.toString() + '\'');
    }
}