anchor.diff:      watchers
       |> Seq.length
       |> ignore //force iteration
  +
       timer.Start()
  -    fun () -> 
  -        for watcher in watchers do
  -            watcher.EnableRaisingEvents <- false
  -            watcher.Dispose()
  -        timer.Dispose()
  +
  +    { new System.IDisposable with
  +          member this.Dispose() = 
  +              for watcher in watchers do
  +                  watcher.EnableRaisingEvents <- false
  +                  watcher.Dispose()
  +              timer.Dispose() }
  
positive.code: ﻿[<AutoOpen>]
  /// This module contains helper function to create and extract zip archives.
  module Fake.ChangeWatcher
  
  open System.IO
  
negative.code:                 Name = e.Name
                  Status = status })
  
  /// Watches the for changes in the matching files.
  /// Returns an IDisposable which allows to dispose all FileSystemWatchers.
  ///
  /// ## Parameters
  ///  - `onChange` - function to call when a change is detected.
  ///  - `fileIncludes` - The glob pattern for files to watch for changes.
  ///
  /// ## Sample
  ///
  ///     Target "Watch" (fun _ ->
  ///         use watcher = !! "c:/projects/watchDir/*.txt" |> WatchChanges (fun changes -> 
  ///             // do something
  ///         )
  ///     
  ///         System.Console.ReadLine() |> ignore
  ///     
  ///         watcher.Dispose() // if you need to cleanup the watches.
  ///     )
  ///
  let WatchChanges (onChange : FileChange seq -> unit) (fileIncludes : FileIncludes) = 
      let dirsToWatch = fileIncludes.Includes |> Seq.map (fun file -> Globbing.getRoot fileIncludes.BaseDirectory file)
      
      // remove subdirectories from watch list so that we don't get duplicate file watchers running
      let dirsToWatch = 
          dirsToWatch |> Seq.filter (fun d -> 
                             dirsToWatch
  