public boolean start() {
    synchronized (optOutLock) {
      // Did we opt out?
      if (isOptOut())
        return false;

      // Is metrics already running?
      if (task != null)
        return true;

      // Begin hitting the server with glorious data
      task = plugin.getServer().getScheduler()
          .runTaskTimerAsynchronously(plugin, new Runnable() {

            private boolean firstPost = true;

            @Override
            public void run() {
              try {
                // This has to be synchronized or it can collide with the disable method.
                synchronized (optOutLock) {
                  // Disable Task, if it is running and the server owner decided to opt-out
                  if (isOptOut() && task != null) {
                    task.cancel();
                    task = null;
                    // Tell all plotters to stop gathering information.
                    for (final Graph graph : graphs)
                      graph.onOptOut();
                  }
                }

                // We use the inverse of firstPost because if it is the first time we are posting,
                // it is not a interval ping, so it evaluates to FALSE
                // Each time thereafter it will evaluate to TRUE, i.e PING!
                postPlugin(!firstPost);

                // After the first post we set firstPost to false
                // Each post thereafter will be a ping
                firstPost = false;
              } catch (final IOException e) {
                if (debug)
                  Bukkit.getLogger().log(Level.INFO,
                      "[Metrics] " + e.getMessage());
              }
            }
          }, 0, PING_INTERVAL * 1200);

      return true;
    }
  }