code: @Override
      public JsonSerializer<?> createContextual(SerializerProvider provider, BeanProperty property)
              throws JsonMappingException {
          Sensitive sensitive = null;
          if (property != null) {
              logger.debug("Checking property for @Sensitive annotation.");
              sensitive = property.getAnnotation(Sensitive.class);
              if (sensitive == null) {
                  logger.debug("Checking property for @Sensitive context annotation.");
                  sensitive = property.getContextAnnotation(Sensitive.class);
              }
          }
          if (sensitive != null) {
              String sensitiveMask = sensitive.mask();
              char sensitiveCharacter = sensitive.character();
              logger.debug("Found an annotation with mask {} and masking character {}.",
                      sensitiveMask, sensitiveCharacter);
              return new CensorshipSerializer(sensitiveMask, sensitiveCharacter);
          }
          // the default serializer has no mask so use it
          return this;
      }
docs: /*
  This is a strange instance method that really probably should be a static method but isn't
  due to the ContextualSerializer framework structure.  The important thing to realize is that
  a default CensorshipSerializer will be created by the framework with the default constructor
  and then that instance will be used to create the *real* one with this method below.