CustomItem.java

package it.fulminazzo.yagl.item;

import it.fulminazzo.yagl.item.field.ItemFlag;
import it.fulminazzo.yagl.wrapper.Enchantment;
import it.fulminazzo.yagl.wrapper.PotionEffect;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Collection;

/**
 * Represents a special {@link Item} that supports customization capabilities.
 *
 * @param <I> the type of this custom item
 */
@SuppressWarnings("unchecked")
public abstract class CustomItem<I extends CustomItem<I>> extends ItemImpl {

    /**
     * Instantiates a new Custom item.
     */
    public CustomItem() {
        super();
    }

    /**
     * Instantiates a new Custom item.
     *
     * @param material the material
     */
    public CustomItem(final String material) {
        super(material);
    }

    /**
     * Instantiates a new Custom item.
     *
     * @param material the material
     * @param amount   the amount
     */
    public CustomItem(final @Nullable String material, final int amount) {
        super(material, amount);
    }

    @Override
    public @NotNull I setMaterial(@NotNull String material) {
        return (I) super.setMaterial(material);
    }

    @Override
    public @NotNull I setAmount(int amount) {
        return (I) super.setAmount(amount);
    }

    @Override
    public @NotNull I setDurability(int durability) {
        return (I) super.setDurability(durability);
    }

    @Override
    public @NotNull I setDisplayName(@NotNull String displayName) {
        return (I) super.setDisplayName(displayName);
    }

    @Override
    public @NotNull I setUnbreakable(boolean unbreakable) {
        return (I) super.setUnbreakable(unbreakable);
    }

    @Override
    public @NotNull I setCustomModelData(int customModelData) {
        return (I) super.setCustomModelData(customModelData);
    }

    @Override
    public @NotNull I addLore(String @NotNull ... lore) {
        return (I) super.addLore(lore);
    }

    @Override
    public @NotNull I addLore(@NotNull Collection<String> lore) {
        return (I) super.addLore(lore);
    }

    @Override
    public @NotNull I removeLore(String @NotNull ... lore) {
        return (I) super.removeLore(lore);
    }

    @Override
    public @NotNull I removeLore(@NotNull Collection<String> lore) {
        return (I) super.removeLore(lore);
    }

    @Override
    public @NotNull I setLore(String @NotNull ... lore) {
        return (I) super.setLore(lore);
    }

    @Override
    public @NotNull I setLore(@NotNull Collection<String> lore) {
        return (I) super.setLore(lore);
    }

    @Override
    public @NotNull I addEnchantment(@NotNull String enchantment, int level) {
        return (I) super.addEnchantment(enchantment, level);
    }

    @Override
    public @NotNull I addEnchantments(String @NotNull ... enchantments) {
        return (I) super.addEnchantments(enchantments);
    }

    @Override
    public @NotNull I addEnchantments(Enchantment @NotNull ... enchantments) {
        return (I) super.addEnchantments(enchantments);
    }

    @Override
    public @NotNull I addEnchantments(@NotNull Collection<Enchantment> enchantments) {
        return (I) super.addEnchantments(enchantments);
    }

    @Override
    public @NotNull I removeEnchantment(@NotNull String enchantment, int level) {
        return (I) super.removeEnchantment(enchantment, level);
    }

    @Override
    public @NotNull I removeEnchantments(String @NotNull ... enchantments) {
        return (I) super.removeEnchantments(enchantments);
    }

    @Override
    public @NotNull I removeEnchantments(Enchantment @NotNull ... enchantments) {
        return (I) super.removeEnchantments(enchantments);
    }

    @Override
    public @NotNull I removeEnchantments(@NotNull Collection<Enchantment> enchantments) {
        return (I) super.removeEnchantments(enchantments);
    }

    @Override
    public @NotNull I addItemFlags(ItemFlag @NotNull ... itemFlags) {
        return (I) super.addItemFlags(itemFlags);
    }

    @Override
    public @NotNull I addItemFlags(@NotNull Collection<ItemFlag> itemFlags) {
        return (I) super.addItemFlags(itemFlags);
    }

    @Override
    public @NotNull I removeItemFlags(ItemFlag @NotNull ... itemFlags) {
        return (I) super.removeItemFlags(itemFlags);
    }

    @Override
    public @NotNull I removeItemFlags(@NotNull Collection<ItemFlag> itemFlags) {
        return (I) super.removeItemFlags(itemFlags);
    }

    @Override
    public @NotNull I addPotionEffects(PotionEffect @NotNull ... potionEffects) {
        return (I) super.addPotionEffects(potionEffects);
    }

    @Override
    public @NotNull I addPotionEffects(@NotNull Collection<PotionEffect> potionEffects) {
        return (I) super.addPotionEffects(potionEffects);
    }

    @Override
    public @NotNull I removePotionEffects(PotionEffect @NotNull ... potionEffects) {
        return (I) super.removePotionEffects(potionEffects);
    }

    @Override
    public @NotNull I removePotionEffects(@NotNull Collection<PotionEffect> potionEffects) {
        return (I) super.removePotionEffects(potionEffects);
    }

    @Override
    public @NotNull I setPotionEffects(PotionEffect @NotNull ... potionEffects) {
        return (I) super.setPotionEffects(potionEffects);
    }

    @Override
    public @NotNull I setPotionEffects(@NotNull Collection<PotionEffect> potionEffects) {
        return (I) super.setPotionEffects(potionEffects);
    }

    @Override
    public @NotNull I copy() {
        return (I) super.copy();
    }

}