code: @Override
      public void visit(ASTNode[] nodes, SourceUnit sourceUnit) {
          if (!(nodes[0] instanceof AnnotationNode) || !(nodes[1] instanceof AnnotatedNode)) {
              throw new IllegalArgumentException("Internal error: wrong types: "
                  + nodes[0].getClass().getName() + " / " + nodes[1].getClass().getName());
          }
  
          AnnotationNode node = (AnnotationNode) nodes[0];
          AnnotatedNode parent = (AnnotatedNode) nodes[1];
          ClassNode declaringClass = parent.getDeclaringClass();
  
          if (parent instanceof FieldNode) {
              int modifiers = ((FieldNode) parent).getModifiers();
              if ((modifiers & Modifier.FINAL) != 0) {
                  String msg = "@griffon.transform.FXBindable cannot annotate a final property.";
                  generateSyntaxErrorMessage(sourceUnit, node, msg);
              }
              addJavaFXProperty(sourceUnit, node, declaringClass, (FieldNode) parent);
          } else {
              addJavaFXPropertyToClass(sourceUnit, node, (ClassNode) parent);
          }
      }
docs: This ASTTransformation method is called when the compiler encounters our annotation.
  
  @param nodes      An array of nodes.  Index 0 is the annotation that triggered the call, index 1
  is the annotated node.
  @param sourceUnit The SourceUnit describing the source code in which the annotation was placed.