class OnJoinVerifier implements Reloadable {

    public boolean refusePlayerForFullServer(PlayerLoginEvent event) {
        final Player player = event.getPlayer();
        if (event.getResult() != PlayerLoginEvent.Result.KICK_FULL) {
            // Server is not full, no need to do anything
            return false;
        } else if (!permissionsManager.hasPermission(player, PlayerStatePermission.IS_VIP)) {
            // Server is full and player is NOT VIP; set kick message and proceed with kick
            event.setKickMessage(messages.retrieveSingle(player, MessageKey.KICK_FULL_SERVER));
            return true;
        }

        // Server is full and player is VIP; attempt to kick a non-VIP player to make room
        Collection<? extends Player> onlinePlayers = bukkitService.getOnlinePlayers();
        if (onlinePlayers.size() < server.getMaxPlayers()) {
            event.allow();
            return false;
        }
        Player nonVipPlayer = generateKickPlayer(onlinePlayers);
        if (nonVipPlayer != null) {
            nonVipPlayer.kickPlayer(messages.retrieveSingle(player, MessageKey.KICK_FOR_VIP));
            event.allow();
            return false;
        } else {
            ConsoleLogger.info("VIP player " + player.getName() + " tried to join, but the server was full");
            event.setKickMessage(messages.retrieveSingle(player, MessageKey.KICK_FULL_SERVER));
            return true;
        }
    }

      OnJoinVerifier();

}