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;

               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;
                           }
                       }

                       // 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 (IOException e) {
                       if (debug) {
                           Bukkit.getLogger().log(Level.INFO, "[Metrics] " + e.getMessage());
                       }
                   }
               }
           }, 0, PING_INTERVAL * 1200);

           return true;
       }
   }