private List<SimpleOneWayPropertyInfo> extractSimpleOneWayPropertyInfoList(
      WrappedTypeElement viewType) {
    ViewBindingAnnotationMirror annotation =
        new ViewBindingAnnotationMirror(typeElement.getAnnotation(ViewBinding.class));
    List<String> simpleOneWayProperties = annotation.getSimpleOneWayProperties();

    SetterElements setters =
        new SetterElements(
            viewType.looseSetters(new SimpleOneWayPropertySetterFilter(simpleOneWayProperties)));

    if (setters.hasAmbiguousSetters()) {
      throw OneWayBindingPropertyGenerationException.setterWithDifferentParameterTypes(
          viewType, setters.getPropertiesWithAmbiguousSetters());
    }

    if (!setters.containsAll(simpleOneWayProperties)) {
      throw OneWayBindingPropertyGenerationException.noSettersFound(
          viewType, setters.findMissingProperties(simpleOneWayProperties));
    }

    List<SimpleOneWayPropertyInfo> result = Lists.newArrayList();
    for (SetterElement setter : setters) {
      result.add(new SimpleOneWayPropertyInfo(setter));
    }

    return result;
  }
  private WrappedTypeElement extractViewType() {
    WrappedTypeElement customViewBinding =
        typeElement.findDirectSuperclassOf(CustomViewBinding.class);
    if (customViewBinding == null) {
      throw new RuntimeException(
          MessageFormat.format(
              "{0} has to be direct SubClass of {1}",
              typeElement.qName(), CustomViewBinding.class.getName()));
    }

    return customViewBinding.firstTypeArgument();
  }
 public ViewBindingInfo build() {
   WrappedTypeElement viewType = extractViewType();
   List<SimpleOneWayPropertyInfo> simpleOneWayPropertyInfoList =
       extractSimpleOneWayPropertyInfoList(viewType);
   return new ViewBindingInfo(
       typeElement.qName(), viewBindingObjectTypeName, viewType, simpleOneWayPropertyInfoList);
 }
 public String viewType() {
   return viewType.qName();
 }