@Override
    public void visitDocument(String key, Object value) {
        paths = DocUtils.split(key, '/');
        infoList = new ArrayList<GetVisitor.VisitorInfo>();

        //String[] decrPaths = new String[paths.length];
        String decrPath = "";
        for (int i = 0; i < paths.length; i++) {
            decrPath += "/" + paths[i];
        }

        // Me must keep in mind that a field may be in 'tail'
        Field f = rootDoc.getSchema().getField(paths[0]);

        if (paths.length > 1) {
            decrPath = "";
            for (int i = 0; i < paths.length - 1; i++) {
                decrPath += "/" + paths[i];
            }
        } else {
            if ( f.isReadOnly() ) {
               
            }
        }

        GetVisitor visitor = new GetVisitor(rootDoc);
        if (paths.length > 1) {
            visitor.visitDocument(decrPath);
            Object sourceObject = visitor.getResult();
            if (sourceObject == null) {
                throw new NullPointerException("Null value for key path '" + key + "'");
            }
            if (visitor.getException() != null) {
                throw (RuntimeException) visitor.getException();
            }
            SchemaType st = visitor.getInfo().getResultSchemaType();
            visitPut(st, sourceObject, value);

        } else {
            Object sourceObject = f.isTail() ? ((ObjectDocument) rootDoc).tail : ((ObjectDocument) rootDoc).getDataObject();
            SchemaType st = new EmbeddedType(rootDoc.getSchema());
            visitPut(st, sourceObject, value);
        }

        if (getException() != null) {
            //RuntimeException re = (RuntimeException) visitor.getException();
            RuntimeException re = (RuntimeException) getException();
            throw re;
        }
    }