@Override
	public void enable(boolean force) throws IllegalStateException
	{
		// Make sure MobManager is enabled
		if (P.p() == null || !P.p().isEnabled())
		{
			throw new IllegalStateException("MobManager must be enabled to enable the Limiter");
		}
		
		// Check if the Spawner is already enabled
		if (this.isEnabled())
		{
			throw new IllegalStateException("MobManager-Limiter was already enabled");
		}
		
		// Check if we should enable this component
		if (!force && !P.p().getConfig().getBoolean("EnableLimiter", true))
		{
			return;
		}
		
		info("Enabling");
		enabled = true;

		// Load Config
		LimiterConfig config = new LimiterConfig();

		// Setup worlds
		worlds = new ConcurrentHashMap<String, MMWorld>(2, 0.75F, 2);
		if (config.setupWorlds() == 0)
		{
			warning("No valid worlds found");
			return;
		}

		// Register Mob event listeners
		Bukkit.getPluginManager().registerEvents(new MobListener(), P.p());
		// Register Chunk event listener
		Bukkit.getPluginManager().registerEvents(new ChunkListener(), P.p());

		// Start the despawner task
		despawner = new MobDespawnTask();
		despawner.runTaskTimer(P.p(), 1L, LimiterConfig.ticksPerDespawnScan);

		// Setup animal protection
		if (LimiterConfig.enableAnimalDespawning || LimiterConfig.enableAnimalTracking)
		{
			animalProtection = new AnimalProtection();

			Bukkit.getPluginManager().registerEvents(animalProtection, P.p());
			animalProtection.runTaskTimerAsynchronously(P.p(), LimiterConfig.protectedFarmAnimalSaveInterval, LimiterConfig.protectedFarmAnimalSaveInterval);
		}

		info(String.format("Enabled with %d worlds", worlds.size()));
	}