protected boolean isVisible(JsonAutoDetect.Visibility visibility, DecoratedElement element) {
    if (visibility != null) {
      switch (visibility) {
        case ANY:
          return true;
        case NONE:
          return false;
        case NON_PRIVATE:
          return !element.getModifiers().contains(Modifier.PRIVATE);
        case PROTECTED_AND_PUBLIC:
          return element.getModifiers().contains(Modifier.PROTECTED)
              || element.getModifiers().contains(Modifier.PUBLIC);
      }
    }

    return element.getModifiers().contains(Modifier.PUBLIC);
  }
  /**
   * Whether to accept the given member declaration as an accessor.
   *
   * @param element The declaration to filter.
   * @return Whether to accept the given member declaration as an accessor.
   */
  public boolean accept(DecoratedElement<?> element) {
    if (element.getAnnotation(JsonIgnore.class) != null) {
      return false;
    }

    if (element.getAnnotation(JsonProperty.class) != null) {
      // if there's an explicit json property annotation, we'll include it.
      return true;
    }

    if (this.honorJaxb) {
      if (element.getAnnotation(XmlTransient.class) != null) {
        return false;
      }

      for (String annotationName : element.getAnnotations().keySet()) {
        if (annotationName.startsWith("javax.xml.bind.annotation")) {
          // if the property has an explicit annotation, we'll include it.
          return true;
        }
      }
    }

    String name = element.getSimpleName().toString();
    if ("".equals(name)) {
      return false;
    }

    if (this.propertiesToIgnore.contains(name)) {
      return false;
    }

    if (element instanceof PropertyElement) {
      PropertyElement property = ((PropertyElement) element);

      DecoratedExecutableElement getter = property.getGetter();
      if (getter == null) {
        // needs a getter.
        return false;
      }

      if (!isVisible(findGetterVisibility(getter), getter)) {
        return false;
      }

      DecoratedExecutableElement setter = property.getSetter();
      if (setter != null && !isVisible(findSetterVisibility(), setter)) {
        return false;
      }

      return true;
    } else if (element instanceof DecoratedVariableElement) {

      if (!isVisible(findFieldVisibility(), element)) {
        return false;
      }

      if (element.isStatic() || element.isTransient()) {
        return false;
      }

      return true;
    }

    return false;
  }