abstract class AbstractJavaExecutableAdapter extends JavaElementAdapter
    implements AbstractJavaExecutable {

  private static final long serialVersionUID = -5004287664697277125L;

  private final ExecutableElement executable;

  private final JavaBody body = New.body();

  public AbstractJavaExecutableAdapter(
      ExecutableElement executable, Elements elementUtils, Types typeUtils) {
    super(executable, elementUtils, typeUtils);
    this.executable = executable;
  }

  public PowerList<JavaTypeParameter> getTypeParameters() {
    return getElementsAdapters(executable.getTypeParameters(), JavaTypeParameter.class);
  }

  public JavaType getReturnType() {
    return getTypeAdapter(executable.getReturnType());
  }

  public PowerList<JavaParameter> getParameters() {
    return getElementsAdapters(executable.getParameters(), JavaParameter.class);
  }

  public Boolean isVarArgs() {
    return executable.isVarArgs();
  }

  public PowerList<JavaType> getThrownTypes() {
    PowerList<JavaType> adapters = Power.list();

    for (TypeMirror typeMirror : executable.getThrownTypes()) {
      adapters.add(getTypeAdapter(typeMirror));
    }

    return adapters;
  }

  @Override
  public JavaBody getBody() {
    return this.body;
  }

  @Override
  protected Class<? extends AbstractJavaExecutable> getAdaptedInterface() {
    return AbstractJavaExecutable.class;
  }

  @Override
  public AbstractJavaStructure getParent() {
    return super.retrieveParent();
  }

  @Override
  public AbstractJavaExecutable copy() {
    throw calculatedMethodException();
  }
}