// Path: src/main/java/com/moozvine/detox/Serializable.java
// public interface Serializable {
// }


import com.moozvine.detox.Serializable;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

  public static boolean isClassOrInterface(final TypeMirror value) {
    return value.getKind().equals(TypeKind.DECLARED);
  }

  static boolean hasValueOfMethod(final TypeMirror value) {
    if (!isClassOrInterface(value)) {
      return false;
    }
    final DeclaredType declared = (DeclaredType) value;
    final TypeElement typeElement = (TypeElement) declared.asElement();
    for (final Element element : typeElement.getEnclosedElements()) {
      if (element.getKind().equals(ElementKind.METHOD)) {
        final ExecutableElement executableElement = (ExecutableElement) element;
        if (executableElement.getSimpleName().toString().equals("valueOf")
            && executableElement.getReturnType().toString().equals(value.toString())
            && executableElement.getParameters().size() == 1
            && executableElement.getParameters().get(0).asType().toString().equals("java.lang.String")) {
          return true;
        }
      }
    }
    return false;
  }

  static boolean isSerializable(final TypeMirror value) {
    if (!value.getKind().equals(TypeKind.DECLARED)) {
      return false;
    }
    for (final DeclaredType anInterface : allInterfacesOf((DeclaredType) value)) {
// Path: src/main/java/com/moozvine/detox/Serializable.java
// public interface Serializable {
// }


// Path: src/main/java/com/moozvine/detox/processor/Util.java
import com.moozvine.detox.Serializable;
import javax.lang.model.element.Element;
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.type.DeclaredType;
import javax.lang.model.type.TypeKind;
import javax.lang.model.type.TypeMirror;
import java.lang.reflect.Method;
import java.util.HashSet;
import java.util.List;
import java.util.Set;


  public static boolean isClassOrInterface(final TypeMirror value) {
    return value.getKind().equals(TypeKind.DECLARED);
  }

  static boolean hasValueOfMethod(final TypeMirror value) {
    if (!isClassOrInterface(value)) {
      return false;
    }
    final DeclaredType declared = (DeclaredType) value;
    final TypeElement typeElement = (TypeElement) declared.asElement();
    for (final Element element : typeElement.getEnclosedElements()) {
      if (element.getKind().equals(ElementKind.METHOD)) {
        final ExecutableElement executableElement = (ExecutableElement) element;
        if (executableElement.getSimpleName().toString().equals("valueOf")
            && executableElement.getReturnType().toString().equals(value.toString())
            && executableElement.getParameters().size() == 1
            && executableElement.getParameters().get(0).asType().toString().equals("java.lang.String")) {
          return true;
        }
      }
    }
    return false;
  }

  static boolean isSerializable(final TypeMirror value) {
    if (!value.getKind().equals(TypeKind.DECLARED)) {
      return false;
    }
    for (final DeclaredType anInterface : allInterfacesOf((DeclaredType) value)) {
      if (String.valueOf(anInterface).equals(Serializable.class.getName())) {