           @push event
         else
           Bacon.more)
+
   takeWhile: (f, args...) ->
     convertArgsToFunction this, f, args, (f) ->
       withDescription(this, "takeWhile", f, @withHandler (event) ->

    @subscribeInternal (event) ->
      #console.log "CHANGES", event.toString()
      sink event unless event.isInitial()
  withHandler: (handler) ->
    new Property describe(this, "withHandler", handler), @subscribeInternal, handler
  toProperty: ->
    assertNoArguments(arguments)
    this
  toEventStream: ->
    new EventStream describe(this, "toEventStream"), (sink) =>
      @subscribeInternal (event) ->
        event = event.toNext() if event.isInitial()
        sink event
  and: (other) -> withDescription(this, "and", other, @combine(other, (x, y) -> x && y))
  or:  (other) -> withDescription(this, "or", other, @combine(other, (x, y) -> x || y))
  delay: (delay) -> @delayChanges("delay", delay, (changes) -> changes.delay(delay))
  debounce: (delay) -> @delayChanges("debounce", delay, (changes) -> changes.debounce(delay))
  throttle: (delay) -> @delayChanges("throttle", delay, (changes) -> changes.throttle(delay))
  delayChanges: (desc..., f) ->
    withDescription(this, desc...,
      addPropertyInitValueToStream(this, f(@changes())))
  takeUntil: (stopper) ->
    changes = @changes().takeUntil(stopper)
    withDescription(this, "takeUntil", stopper,
      addPropertyInitValueToStream(this, changes))
  startWith: (value) ->
    withDescription(this, "startWith", value,
      @scan(value, (prev, next) -> next))
  bufferingThrottle: ->
    super.bufferingThrottle(arguments...).toProperty()



  bufferWithTime: (delay) ->
    withDescription(this, "bufferWithTime", delay, @bufferWithTimeOrCount(delay, Number.MAX_VALUE))

  bufferWithCount: (count) ->
    withDescription(this, "bufferWithCount", count, @bufferWithTimeOrCount(undefined, count))

