package com.redhat.ceylon.common.tool; import java.lang.reflect.Method; import java.util.Collection; import java.util.List; public class AnnotatedToolModel<T extends Tool> extends ToolModel<T> { private Class<T> toolClass; private boolean loaded; public AnnotatedToolModel(String name) { super(name); } public Class<T> getToolClass() { return toolClass; } public void setToolClass(Class<T> toolClass) { this.toolClass = toolClass; } private void setup() { if (!loaded) { loaded = true; getToolLoader().setupModel(this); } } @Override public Collection<OptionModel<?>> getOptions() { setup(); return super.getOptions(); } @Override public OptionModel<?> getOption(String longName) { setup(); return super.getOption(longName); } @Override public OptionModel<?> getOptionByShort(char shortName) { setup(); return super.getOptionByShort(shortName); } @Override public List<ArgumentModel<?>> getArguments() { setup(); return super.getArguments(); } @Override public SubtoolModel<?> getSubtoolModel() { setup(); return super.getSubtoolModel(); } @Override public List<ArgumentModel<?>> getArgumentsAndSubtool() { setup(); return super.getArgumentsAndSubtool(); } @Override public Method getRest() { setup(); return super.getRest(); } public boolean isHidden() { return toolClass != null && toolClass.getAnnotation(Hidden.class) != null; } @Override public boolean isPorcelain() { return super.isPorcelain() && !isHidden(); } @Override public boolean isPlumbing() { return super.isPlumbing() && (toolClass == null || isHidden()); } }