private Accessor compileAccessor() {
    assert debug("<<INITIATE COMPILE>>");

    Object curr = ctx;

    try {
      if (!MVEL.COMPILER_OPT_ALLOW_OVERRIDE_ALL_PROPHANDLING) {
        while (cursor < end) {
          switch (nextSubToken()) {
            case BEAN:
              curr = getBeanProperty(curr, capture());
              break;
            case METH:
              curr = getMethod(curr, capture());
              break;
            case COL:
              curr = getCollectionProperty(curr, capture());
              break;
            case WITH:
              curr = getWithProperty(curr);
              break;
          }

          // check to see if a null safety is enabled on this property.
          if (fields == -1) {
            if (curr == null) {
              if (nullSafe) {
                throw new OptimizationNotSupported();
              }
              break;
            }
            else {
              fields = 0;
            }
          }

          first = false;

          if (nullSafe && cursor < end) {

            assert debug("DUP");
            mv.visitInsn(DUP);

            Label j = new Label();

            assert debug("IFNONNULL : jump");
            mv.visitJumpInsn(IFNONNULL, j);

            assert debug("ARETURN");
            mv.visitInsn(ARETURN);

            assert debug("LABEL:jump");
            mv.visitLabel(j);
          }
        }
      }
      else {
        while (cursor < end) {
          switch (nextSubToken()) {
            case BEAN:
              curr = getBeanPropertyAO(curr, capture());
              break;
            case METH:
              curr = getMethod(curr, capture());
              break;
            case COL:
              curr = getCollectionPropertyAO(curr, capture());
              break;
            case WITH:
              curr = getWithProperty(curr);
              break;
          }

          // check to see if a null safety is enabled on this property.
          if (fields == -1) {
            if (curr == null) {
              if (nullSafe) {
                throw new OptimizationNotSupported();
              }
              break;
            }
            else {
              fields = 0;
            }
          }

          first = false;

          if (nullSafe && cursor < end) {

            assert debug("DUP");
            mv.visitInsn(DUP);

            Label j = new Label();

            assert debug("IFNONNULL : jump");
            mv.visitJumpInsn(IFNONNULL, j);

            assert debug("ARETURN");
            mv.visitInsn(ARETURN);

            assert debug("LABEL:jump");
            mv.visitLabel(j);
          }
        }
      }

      val = curr;

      _finishJIT();

      return _initializeAccessor();
    }
    catch (InvocationTargetException e) {
      throw new PropertyAccessException(new String(expr), expr, st, e, pCtx);
    }
    catch (IllegalAccessException e) {
      throw new PropertyAccessException(new String(expr), expr, st, e, pCtx);
    }
    catch (IndexOutOfBoundsException e) {
      throw new PropertyAccessException(new String(expr), expr, st, e, pCtx);
    }
    catch (PropertyAccessException e) {
      throw new CompileException(e.getMessage(), expr, st, e);
    }
    catch (CompileException e) {
      throw e;
    }
    catch (NullPointerException e) {
      throw new PropertyAccessException(new String(expr), expr, st, e, pCtx);
    }
    catch (OptimizationNotSupported e) {
      throw e;
    }
    catch (Exception e) {
      throw new CompileException(e.getMessage(), expr, st, e);
    }
  }