boom を使って Datastore のページングで末尾を判定する方法

普通の Web アプリケーションのページングでもほぼ同様ですが、バッチ処理を想定したコードです。
Datastore では Cursor が返ってくるので、MySQLなどでよくある 1件多くとってその id を返す的な方法が使えないので、Count() を投げたとしても運が悪いと limit ぴったりの件数が返ってきてしまって1回多くクエリーを投げないといけない可能性が出てくる。
さらにいうと、Count()自体がクエリーを投げるのでやめたい。

終端まで行くと、最後になげた Cursor と同じ Cursor が返ってくることを確認した(Test コードを書いたり、実際の GAE 上でも動作した)ので、多分これが一番シンプル?
ただ、Undocumented っぽいのでより良い方法知っているひといたら教えてください!
ちなみに、同じ Cursor じゃなくて、EOF 的な err で返してくれたらより嬉しかった。
Filter とかは適当です。
goon とか datastore そのまま使うのでも一緒だと思います。

func NewBoom(ctx context.Context) *boom.Boom {
	ds, err := aedatastore.FromContext(ctx)
	if err != nil {
		panic(err)
	}
	return boom.FromClient(ctx, ds)
}

func GetItems(ctx context.Context, category String, limit int) ([]*Item, error) {
	items := make([]*Item, 0)

	b := NewBoom(ctx)
	cursorStr := ""
	for {
		q := b.NewQuery(b.Kind(Item{})).Filter("Category=", category).Limit(limit)
		if cursorStr != "" {
			cursor, err := b.DecodeCursor(cursorStr)
			if err != nil {
				return nil, err
			}
			q = q.Start(cursor)
		}

		itr := b.Run(q)
		for {
			i := &Item{}
			_, err := itr.Next(i)
			if err != nil {
				if err != iterator.Done {
					return nil, err
				}
				break
			}

			items = append(items, i)
		}

		nc, err := itr.Cursor()
		if err != nil {
			return nil, err
		}

		// 同じカーソルが帰ってきたら終端
		if cursorStr == nc.String() {
			break
		}

		cursorStr = nc.String()
	}

	return items, nil
}