Look into moving the implementation of transformation methods to Reactable. This'll make it easier to sub-class Reactable.
class Stream<T> {
...
}
abstract class Reactable<T, R extends Reactable> extends Stream<T> {
R map(block(T value)) {
return createInstance(super.map(block));
}
R createInstance(Stream<T> stream);
}
class Property<T> extends Reactable<T, Property<T>> {
Property<T> createInstance(Stream<T> stream) {
return new Property.fromStream(stream);
}
}