public boolean isExcluded(final Node node) {
   if (excludedProperties.contains(node.getPropertyPath())) {
     return true;
   }
   if (containsAny(node.getCategories(), excludedCategories)) {
     return true;
   }
   return false;
 }
 public boolean isIntrospectible(final Node node) {
   if (isEqualsOnly(node)) {
     return false;
   } else if (node.isAdded()) {
     return returnChildrenOfAddedNodes;
   } else if (node.isRemoved()) {
     return returnChildrenOfRemovedNodes;
   }
   return true;
 }
 public boolean isIncluded(final Node node) {
   if (node.isRootNode()) {
     return true;
   }
   if (includedCategories.isEmpty() && includedProperties.isEmpty()) {
     return true;
   } else if (containsAny(node.getCategories(), includedCategories)) {
     return true;
   } else if (includedProperties.contains(node.getPropertyPath())) {
     return true;
   }
   return false;
 }
 public boolean isReturnable(final Node node) {
   if (node.isIgnored()) {
     return returnIgnoredNodes;
   } else if (node.isCircular()) {
     return returnCircularNodes;
   } else if (node.isUntouched()) {
     if (node.hasChanges()) {
       return true;
     } else if (node.hasChildren()) {
       return true;
     }
     return returnUnchangedNodes;
   }
   return true;
 }
 public boolean isEqualsOnly(final Node node) {
   final Class<?> propertyType = node.getType();
   if (propertyType != null) {
     if (propertyType.getAnnotation(ObjectDiffEqualsOnlyType.class) != null) {
       return true;
     }
     if (equalsOnlyTypes.contains(propertyType)) {
       return true;
     }
     if (Classes.isSimpleType(propertyType)) {
       return true;
     }
   }
   if (node.isEqualsOnly()) {
     return true;
   }
   if (equalsOnlyProperties.contains(node.getPropertyPath())) {
     return true;
   }
   return false;
 }
 public boolean isIgnored(final Node node) {
   return node.isIgnored() || !isIncluded(node) || isExcluded(node);
 }