@SuppressWarnings("unchecked")
  public Map<Object, Object> _deserializeUsingCreator(JsonParser jp, DeserializationContext ctxt)
      throws IOException, JsonProcessingException {
    final Creator.PropertyBased creator = _propertyBasedCreator;
    PropertyValueBuffer buffer = creator.startBuilding(jp, ctxt);

    JsonToken t = jp.getCurrentToken();
    if (t == JsonToken.START_OBJECT) {
      t = jp.nextToken();
    }
    final JsonDeserializer<Object> valueDes = _valueDeserializer;
    final TypeDeserializer typeDeser = _valueTypeDeserializer;
    for (; t == JsonToken.FIELD_NAME; t = jp.nextToken()) {
      String propName = jp.getCurrentName();
      t = jp.nextToken(); // to get to value
      if (_ignorableProperties != null && _ignorableProperties.contains(propName)) {
        jp.skipChildren(); // and skip it (in case of array/object)
        continue;
      }
      // creator property?
      SettableBeanProperty prop = creator.findCreatorProperty(propName);
      if (prop != null) {
        // Last property to set?
        Object value = prop.deserialize(jp, ctxt);
        if (buffer.assignParameter(prop.getCreatorIndex(), value)) {
          jp.nextToken();
          Map<Object, Object> result = (Map<Object, Object>) creator.build(buffer);
          _readAndBind(jp, ctxt, result);
          return result;
        }
        continue;
      }
      // other property? needs buffering
      String fieldName = jp.getCurrentName();
      Object key =
          (_keyDeserializer == null) ? fieldName : _keyDeserializer.deserializeKey(fieldName, ctxt);
      Object value;
      if (t == JsonToken.VALUE_NULL) {
        value = null;
      } else if (typeDeser == null) {
        value = valueDes.deserialize(jp, ctxt);
      } else {
        value = valueDes.deserializeWithType(jp, ctxt, typeDeser);
      }
      buffer.bufferMapProperty(key, value);
    }
    // end of JSON object?
    // if so, can just construct and leave...
    return (Map<Object, Object>) creator.build(buffer);
  }
 /**
  * Method called to finalize setup of this deserializer, after deserializer itself has been
  * registered. This is needed to handle recursive and transitive dependencies.
  */
 public void resolve(DeserializationConfig config, DeserializerProvider provider)
     throws JsonMappingException {
   // just need to worry about property-based one
   if (_propertyBasedCreator != null) {
     // Need to / should not create separate
     HashMap<JavaType, JsonDeserializer<Object>> seen =
         new HashMap<JavaType, JsonDeserializer<Object>>();
     for (SettableBeanProperty prop : _propertyBasedCreator.properties()) {
       prop.setValueDeserializer(
           findDeserializer(config, provider, prop.getType(), prop.getPropertyName(), seen));
     }
   }
 }