// Create tags
Tag<String> playerNameTag = Tag.String("custom_player_name");
Tag<Integer> levelTag = Tag.Integer("player_level");
Tag<Double> balanceTag = Tag.Double("player_balance");
Tag<Boolean> isVipTag = Tag.Boolean("is_vip");

// Set tags on player
Player player = // ... get player
if (player instanceof TagWritable writable) {
    writable.setTag(playerNameTag, "CustomName");
    writable.setTag(levelTag, 50);
    writable.setTag(balanceTag, 1000.0);
    writable.setTag(isVipTag, true);
}

// Read tags from player
if (player instanceof TagReadable readable) {
    String name = readable.getTag(playerNameTag);
    Integer level = readable.getTag(levelTag);
    Double balance = readable.getTag(balanceTag);
    Boolean isVip = readable.getTag(isVipTag);
    
    System.out.println("Player: " + name + ", Level: " + level + ", Balance: " + balance);
}

// Check if tag exists
if (player instanceof TagReadable readable) {
    if (readable.hasTag(levelTag)) {
        System.out.println("Player has level tag");
    }
}

// Remove tag
if (player instanceof TagWritable writable) {
    writable.removeTag(levelTag);
}

// Using with custom entity class
public class CustomEntity extends EntityLiving {
    private static final Tag<Integer> CUSTOM_DATA_TAG = Tag.Integer("custom_data");
    
    public void setCustomData(int value) {
        setTag(CUSTOM_DATA_TAG, value);
    }
    
    public int getCustomData() {
        return getTag(CUSTOM_DATA_TAG);
    }
}