@Override
    public void execute(LuckPermsPlugin plugin, Sender sender, T holder, ArgumentList args, String label) {
        if (args.isEmpty()) {
            sendUsageDetailed(sender, label);
            return;
        }

        GenericChildCommand sub = this.children.stream()
                .filter(s -> s.getName().equalsIgnoreCase(args.get(0)))
                .findFirst()
                .orElse(null);

        if (sub == null) {
            Message.COMMAND_NOT_RECOGNISED.send(sender);
            return;
        }

        if (!sub.isAuthorized(sender, this.type)) {
            Message.COMMAND_NO_PERMISSION.send(sender);
            return;
        }

        if (sub.getArgumentCheck().test(args.size() - 1)) {
            sub.sendDetailedUsage(sender);
            return;
        }

        try {
            sub.execute(plugin, sender, holder, args.subList(1, args.size()), label, this.type == HolderType.USER ? sub.getUserPermission() : sub.getGroupPermission());
        } catch (CommandException e) {
            e.handle(sender, sub);
        }
    }
A shared main command. Shared meaning it can apply to both users and groups.
This extends sub command as they're actually sub commands of the main user/group commands.
@param <T>
common/src/main/java/me/lucko/luckperms/common/command/abstraction/GenericParentCommand.java