   sample: (interval) =>
     @sampledBy Bacon.interval(interval, {})
 
-  changes: => new EventStream (sink) =>
+  changes: => new EventStream [this], (sink) =>
     @subscribe (event) =>
       #console.log "CHANGES", event.describe()
       sink event unless event.isInitial()
   withHandler: (handler) ->
-    new Property(@subscribeInternal, handler)
-  withSubscribe: (subscribe) -> new Property(subscribe)
+    new Property [this], @subscribeInternal, handler
+  withSubscribe: (subscribe) -> new Property [this], subscribe
   toProperty: =>
     assertNoArguments(arguments)
     this
   toEventStream: =>
-    new EventStream (sink) =>
+    new EventStream [this], (sink) =>
       @subscribe (event) =>
         event = event.toNext() if event.isInitial()
         sink event

      return Bacon.never()

    sources = _.map Source.fromObservable, sources

    new EventStream (sink) ->
      match = (p) ->
        _.all(p.ixs, (i) -> sources[i.index].hasAtLeast(i.count))
      cannotSync = (source) ->

Observable :: reduce = Observable :: fold

class EventStream extends Observable
  constructor: (deps, subscribe) ->
    if isFunction(deps)
      subscribe = deps
      deps = []
    assertArray(deps)
    super(deps)
    assertFunction subscribe
    dispatcher = new Dispatcher(subscribe)
    @subscribe = dispatcher.subscribe
