redesigned Output API: Output<T> behaves more like pointer, ie., data creation is delegated to user