/**
   * Start watching at a given polling rate
   *
   * @param pollFrequency The poll rate
   */
  public void start(final Duration pollFrequency) {
    // Construct task with the given polling frequency
    task = new Task("ModificationWatcher");

    task.run(
        pollFrequency,
        new ICode() {
          public void run(final Log log) {
            // Iterate over a copy of the list of entries to avoid
            // concurrent
            // modification problems without the associated liveness issues
            // of holding a lock while potentially polling file times!
            for (final Iterator<Entry> iterator =
                    new ArrayList<Entry>(modifiableToEntry.values()).iterator();
                iterator.hasNext(); ) {
              // Get next entry
              final Entry entry = iterator.next();

              // If the modifiable has been modified after the last known
              // modification time
              final Time modifiableLastModified = entry.modifiable.lastModifiedTime();

              if (modifiableLastModified.after(entry.lastModifiedTime)) {
                // Notify all listeners that the modifiable was modified
                entry.listeners.notifyListeners();

                // Update timestamp
                entry.lastModifiedTime = modifiableLastModified;
              }
            }
          }
        });
  }
 /** stops the modification watcher from watching. */
 public void destroy() {
   if (task != null) {
     task.stop();
   }
 }