@SuppressWarnings({ "unchecked" })
    @Override
    public <T> void publish(Class<? extends InformationItem<T>> channel, T item,
                            PublishOption... options) {
        if (channel == null || item == null) return;

        // Get our options
        final OptionUtils<PublishOption> ou = new OptionUtils<PublishOption>(options);
        final boolean silentPublish = ou.contains(OptionSilentPublish.class);

        final KeyEntry keyEntry = getKeyEntry(channel);

        // Now process entry
        try {
            keyEntry.entryLock.lock();
            keyEntry.lastItem = item;

            // Check if we should publish silently.
            if (!silentPublish) {
                for (InformationListener<?> listener : keyEntry.allListeners) {
                    try {
                        ((InformationListener<T>) listener).update(item);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
        } finally {
            keyEntry.entryLock.unlock();
        }
    }