@Override
    @SuppressWarnings("unchecked")
    public <T> T loadAsset(AssetKey<T> key) {
        if (key == null)
            throw new IllegalArgumentException("key cannot be null");

        for (AssetEventListener listener : eventListeners) {
            listener.assetRequested(key);
        }

        AssetCache cache = handler.getCache(key.getCacheType());
        AssetProcessor proc = handler.getProcessor(key.getProcessorType());

        Object obj = cache != null ? cache.getFromCache(key) : null;
        if (obj == null) {
            // Asset not in cache, load it from file system.
            AssetInfo info = handler.tryLocate(key);
            if (info == null) {
                if (handler.getParentKey() != null) {
                    // Inform event listener that an asset has failed to load.
                    // If the parent AssetLoader chooses not to propagate
                    // the exception, this is the only means of finding
                    // that something went wrong.
                    for (AssetEventListener listener : eventListeners) {
                        listener.assetDependencyNotFound(handler.getParentKey(), key);
                    }
                }
                throw new AssetNotFoundException(key.toString());
            }

            obj = loadLocatedAsset(key, info, proc, cache);
        }

        T clone = (T) obj;

        if (obj instanceof CloneableSmartAsset) {
            clone = registerAndCloneSmartAsset(key, clone, proc, cache);
        }

        return clone;
    }
Clones the asset using the given processor and registers the clone
with the cache.

@param <T> The asset type
@param key The asset key
@param obj The asset to clone / register, must implement
    {@link CloneableSmartAsset}.
@param proc The processor which will generate the clone, cannot be null
@param cache The cache to register the clone with, cannot be null.
@return The cloned asset, cannot be the same as the given asset since
    it is a clone.

@throws IllegalStateException If asset does not implement
{@link CloneableSmartAsset}, if the cache is null, or if the
processor did not clone the asset.
jme3-core/src/main/java/com/jme3/asset/DesktopAssetManager.java