diff --git a/spec/composite-disposable-spec.coffee b/spec/composite-disposable-spec.coffee index 880e13e..0b9799b 100644 --- a/spec/composite-disposable-spec.coffee +++ b/spec/composite-disposable-spec.coffee @@ -29,3 +29,13 @@ describe "CompositeDisposable", -> expect(disposable1.disposed).toBe true expect(disposable2.disposed).toBe false expect(disposable3.disposed).toBe true + + describe "::addIfDisposable(disposables...)", -> + it "ignores disposables without a ::dispose function", -> + composite = new CompositeDisposable + composite.addIfDisposable(disposable1, undefined, null) + composite.addIfDisposable(whatever: ->) + + composite.dispose() + + expect(disposable1.disposed).toBe true diff --git a/src/composite-disposable.coffee b/src/composite-disposable.coffee index 6ae38be..eb36719 100644 --- a/src/composite-disposable.coffee +++ b/src/composite-disposable.coffee @@ -57,6 +57,18 @@ class CompositeDisposable @disposables.add(disposable) for disposable in arguments return + # Public: Add a disposable to be disposed when the composite is disposed, + # ignoring it if it does not implement `.dispose()`. + # + # See {CompositeDisposable::add} documentation for further information. + # + # * `disposable` {Disposable} instance or any object with a `.dispose()` + # method. + addIfDisposable: -> + for disposable in arguments + @add(disposable) if typeof disposable?.dispose is "function" + return + # Public: Remove a previously added disposable. # # * `disposable` {Disposable} instance or any object with a `.dispose()`