http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ast/BuiltInsForMultipleTypes.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/freemarker/core/ast/BuiltInsForMultipleTypes.java 
b/src/main/java/org/apache/freemarker/core/ast/BuiltInsForMultipleTypes.java
deleted file mode 100644
index e31a97b..0000000
--- a/src/main/java/org/apache/freemarker/core/ast/BuiltInsForMultipleTypes.java
+++ /dev/null
@@ -1,726 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.core.ast;
-
-import java.util.Date;
-import java.util.List;
-
-import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.TemplateBooleanModel;
-import org.apache.freemarker.core.model.TemplateCollectionModel;
-import org.apache.freemarker.core.model.TemplateCollectionModelEx;
-import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateDirectiveModel;
-import org.apache.freemarker.core.model.TemplateHashModel;
-import org.apache.freemarker.core.model.TemplateHashModelEx;
-import org.apache.freemarker.core.model.TemplateMethodModel;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
-import org.apache.freemarker.core.model.TemplateModelWithAPISupport;
-import org.apache.freemarker.core.model.TemplateNodeModel;
-import org.apache.freemarker.core.model.TemplateNumberModel;
-import org.apache.freemarker.core.model.TemplateScalarModel;
-import org.apache.freemarker.core.model.TemplateSequenceModel;
-import org.apache.freemarker.core.model.TemplateTransformModel;
-import org.apache.freemarker.core.model.impl.SimpleDate;
-import org.apache.freemarker.core.model.impl.SimpleNumber;
-import org.apache.freemarker.core.model.impl.SimpleScalar;
-import org.apache.freemarker.core.model.impl.beans.OverloadedMethodsModel;
-import org.apache.freemarker.core.model.impl.beans.SimpleMethodModel;
-
-/**
- * A holder for builtins that didn't fit into any other category.
- */
-class BuiltInsForMultipleTypes {
-
-    static class cBI extends AbstractCBI {
-        
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel model = target.eval(env);
-            if (model instanceof TemplateNumberModel) {
-                return formatNumber(env, model);
-            } else if (model instanceof TemplateBooleanModel) {
-                return new SimpleScalar(((TemplateBooleanModel) 
model).getAsBoolean()
-                        ? MiscUtil.C_TRUE : MiscUtil.C_FALSE);
-            } else {
-                throw new UnexpectedTypeException(
-                        target, model,
-                        "number or boolean", new Class[] { 
TemplateNumberModel.class, TemplateBooleanModel.class },
-                        env);
-            }
-        }
-
-        @Override
-        protected TemplateModel formatNumber(Environment env, TemplateModel 
model) throws TemplateModelException {
-            Number num = EvalUtil.modelToNumber((TemplateNumberModel) model, 
target);
-            if (num instanceof Integer || num instanceof Long) {
-                // Accelerate these fairly common cases
-                return new SimpleScalar(num.toString());
-            } else if (num instanceof Double) {
-                double n = num.doubleValue();
-                if (n == Double.POSITIVE_INFINITY) {
-                    return new SimpleScalar("INF");
-                }
-                if (n == Double.NEGATIVE_INFINITY) {
-                    return new SimpleScalar("-INF");
-                }
-                if (Double.isNaN(n)) {
-                    return new SimpleScalar("NaN");
-                }
-                // Deliberately falls through
-            } else if (num instanceof Float) {
-                float n = num.floatValue();
-                if (n == Float.POSITIVE_INFINITY) {
-                    return new SimpleScalar("INF");
-                }
-                if (n == Float.NEGATIVE_INFINITY) {
-                    return new SimpleScalar("-INF");
-                }
-                if (Float.isNaN(n)) {
-                    return new SimpleScalar("NaN");
-                }
-                // Deliberately falls through
-            }
-        
-            return new SimpleScalar(env.getCNumberFormat().format(num));
-        }
-        
-    }
-
-    static class dateBI extends BuiltIn {
-        private class DateParser
-        implements
-            TemplateDateModel,
-            TemplateMethodModel,
-            TemplateHashModel {
-            private final String text;
-            private final Environment env;
-            private final TemplateDateFormat defaultFormat;
-            private TemplateDateModel cachedValue;
-            
-            DateParser(String text, Environment env)
-            throws TemplateException {
-                this.text = text;
-                this.env = env;
-                defaultFormat = env.getTemplateDateFormat(dateType, 
Date.class, target, false);
-            }
-            
-            @Override
-            public Object exec(List args) throws TemplateModelException {
-                checkMethodArgCount(args, 0, 1);
-                return args.size() == 0 ? getAsDateModel() : get((String) 
args.get(0));
-            }
-            
-            @Override
-            public TemplateModel get(String pattern) throws 
TemplateModelException {
-                TemplateDateFormat format;
-                try {
-                    format = env.getTemplateDateFormat(pattern, dateType, 
Date.class, target, dateBI.this, true);
-                } catch (TemplateException e) {
-                    // `e` should always be a TemplateModelException here, but 
to be sure: 
-                    throw _CoreAPI.ensureIsTemplateModelException("Failed to 
get format", e); 
-                }
-                return toTemplateDateModel(parse(format));
-            }
-
-            private TemplateDateModel toTemplateDateModel(Object date) throws 
_TemplateModelException {
-                if (date instanceof Date) {
-                    return new SimpleDate((Date) date, dateType);
-                } else {
-                    TemplateDateModel tm = (TemplateDateModel) date;
-                    if (tm.getDateType() != dateType) {
-                        throw new _TemplateModelException("The result of the 
parsing was of the wrong date type.");
-                    }
-                    return tm;
-                }
-            }
-
-            private TemplateDateModel getAsDateModel() throws 
TemplateModelException {
-                if (cachedValue == null) {
-                    cachedValue = toTemplateDateModel(parse(defaultFormat));
-                }
-                return cachedValue;
-            }
-            
-            @Override
-            public Date getAsDate() throws TemplateModelException {
-                return getAsDateModel().getAsDate();
-            }
-    
-            @Override
-            public int getDateType() {
-                return dateType;
-            }
-    
-            @Override
-            public boolean isEmpty() {
-                return false;
-            }
-    
-            private Object parse(TemplateDateFormat df)
-            throws TemplateModelException {
-                try {
-                    return df.parse(text, dateType);
-                } catch (TemplateValueFormatException e) {
-                    throw new _TemplateModelException(e,
-                            "The string doesn't match the expected 
date/time/date-time format. "
-                            + "The string to parse was: ", new 
_DelayedJQuote(text), ". ",
-                            "The expected format was: ", new 
_DelayedJQuote(df.getDescription()), ".",
-                            e.getMessage() != null ? "\nThe nested reason 
given follows:\n" : "",
-                            e.getMessage() != null ? e.getMessage() : "");
-                }
-            }
-            
-        }
-        
-        private final int dateType;
-        
-        dateBI(int dateType) {
-            this.dateType = dateType;
-        }
-        
-        @Override
-        TemplateModel _eval(Environment env)
-                throws TemplateException {
-            TemplateModel model = target.eval(env);
-            if (model instanceof TemplateDateModel) {
-                TemplateDateModel dmodel = (TemplateDateModel) model;
-                int dtype = dmodel.getDateType();
-                // Any date model can be coerced into its own type
-                if (dateType == dtype) {
-                    return model;
-                }
-                // unknown and datetime can be coerced into any date type
-                if (dtype == TemplateDateModel.UNKNOWN || dtype == 
TemplateDateModel.DATETIME) {
-                    return new SimpleDate(dmodel.getAsDate(), dateType);
-                }
-                throw new _MiscTemplateException(this,
-                            "Cannot convert ", 
TemplateDateModel.TYPE_NAMES.get(dtype),
-                            " to ", 
TemplateDateModel.TYPE_NAMES.get(dateType));
-            }
-            // Otherwise, interpret as a string and attempt 
-            // to parse it into a date.
-            String s = target.evalAndCoerceToPlainText(env);
-            return new DateParser(s, env);
-        }
-
-    }
-
-    static class apiBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            if (!env.isAPIBuiltinEnabled()) {
-                throw new _MiscTemplateException(this,
-                        "Can't use ?api, because the \"", 
Configurable.API_BUILTIN_ENABLED_KEY,
-                        "\" configuration setting is false. Think twice before 
you set it to true though. Especially, "
-                        + "it shouldn't abussed for modifying Map-s and 
Collection-s.");
-            }
-            final TemplateModel tm = target.eval(env);
-            if (!(tm instanceof TemplateModelWithAPISupport)) {
-                target.assertNonNull(tm, env);
-                throw new APINotSupportedTemplateException(env, target, tm);
-            }
-            return ((TemplateModelWithAPISupport) tm).getAPI();
-        }
-    }
-
-    static class has_apiBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            final TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return tm instanceof TemplateModelWithAPISupport ? 
TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-    
-    static class is_booleanBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateBooleanModel)  ?
-                TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_collectionBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateCollectionModel) ? 
TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_collection_exBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateCollectionModelEx) ? 
TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_dateLikeBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateDateModel)  ?
-                TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_dateOfTypeBI extends BuiltIn {
-        
-        private final int dateType;
-        
-        is_dateOfTypeBI(int dateType) {
-            this.dateType = dateType;
-        }
-
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateDateModel) && ((TemplateDateModel) 
tm).getDateType() == dateType
-                ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_directiveBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            // WRONG: it also had to check Macro.isFunction()
-            return (tm instanceof TemplateTransformModel || tm instanceof 
Macro || tm instanceof TemplateDirectiveModel) ?
-                TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_enumerableBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateSequenceModel || tm instanceof 
TemplateCollectionModel)
-                    && !(tm instanceof SimpleMethodModel || tm instanceof 
OverloadedMethodsModel)
-                    ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_hash_exBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateHashModelEx) ? 
TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_hashBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateHashModel) ? 
TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_indexableBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateSequenceModel) ? 
TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_macroBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            // WRONG: it also had to check Macro.isFunction()
-            return (tm instanceof Macro)  ?
-                TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_markup_outputBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateMarkupOutputModel)  ?
-                TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-    
-    static class is_methodBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateMethodModel)  ?
-                TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_nodeBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateNodeModel)  ?
-                TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_numberBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateNumberModel)  ?
-                TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_sequenceBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return tm instanceof TemplateSequenceModel
-                    && !(tm instanceof OverloadedMethodsModel || tm instanceof 
SimpleMethodModel) // [FM3] Until BW fixed
-                    ? TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_stringBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateScalarModel)  ?
-                TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class is_transformBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            target.assertNonNull(tm, env);
-            return (tm instanceof TemplateTransformModel)  ?
-                TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
-        }
-    }
-
-    static class namespaceBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel tm = target.eval(env);
-            if (!(tm instanceof Macro)) {
-                throw new UnexpectedTypeException(
-                        target, tm,
-                        "macro or function", new Class[] { Macro.class },
-                        env);
-            } else {
-                return env.getMacroNamespace((Macro) tm);
-            }
-        }
-    }
-
-    static class sizeBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel model = target.eval(env);
-
-            final int size;
-            if (model instanceof TemplateSequenceModel) {
-                size = ((TemplateSequenceModel) model).size();
-            } else if (model instanceof TemplateCollectionModelEx) {
-                size = ((TemplateCollectionModelEx) model).size();
-            } else if (model instanceof TemplateHashModelEx) {
-                size = ((TemplateHashModelEx) model).size();
-            } else {
-                throw new UnexpectedTypeException(
-                        target, model,
-                        "extended-hash or sequence or extended collection",
-                        new Class[] {
-                                TemplateHashModelEx.class,
-                                TemplateSequenceModel.class,
-                                TemplateCollectionModelEx.class
-                        },
-                        env);
-            }
-            return new SimpleNumber(size);
-        }
-    }
-    
-    static class stringBI extends BuiltIn {
-        
-        private class BooleanFormatter
-        implements 
-            TemplateScalarModel, 
-            TemplateMethodModel {
-            private final TemplateBooleanModel bool;
-            private final Environment env;
-            
-            BooleanFormatter(TemplateBooleanModel bool, Environment env) {
-                this.bool = bool;
-                this.env = env;
-            }
-    
-            @Override
-            public Object exec(List args) throws TemplateModelException {
-                checkMethodArgCount(args, 2);
-                return new SimpleScalar((String) args.get(bool.getAsBoolean() 
? 0 : 1));
-            }
-    
-            @Override
-            public String getAsString() throws TemplateModelException {
-                // Boolean should have come first... but that change would be 
non-BC. 
-                if (bool instanceof TemplateScalarModel) {
-                    return ((TemplateScalarModel) bool).getAsString();
-                } else {
-                    try {
-                        return env.formatBoolean(bool.getAsBoolean(), true);
-                    } catch (TemplateException e) {
-                        throw new TemplateModelException(e);
-                    }
-                }
-            }
-        }
-    
-        private class DateFormatter
-        implements
-            TemplateScalarModel,
-            TemplateHashModel,
-            TemplateMethodModel {
-            private final TemplateDateModel dateModel;
-            private final Environment env;
-            private final TemplateDateFormat defaultFormat;
-            private String cachedValue;
-    
-            DateFormatter(TemplateDateModel dateModel, Environment env)
-            throws TemplateException {
-                this.dateModel = dateModel;
-                this.env = env;
-                
-                final int dateType = dateModel.getDateType();
-                defaultFormat = dateType == TemplateDateModel.UNKNOWN
-                        ? null  // Lazy unknown type error in getAsString()
-                        : env.getTemplateDateFormat(
-                                dateType, EvalUtil.modelToDate(dateModel, 
target).getClass(), target, true);
-            }
-    
-            @Override
-            public Object exec(List args) throws TemplateModelException {
-                checkMethodArgCount(args, 1);
-                return formatWith((String) args.get(0));
-            }
-
-            @Override
-            public TemplateModel get(String key)
-            throws TemplateModelException {
-                return formatWith(key);
-            }
-
-            private TemplateModel formatWith(String key)
-            throws TemplateModelException {
-                try {
-                    return new 
SimpleScalar(env.formatDateToPlainText(dateModel, key, target, stringBI.this, 
true));
-                } catch (TemplateException e) {
-                    // `e` should always be a TemplateModelException here, but 
to be sure: 
-                    throw _CoreAPI.ensureIsTemplateModelException("Failed to 
format value", e); 
-                }
-            }
-            
-            @Override
-            public String getAsString()
-            throws TemplateModelException {
-                if (cachedValue == null) {
-                    if (defaultFormat == null) {
-                        if (dateModel.getDateType() == 
TemplateDateModel.UNKNOWN) {
-                            throw 
MessageUtil.newCantFormatUnknownTypeDateException(target, null);
-                        } else {
-                            throw new BugException();
-                        }
-                    }
-                    try {
-                        cachedValue = 
EvalUtil.assertFormatResultNotNull(defaultFormat.formatToPlainText(dateModel));
-                    } catch (TemplateValueFormatException e) {
-                        try {
-                            throw 
MessageUtil.newCantFormatDateException(defaultFormat, target, e, true);
-                        } catch (TemplateException e2) {
-                            // `e` should always be a TemplateModelException 
here, but to be sure: 
-                            throw 
_CoreAPI.ensureIsTemplateModelException("Failed to format date/time/datetime", 
e2); 
-                        }
-                    }
-                }
-                return cachedValue;
-            }
-    
-            @Override
-            public boolean isEmpty() {
-                return false;
-            }
-        }
-        
-        private class NumberFormatter
-        implements
-            TemplateScalarModel,
-            TemplateHashModel,
-            TemplateMethodModel {
-            private final TemplateNumberModel numberModel;
-            private final Number number;
-            private final Environment env;
-            private final TemplateNumberFormat defaultFormat;
-            private String cachedValue;
-    
-            NumberFormatter(TemplateNumberModel numberModel, Environment env) 
throws TemplateException {
-                this.env = env;
-                
-                // As we format lazily, we need a snapshot of the format 
inputs:
-                this.numberModel = numberModel;
-                number = EvalUtil.modelToNumber(numberModel, target);  // for 
BackwardCompatibleTemplateNumberFormat-s
-                try {
-                    defaultFormat = env.getTemplateNumberFormat(stringBI.this, 
true);
-                } catch (TemplateException e) {
-                    // `e` should always be a TemplateModelException here, but 
to be sure: 
-                    throw _CoreAPI.ensureIsTemplateModelException("Failed to 
get default number format", e); 
-                }
-            }
-    
-            @Override
-            public Object exec(List args) throws TemplateModelException {
-                checkMethodArgCount(args, 1);
-                return get((String) args.get(0));
-            }
-    
-            @Override
-            public TemplateModel get(String key) throws TemplateModelException 
{
-                TemplateNumberFormat format;
-                try {
-                    format = env.getTemplateNumberFormat(key, stringBI.this, 
true);
-                } catch (TemplateException e) {
-                    // `e` should always be a TemplateModelException here, but 
to be sure: 
-                    throw _CoreAPI.ensureIsTemplateModelException("Failed to 
get number format", e); 
-                }
-                
-                String result;
-                try {
-                    if (format instanceof 
BackwardCompatibleTemplateNumberFormat) {
-                        result = env.formatNumberToPlainText(number, 
(BackwardCompatibleTemplateNumberFormat) format, target);
-                    } else {
-                        result = env.formatNumberToPlainText(numberModel, 
format, target, true);
-                    }
-                } catch (TemplateException e) {
-                    // `e` should always be a TemplateModelException here, but 
to be sure: 
-                    throw _CoreAPI.ensureIsTemplateModelException("Failed to 
format number", e); 
-                }
-                
-                return new SimpleScalar(result);
-            }
-            
-            @Override
-            public String getAsString() throws TemplateModelException {
-                if (cachedValue == null) {
-                    try {
-                        if (defaultFormat instanceof 
BackwardCompatibleTemplateNumberFormat) {
-                            cachedValue = env.formatNumberToPlainText(
-                                    number, 
(BackwardCompatibleTemplateNumberFormat) defaultFormat, target);
-                        } else {
-                            cachedValue = 
env.formatNumberToPlainText(numberModel, defaultFormat, target, true);
-                        }
-                    } catch (TemplateException e) {
-                        // `e` should always be a TemplateModelException here, 
but to be sure: 
-                        throw _CoreAPI.ensureIsTemplateModelException("Failed 
to format number", e); 
-                    }
-                }
-                return cachedValue;
-            }
-    
-            @Override
-            public boolean isEmpty() {
-                return false;
-            }
-        }
-    
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel model = target.eval(env);
-            if (model instanceof TemplateNumberModel) {
-                TemplateNumberModel numberModel = (TemplateNumberModel) model;
-                Number num = EvalUtil.modelToNumber(numberModel, target);
-                return new NumberFormatter(numberModel, env);
-            } else if (model instanceof TemplateDateModel) {
-                TemplateDateModel dm = (TemplateDateModel) model;
-                return new DateFormatter(dm, env);
-            } else if (model instanceof SimpleScalar) {
-                return model;
-            } else if (model instanceof TemplateBooleanModel) {
-                return new BooleanFormatter((TemplateBooleanModel) model, env);
-            } else if (model instanceof TemplateScalarModel) {
-                return new SimpleScalar(((TemplateScalarModel) 
model).getAsString());
-            } else {            
-                throw new UnexpectedTypeException(
-                        target, model,
-                        "number, date, boolean or string",
-                        new Class[] {
-                            TemplateNumberModel.class, 
TemplateDateModel.class, TemplateBooleanModel.class,
-                            TemplateScalarModel.class
-                        },
-                        env);
-            }
-        }
-    }
-
-    // Can't be instantiated
-    private BuiltInsForMultipleTypes() { }
-
-    static abstract class AbstractCBI extends BuiltIn {
-        
-        @Override
-        TemplateModel _eval(Environment env) throws TemplateException {
-            TemplateModel model = target.eval(env);
-            if (model instanceof TemplateNumberModel) {
-                return formatNumber(env, model);
-            } else if (model instanceof TemplateBooleanModel) {
-                return new SimpleScalar(((TemplateBooleanModel) 
model).getAsBoolean()
-                        ? MiscUtil.C_TRUE : MiscUtil.C_FALSE);
-            } else {
-                throw new UnexpectedTypeException(
-                        target, model,
-                        "number or boolean", new Class[] { 
TemplateNumberModel.class, TemplateBooleanModel.class },
-                        env);
-            }
-        }
-    
-        protected abstract TemplateModel formatNumber(Environment env, 
TemplateModel model) throws TemplateModelException;
-        
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ast/BuiltInsForNodes.java
----------------------------------------------------------------------
diff --git a/src/main/java/org/apache/freemarker/core/ast/BuiltInsForNodes.java 
b/src/main/java/org/apache/freemarker/core/ast/BuiltInsForNodes.java
deleted file mode 100644
index d2ca3cf..0000000
--- a/src/main/java/org/apache/freemarker/core/ast/BuiltInsForNodes.java
+++ /dev/null
@@ -1,156 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.core.ast;
-
-import java.util.List;
-
-import org.apache.freemarker.core.model.TemplateMethodModel;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
-import org.apache.freemarker.core.model.TemplateNodeModel;
-import org.apache.freemarker.core.model.TemplateNodeModelEx;
-import org.apache.freemarker.core.model.impl.SimpleScalar;
-import org.apache.freemarker.core.model.impl.SimpleSequence;
-import org.apache.freemarker.core.model.impl.dom._ExtDomApi;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
-/**
- * A holder for builtins that operate exclusively on (XML-)node left-hand 
value.
- */
-class BuiltInsForNodes {
-    
-    static class ancestorsBI extends BuiltInForNode {
-       @Override
-    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment 
env) throws TemplateModelException {
-           AncestorSequence result = new AncestorSequence(env);
-           TemplateNodeModel parent = nodeModel.getParentNode();
-           while (parent != null) {
-               result.add(parent);
-               parent = parent.getParentNode();
-           }
-           return result;
-       }
-    }
-    
-    static class childrenBI extends BuiltInForNode {
-       @Override
-    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment 
env) throws TemplateModelException {
-            return nodeModel.getChildNodes();
-       }
-    }
-    
-    static class node_nameBI extends BuiltInForNode {
-       @Override
-    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment 
env) throws TemplateModelException {
-            return new SimpleScalar(nodeModel.getNodeName());
-       }
-    }
-    
-    
-    static class node_namespaceBI extends BuiltInForNode {
-        @Override
-        TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment 
env) throws TemplateModelException {
-            String nsURI = nodeModel.getNodeNamespace();
-            return nsURI == null ? null : new SimpleScalar(nsURI);
-        }
-    }
-    
-    static class node_typeBI extends BuiltInForNode {
-       @Override
-    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment 
env) throws TemplateModelException {
-            return new SimpleScalar(nodeModel.getNodeType());
-        }
-    }
-
-    static class parentBI extends BuiltInForNode {
-       @Override
-    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment 
env) throws TemplateModelException {
-            return nodeModel.getParentNode();
-       }
-    }
-    
-    static class rootBI extends BuiltInForNode {
-       @Override
-    TemplateModel calculateResult(TemplateNodeModel nodeModel, Environment 
env) throws TemplateModelException {
-            TemplateNodeModel result = nodeModel;
-            TemplateNodeModel parent = nodeModel.getParentNode();
-            while (parent != null) {
-                result = parent;
-                parent = result.getParentNode();
-            }
-            return result;
-       }
-    }
-
-    static class previousSiblingBI extends BuiltInForNodeEx {
-        @Override
-        TemplateModel calculateResult(TemplateNodeModelEx nodeModel, 
Environment env) throws TemplateModelException {
-            return nodeModel.getPreviousSibling();
-        }
-    }
-
-    static class nextSiblingBI extends  BuiltInForNodeEx {
-        @Override
-        TemplateModel calculateResult(TemplateNodeModelEx nodeModel, 
Environment env) throws TemplateModelException {
-            return nodeModel.getNextSibling();
-        }
-    }
-    
-    // Can't be instantiated
-    private BuiltInsForNodes() { }
-
-    static class AncestorSequence extends SimpleSequence implements 
TemplateMethodModel {
-        
-        @SuppressFBWarnings(value="SE_BAD_FIELD",
-                justification="Can't make this Serializable, and not extneding 
SimpleSequence would be non-BC.")
-        private Environment env;
-        
-        AncestorSequence(Environment env) {
-            this.env = env;
-        }
-        
-        @Override
-        public Object exec(List names) throws TemplateModelException {
-            if (names == null || names.isEmpty()) {
-                return this;
-            }
-            AncestorSequence result = new AncestorSequence(env);
-            for (int i = 0; i < size(); i++) {
-                TemplateNodeModel tnm = (TemplateNodeModel) get(i);
-                String nodeName = tnm.getNodeName();
-                String nsURI = tnm.getNodeNamespace();
-                if (nsURI == null) {
-                    if (names.contains(nodeName)) {
-                        result.add(tnm);
-                    }
-                } else {
-                    for (int j = 0; j < names.size(); j++) {
-                        if (_ExtDomApi.matchesName((String) names.get(j), 
nodeName, nsURI, env)) {
-                            result.add(tnm);
-                            break;
-                        }
-                    }
-                }
-            }
-            return result;
-        }
-    }    
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ast/BuiltInsForNumbers.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/freemarker/core/ast/BuiltInsForNumbers.java 
b/src/main/java/org/apache/freemarker/core/ast/BuiltInsForNumbers.java
deleted file mode 100644
index 21d4cd2..0000000
--- a/src/main/java/org/apache/freemarker/core/ast/BuiltInsForNumbers.java
+++ /dev/null
@@ -1,320 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.freemarker.core.ast;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.util.Date;
-
-import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.TemplateBooleanModel;
-import org.apache.freemarker.core.model.TemplateDateModel;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
-import org.apache.freemarker.core.model.TemplateNumberModel;
-import org.apache.freemarker.core.model.impl.SimpleDate;
-import org.apache.freemarker.core.model.impl.SimpleNumber;
-import org.apache.freemarker.core.model.impl.SimpleScalar;
-import org.apache.freemarker.core.util._NumberUtil;
-import org.apache.freemarker.core.util._StringUtil;
-
-/**
- * A holder for builtins that operate exclusively on number left-hand value.
- */
-class BuiltInsForNumbers {
-
-    private static abstract class abcBI extends BuiltInForNumber {
-
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) throws 
TemplateModelException {
-            final int n;
-            try {
-                n = _NumberUtil.toIntExact(num);
-            } catch (ArithmeticException e) {
-                throw new _TemplateModelException(target,
-                        "The left side operand value isn't compatible with ?", 
key, ": ", e.getMessage());
-         
-            }
-            if (n <= 0) {
-                throw new _TemplateModelException(target,
-                        "The left side operand of to ?", key, " must be at 
least 1, but was ", Integer.valueOf(n), ".");
-            }
-            return new SimpleScalar(toABC(n));
-        }
-
-        protected abstract String toABC(int n);
-        
-    }
-
-    static class lower_abcBI extends abcBI {
-
-        @Override
-        protected String toABC(int n) {
-            return _StringUtil.toLowerABC(n);
-        }
-        
-    }
-
-    static class upper_abcBI extends abcBI {
-
-        @Override
-        protected String toABC(int n) {
-            return _StringUtil.toUpperABC(n);
-        }
-        
-    }
-    
-    static class absBI extends BuiltInForNumber {
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) throws 
TemplateModelException {
-            if (num instanceof Integer) {
-                int n = ((Integer) num).intValue();
-                if (n < 0) {
-                    return new SimpleNumber(-n);
-                } else {
-                    return model;
-                }
-            } else if (num instanceof BigDecimal) {
-                BigDecimal n = (BigDecimal) num;
-                if (n.signum() < 0) {
-                    return new SimpleNumber(n.negate());
-                } else {
-                    return model;
-                }
-            } else if (num instanceof Double) {
-                double n = ((Double) num).doubleValue();
-                if (n < 0) {
-                    return new SimpleNumber(-n);
-                } else {
-                    return model;
-                }
-            } else if (num instanceof Float) {
-                float n = ((Float) num).floatValue();
-                if (n < 0) {
-                    return new SimpleNumber(-n);
-                } else {
-                    return model;
-                }
-            } else if (num instanceof Long) {
-                long n = ((Long) num).longValue();
-                if (n < 0) {
-                    return new SimpleNumber(-n);
-                } else {
-                    return model;
-                }
-            } else if (num instanceof Short) {
-                short n = ((Short) num).shortValue();
-                if (n < 0) {
-                    return new SimpleNumber(-n);
-                } else {
-                    return model;
-                }
-            } else if (num instanceof Byte) {
-                byte n = ((Byte) num).byteValue();
-                if (n < 0) {
-                    return new SimpleNumber(-n);
-                } else {
-                    return model;
-                }
-            } else if (num instanceof BigInteger) {
-                BigInteger n = (BigInteger) num;
-                if (n.signum() < 0) {
-                    return new SimpleNumber(n.negate());
-                } else {
-                    return model;
-                }
-            } else {
-                throw new _TemplateModelException("Unsupported number class: 
", num.getClass());
-            }            
-        }
-    }
-    
-    static class byteBI extends BuiltInForNumber {
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) {
-            if (num instanceof Byte) {
-                return model;
-            }
-            return new SimpleNumber(Byte.valueOf(num.byteValue()));
-        }
-    }
-
-    static class ceilingBI extends BuiltInForNumber {
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) {
-            return new SimpleNumber(new 
BigDecimal(num.doubleValue()).divide(BIG_DECIMAL_ONE, 0, 
BigDecimal.ROUND_CEILING));
-        }
-    }
-
-    static class doubleBI extends BuiltInForNumber {
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) {
-            if (num instanceof Double) {
-                return model;
-            }
-            return new SimpleNumber(num.doubleValue());
-        }
-    }
-
-    static class floatBI extends BuiltInForNumber {
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) {
-            if (num instanceof Float) {
-                return model;
-            }
-            return new SimpleNumber(num.floatValue());
-        }
-    }
-
-    static class floorBI extends BuiltInForNumber {
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) {
-            return new SimpleNumber(new 
BigDecimal(num.doubleValue()).divide(BIG_DECIMAL_ONE, 0, 
BigDecimal.ROUND_FLOOR));
-        }
-    }
-
-    static class intBI extends BuiltInForNumber {
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) {
-            if (num instanceof Integer) {
-                return model;
-            }
-            return new SimpleNumber(num.intValue());
-        }
-    }
-
-    static class is_infiniteBI extends BuiltInForNumber {
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) throws 
TemplateModelException {
-            return _NumberUtil.isInfinite(num) ? TemplateBooleanModel.TRUE : 
TemplateBooleanModel.FALSE;
-        }
-    }
-
-
-    static class is_nanBI extends BuiltInForNumber {
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) throws 
TemplateModelException {
-            return _NumberUtil.isNaN(num) ? TemplateBooleanModel.TRUE : 
TemplateBooleanModel.FALSE;
-        }
-    }
-
-    // Does both someNumber?long and someDate?long, thus it doesn't extend 
NumberBuiltIn
-    static class longBI extends BuiltIn {
-        @Override
-        TemplateModel _eval(Environment env)
-                throws TemplateException {
-            TemplateModel model = target.eval(env);
-            if (!(model instanceof TemplateNumberModel)
-                    && model instanceof TemplateDateModel) {
-                Date date = EvalUtil.modelToDate((TemplateDateModel) model, 
target);
-                return new SimpleNumber(date.getTime());
-            } else {
-                Number num = target.modelToNumber(model, env);
-                if (num instanceof Long) {
-                    return model;
-                }
-                return new SimpleNumber(num.longValue());
-            }
-        }
-    }
-
-    static class number_to_dateBI extends BuiltInForNumber {
-        
-        private final int dateType;
-        
-        number_to_dateBI(int dateType) {
-            this.dateType = dateType;
-        }
-        
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model)
-        throws TemplateModelException {
-            return new SimpleDate(new Date(safeToLong(num)), dateType);
-        }
-    }
-
-    static class roundBI extends BuiltInForNumber {
-        private static final BigDecimal half = new BigDecimal("0.5");
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) {
-            return new SimpleNumber(new 
BigDecimal(num.doubleValue()).add(half).divide(BIG_DECIMAL_ONE, 0, 
BigDecimal.ROUND_FLOOR));
-        }
-    }
-    
-    static class shortBI extends BuiltInForNumber {
-        @Override
-        TemplateModel calculateResult(Number num, TemplateModel model) {
-            if (num instanceof Short) {
-                return model;
-            }
-            return new SimpleNumber(Short.valueOf(num.shortValue()));
-        }
-    }
-
-    private static final long safeToLong(Number num) throws 
TemplateModelException {
-        if (num instanceof Double) {
-            double d = Math.round(num.doubleValue());
-            if (d > Long.MAX_VALUE || d < Long.MIN_VALUE) {
-                throw new _TemplateModelException(
-                        "Number doesn't fit into a 64 bit signed integer 
(long): ", Double.valueOf(d));
-            } else {
-                return (long) d;
-            }
-        } else if (num instanceof Float) {
-            float f = Math.round(num.floatValue());
-            if (f > Long.MAX_VALUE || f < Long.MIN_VALUE) {
-                throw new _TemplateModelException(
-                        "Number doesn't fit into a 64 bit signed integer 
(long): ", Float.valueOf(f));
-            } else {
-                return (long) f;
-            }
-        } else if (num instanceof BigDecimal) {
-            BigDecimal bd = ((BigDecimal) num).setScale(0, 
BigDecimal.ROUND_HALF_UP);
-            if (bd.compareTo(BIG_DECIMAL_LONG_MAX) > 0 || 
bd.compareTo(BIG_DECIMAL_LONG_MIN) < 0) {
-                throw new _TemplateModelException("Number doesn't fit into a 
64 bit signed integer (long): ", bd);
-            } else {
-                return bd.longValue();
-            }
-        } else if (num instanceof BigInteger) {
-            BigInteger bi = (BigInteger) num;
-            if (bi.compareTo(BIG_INTEGER_LONG_MAX) > 0 || 
bi.compareTo(BIG_INTEGER_LONG_MIN) < 0) {
-                throw new _TemplateModelException("Number doesn't fit into a 
64 bit signed integer (long): ", bi);
-            } else {
-                return bi.longValue();
-            }
-        } else if (num instanceof Long || num instanceof Integer || num 
instanceof Byte || num instanceof Short) {
-            return num.longValue();
-        } else {
-            // Should add Atomic* types in 2.4...
-            throw new _TemplateModelException("Unsupported number type: ", 
num.getClass());
-        }
-    }
-    
-    private static final BigDecimal BIG_DECIMAL_ONE = new BigDecimal("1");
-    private static final BigDecimal BIG_DECIMAL_LONG_MIN = 
BigDecimal.valueOf(Long.MIN_VALUE); 
-    private static final BigDecimal BIG_DECIMAL_LONG_MAX = 
BigDecimal.valueOf(Long.MAX_VALUE);
-    private static final BigInteger BIG_INTEGER_LONG_MIN = 
BigInteger.valueOf(Long.MIN_VALUE); 
-    
-    private static final BigInteger BIG_INTEGER_LONG_MAX = 
BigInteger.valueOf(Long.MAX_VALUE);
-    
-    // Can't be instantiated
-    private BuiltInsForNumbers() { }
-    
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/7d784b2b/src/main/java/org/apache/freemarker/core/ast/BuiltInsForOutputFormatRelated.java
----------------------------------------------------------------------
diff --git 
a/src/main/java/org/apache/freemarker/core/ast/BuiltInsForOutputFormatRelated.java
 
b/src/main/java/org/apache/freemarker/core/ast/BuiltInsForOutputFormatRelated.java
deleted file mode 100644
index d7e7d31..0000000
--- 
a/src/main/java/org/apache/freemarker/core/ast/BuiltInsForOutputFormatRelated.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.freemarker.core.ast;
-
-import org.apache.freemarker.core.TemplateException;
-import org.apache.freemarker.core.model.TemplateModel;
-
-class BuiltInsForOutputFormatRelated {
-
-    static class no_escBI extends AbstractConverterBI {
-
-        @Override
-        protected TemplateModel calculateResult(String lho, MarkupOutputFormat 
outputFormat, Environment env)
-                throws TemplateException {
-            return outputFormat.fromMarkup(lho);
-        }
-        
-    }
-
-    static class escBI extends AbstractConverterBI {
-
-        @Override
-        protected TemplateModel calculateResult(String lho, MarkupOutputFormat 
outputFormat, Environment env)
-                throws TemplateException {
-            return outputFormat.fromPlainTextByEscaping(lho);
-        }
-        
-    }
-    
-    static abstract class AbstractConverterBI extends 
MarkupOutputFormatBoundBuiltIn {
-
-        @Override
-        protected TemplateModel calculateResult(Environment env) throws 
TemplateException {
-            TemplateModel lhoTM = target.eval(env);
-            Object lhoMOOrStr = EvalUtil.coerceModelToStringOrMarkup(lhoTM, 
target, null, env);
-            MarkupOutputFormat contextOF = outputFormat;
-            if (lhoMOOrStr instanceof String) { // TemplateMarkupOutputModel
-                return calculateResult((String) lhoMOOrStr, contextOF, env);
-            } else {
-                TemplateMarkupOutputModel lhoMO = (TemplateMarkupOutputModel) 
lhoMOOrStr;
-                MarkupOutputFormat lhoOF = lhoMO.getOutputFormat();
-                // ATTENTION: Keep this logic in sync. with ${...}'s logic!
-                if (lhoOF == contextOF || 
contextOF.isOutputFormatMixingAllowed()) {
-                    // bypass
-                    return lhoMO;
-                } else {
-                    // ATTENTION: Keep this logic in sync. with ${...}'s logic!
-                    String lhoPlainTtext = lhoOF.getSourcePlainText(lhoMO);
-                    if (lhoPlainTtext == null) {
-                        throw new _TemplateModelException(target,
-                                "The left side operand of ?", key, " is in ", 
new _DelayedToString(lhoOF),
-                                " format, which differs from the current 
output format, ",
-                                new _DelayedToString(contextOF), ". Conversion 
wasn't possible.");
-                    }
-                    // Here we know that lho is escaped plain text. So we 
re-escape it to the current format and
-                    // bypass it, just as if the two output formats were the 
same earlier.
-                    return contextOF.fromPlainTextByEscaping(lhoPlainTtext);
-                }
-            }
-        }
-        
-        protected abstract TemplateModel calculateResult(String lho, 
MarkupOutputFormat outputFormat, Environment env)
-                throws TemplateException;
-        
-    }
-    
-}

Reply via email to