// Path: Core/src/main/java/me/rbrickis/mojo/Arguments.java
// public class Arguments {
// 
//     private List<String> arguments;
// 
//     public Arguments() {
//         this.arguments = new ArrayList<>();
//     }
// 
//     public Arguments(String... arguments) {
//         this.arguments = Arrays.asList(arguments);
//     }
// 
//     public Arguments(List<String> arguments) {
//         this.arguments = arguments;
//     }
// 
// 
//     /**
//      *  @see Arguments#size()
//      */
//     public int length() {
//         return size();
//     }
// 
//     /**
//      * @return The size of the arguments provide
//      */
//     public int size() {
//         return arguments.size();
//     }
// 
//     /**
//      * @param index the index to pull from
//      * @return 'null' if the index is out of bounds, or the String at the index.
//      */
//     public String get(int index) {
//         try {
//             return arguments.get(index);
//         } catch (IndexOutOfBoundsException ex) {
//             return null;
//         }
//     }
// 
//     public String join(int at, char delimiter) {
//         StringBuilder builder = new StringBuilder();
//         for (int x = at; x < arguments.size(); x++) {
//             builder.append(get(x)).append(delimiter);
//         }
//         return builder.toString();
//     }
// 
//     public String join(int at) {
//         return join(at, ' ');
//     }
// 
// 
//     public List<String> getArguments() {
//         return arguments;
//     }
// }
// 
// Path: Core/src/main/java/me/rbrickis/mojo/command/CommandHolder.java
// public class CommandHolder {
// 
//     private String name;
//     private String[] aliases;
//     private String permission = "";
//     private String permissionMessage = "";
//     private ParametricRegistry registry;
//     private Method method;
//     private Class<?> senderType;
//     private List<Parameter> parameters;
//     private String usage;
//     private String description;
// 
//     public CommandHolder(Method method, ParametricRegistry registry, Class<?> senderType) {
// 
//         Command command = method.getDeclaredAnnotation(Command.class);
//         if (command.aliases().length == 0) {
//             throw new IllegalArgumentException("Must have at least one alias!");
//         } else {
//             name = command.aliases()[0];
//             List<String> laliases = new ArrayList<>();
//             for (int i = 1; i < command.aliases().length; i++) {
//                 laliases.add(command.aliases()[i]);
//             }
//             this.aliases = laliases.toArray(new String[] {});
//         }
//         if (method.isAnnotationPresent(Require.class)) {
//             this.permission = method.getAnnotation(Require.class).value();
//             this.permissionMessage = method.getAnnotation(Require.class).message();
//         }
// 
//         this.registry = registry;
//         this.method = method;
//         this.senderType = senderType;
//         this.method.setAccessible(true);
//         MethodParser parser = new MethodParser(method, registry);
//         this.parameters = parser.parse();
//         this.description = command.desc();
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String[] getAliases() {
//         return aliases;
//     }
// 
//     public String getPermission() {
//         return permission;
//     }
// 
//     public String getPermissionMessage() {
//         return permissionMessage;
//     }
// 
//     public boolean isAnnotationPresent(Class<? extends Annotation> annotation) {
//         boolean found = false;
//         for (Annotation anno : method.getAnnotations()) {
//             if (anno.annotationType() == annotation) {
//                 found = true;
//             }
//         }
//         return found;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public String getUsage() {
//         if (usage == null)
//             usage = getName() + " " + new UsageBuilder(parameters).build();
//         return usage;
//     }
// 
//     public boolean call(Object sender, Arguments arguments) throws CommandInvocationException {
//         if (senderType == null) {
//             throw new IllegalArgumentException("Sender type is null!");
//         }
//         if (!senderType.isAssignableFrom(sender.getClass())) {
//             throw new IllegalArgumentException(
//                 "Object provided is not assignable from the sender provided");
//         }
// 
//         ParametricParser pParser = new ParametricParser(parameters);
//         ParametricParser.ParsedResult parsedObj = pParser.parse(senderType.cast(sender), arguments);
//         boolean isStatic = Modifier.isStatic(method.getModifiers());
// 
//         if (!parsedObj.isSuccessful()) {
//             return false;
//         }
// 
//         if (isStatic) {
//             try {
//                 method.invoke(null, parsedObj.getObjects());
//                 return true;
//             } catch (IllegalAccessException | InvocationTargetException e) {
//                 e.printStackTrace();
//                 throw new CommandInvocationException(e.getMessage());
//             }
//         } else {
//             try {
//                 Object instance = method.getDeclaringClass().newInstance();
//                 method.invoke(instance, parsedObj.getObjects());
//                 return true;
//             } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
//                 throw new CommandInvocationException(e.getMessage());
//             }
//         }
//     }
// 
// }
// 
// Path: Core/src/main/java/me/rbrickis/mojo/command/CommandInvocationException.java
// public class CommandInvocationException extends Exception {
// 
//     public CommandInvocationException(String s) {
//         super(s);
//     }
// 
// }


import me.rbrickis.mojo.Arguments;
import me.rbrickis.mojo.command.CommandHolder;
import me.rbrickis.mojo.command.CommandInvocationException;
package me.rbrickis.test;


public class WrappedCommand extends TestCommand {

    private CommandHolder holder;

    public WrappedCommand(CommandHolder holder) {
        super(holder.getName(), holder.getAliases(), holder.getDescription());
        this.holder = holder;
    }

    @Override
// Path: Core/src/main/java/me/rbrickis/mojo/Arguments.java
// public class Arguments {
// 
//     private List<String> arguments;
// 
//     public Arguments() {
//         this.arguments = new ArrayList<>();
//     }
// 
//     public Arguments(String... arguments) {
//         this.arguments = Arrays.asList(arguments);
//     }
// 
//     public Arguments(List<String> arguments) {
//         this.arguments = arguments;
//     }
// 
// 
//     /**
//      *  @see Arguments#size()
//      */
//     public int length() {
//         return size();
//     }
// 
//     /**
//      * @return The size of the arguments provide
//      */
//     public int size() {
//         return arguments.size();
//     }
// 
//     /**
//      * @param index the index to pull from
//      * @return 'null' if the index is out of bounds, or the String at the index.
//      */
//     public String get(int index) {
//         try {
//             return arguments.get(index);
//         } catch (IndexOutOfBoundsException ex) {
//             return null;
//         }
//     }
// 
//     public String join(int at, char delimiter) {
//         StringBuilder builder = new StringBuilder();
//         for (int x = at; x < arguments.size(); x++) {
//             builder.append(get(x)).append(delimiter);
//         }
//         return builder.toString();
//     }
// 
//     public String join(int at) {
//         return join(at, ' ');
//     }
// 
// 
//     public List<String> getArguments() {
//         return arguments;
//     }
// }
// 
// Path: Core/src/main/java/me/rbrickis/mojo/command/CommandHolder.java
// public class CommandHolder {
// 
//     private String name;
//     private String[] aliases;
//     private String permission = "";
//     private String permissionMessage = "";
//     private ParametricRegistry registry;
//     private Method method;
//     private Class<?> senderType;
//     private List<Parameter> parameters;
//     private String usage;
//     private String description;
// 
//     public CommandHolder(Method method, ParametricRegistry registry, Class<?> senderType) {
// 
//         Command command = method.getDeclaredAnnotation(Command.class);
//         if (command.aliases().length == 0) {
//             throw new IllegalArgumentException("Must have at least one alias!");
//         } else {
//             name = command.aliases()[0];
//             List<String> laliases = new ArrayList<>();
//             for (int i = 1; i < command.aliases().length; i++) {
//                 laliases.add(command.aliases()[i]);
//             }
//             this.aliases = laliases.toArray(new String[] {});
//         }
//         if (method.isAnnotationPresent(Require.class)) {
//             this.permission = method.getAnnotation(Require.class).value();
//             this.permissionMessage = method.getAnnotation(Require.class).message();
//         }
// 
//         this.registry = registry;
//         this.method = method;
//         this.senderType = senderType;
//         this.method.setAccessible(true);
//         MethodParser parser = new MethodParser(method, registry);
//         this.parameters = parser.parse();
//         this.description = command.desc();
//     }
// 
//     public String getName() {
//         return name;
//     }
// 
//     public String[] getAliases() {
//         return aliases;
//     }
// 
//     public String getPermission() {
//         return permission;
//     }
// 
//     public String getPermissionMessage() {
//         return permissionMessage;
//     }
// 
//     public boolean isAnnotationPresent(Class<? extends Annotation> annotation) {
//         boolean found = false;
//         for (Annotation anno : method.getAnnotations()) {
//             if (anno.annotationType() == annotation) {
//                 found = true;
//             }
//         }
//         return found;
//     }
// 
//     public String getDescription() {
//         return description;
//     }
// 
//     public String getUsage() {
//         if (usage == null)
//             usage = getName() + " " + new UsageBuilder(parameters).build();
//         return usage;
//     }
// 
//     public boolean call(Object sender, Arguments arguments) throws CommandInvocationException {
//         if (senderType == null) {
//             throw new IllegalArgumentException("Sender type is null!");
//         }
//         if (!senderType.isAssignableFrom(sender.getClass())) {
//             throw new IllegalArgumentException(
//                 "Object provided is not assignable from the sender provided");
//         }
// 
//         ParametricParser pParser = new ParametricParser(parameters);
//         ParametricParser.ParsedResult parsedObj = pParser.parse(senderType.cast(sender), arguments);
//         boolean isStatic = Modifier.isStatic(method.getModifiers());
// 
//         if (!parsedObj.isSuccessful()) {
//             return false;
//         }
// 
//         if (isStatic) {
//             try {
//                 method.invoke(null, parsedObj.getObjects());
//                 return true;
//             } catch (IllegalAccessException | InvocationTargetException e) {
//                 e.printStackTrace();
//                 throw new CommandInvocationException(e.getMessage());
//             }
//         } else {
//             try {
//                 Object instance = method.getDeclaringClass().newInstance();
//                 method.invoke(instance, parsedObj.getObjects());
//                 return true;
//             } catch (InstantiationException | IllegalAccessException | InvocationTargetException e) {
//                 throw new CommandInvocationException(e.getMessage());
//             }
//         }
//     }
// 
// }
// 
// Path: Core/src/main/java/me/rbrickis/mojo/command/CommandInvocationException.java
// public class CommandInvocationException extends Exception {
// 
//     public CommandInvocationException(String s) {
//         super(s);
//     }
// 
// }


// Path: Core/src/test/java/me/rbrickis/test/WrappedCommand.java
import me.rbrickis.mojo.Arguments;
import me.rbrickis.mojo.command.CommandHolder;
import me.rbrickis.mojo.command.CommandInvocationException;

package me.rbrickis.test;


public class WrappedCommand extends TestCommand {

    private CommandHolder holder;

    public WrappedCommand(CommandHolder holder) {
        super(holder.getName(), holder.getAliases(), holder.getDescription());
        this.holder = holder;
    }

    @Override
    public void execute(Actor sender, Arguments arguments) {