public Iterable<Work<TI>> iterableWork() {
		final Master<TI, TO> master = this;

		return new Iterable<Work<TI>>() {

			@Override
			public Iterator<Work<TI>> iterator() {
				return new Iterator<Work<TI>>() {

					@Override
					public boolean hasNext() {
						return master.hasNext();
					}

					@SuppressWarnings("unchecked")
					@Override
					public Work<TI> next() {
						// Create data array
						TI data[] = (TI[]) new Object[batchSize];
						for (int i = 0; (i < batchSize) && hasNext(); i++) {
							data[i] = master.next();
							if (debug) Gpr.debug("countInputObjects:" + countInputObjects);
							if (showEvery > 0) Gpr.showMark(countInputObjects++, showEvery);
						}

						// Create work
						return new Work<TI>(data);
					}

					@Override
					public void remove() {
						throw new RuntimeException("Unimplemented method");
					}
				};
			}
		};
	}