class FilesystemTracker implements IFilesystemTracker {

    @Override
    public void start(final IPath directory)
            throws FilesystemTrackerStartupException, InvalidArgumentException {
        if (started) {
            throw new FilesystemTrackerStartupException("Filesystem tracker is already started.");
        }

        if (!Files.isDirectory(fileSystem.getPath(directory.getPath()))) {
            throw new InvalidArgumentException("Given file is not a directory.");
        }

        knownFiles.clear();

        try {
            Runnable listeningTask = taskFactory.createRunnable(directory, new FileCreationHandler());
            watchThread = new Thread(listeningTask);

            watchThread.setDaemon(true);
            watchThread.start();

            started = true;
        } catch (IOException e) {
            throw new FilesystemTrackerStartupException("Could not start filesystem tracker.", e);
        }
    }

    public  FilesystemTracker(final IPathFilter filter, final ListeningTaskFactory taskFactory);
      FilesystemTracker(final IPathFilter filter, final ListeningTaskFactory taskFactory, final FileSystem fileSystem);

}