Repository: incubator-freemarker
Updated Branches:
  refs/heads/3 a3311d52e -> b867458aa


http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java
index e8cd15c..ce3ff56 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsBasic.java
@@ -27,7 +27,6 @@ import java.util.regex.Pattern;
 
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateMethodModel;
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateScalarModel;
@@ -70,7 +69,7 @@ class BuiltInsForStringsBasic {
 
     static class containsBI extends ASTExpBuiltIn {
         
-        private class BIMethod implements TemplateMethodModelEx {
+        private class BIMethod implements TemplateMethodModel {
             
             private final String s;
     
@@ -79,9 +78,9 @@ class BuiltInsForStringsBasic {
             }
     
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 checkMethodArgCount(args, 1);
-                return s.indexOf(getStringMethodArg(args, 0)) != -1
+                return s.contains(getStringMethodArg(args, 0))
                         ? TemplateBooleanModel.TRUE : 
TemplateBooleanModel.FALSE;
             }
         }
@@ -95,7 +94,7 @@ class BuiltInsForStringsBasic {
 
     static class ends_withBI extends BuiltInForString {
     
-        private class BIMethod implements TemplateMethodModelEx {
+        private class BIMethod implements TemplateMethodModel {
             private String s;
     
             private BIMethod(String s) {
@@ -103,7 +102,7 @@ class BuiltInsForStringsBasic {
             }
     
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 return s.endsWith(getStringMethodArg(args, 0)) ?
                         TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
@@ -118,7 +117,7 @@ class BuiltInsForStringsBasic {
 
     static class ensure_ends_withBI extends BuiltInForString {
         
-        private class BIMethod implements TemplateMethodModelEx {
+        private class BIMethod implements TemplateMethodModel {
             private String s;
     
             private BIMethod(String s) {
@@ -126,7 +125,7 @@ class BuiltInsForStringsBasic {
             }
     
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 String suffix = getStringMethodArg(args, 0);
                 return new SimpleScalar(s.endsWith(suffix) ? s : s + suffix);
@@ -141,7 +140,7 @@ class BuiltInsForStringsBasic {
 
     static class ensure_starts_withBI extends BuiltInForString {
         
-        private class BIMethod implements TemplateMethodModelEx {
+        private class BIMethod implements TemplateMethodModel {
             private String s;
     
             private BIMethod(String s) {
@@ -149,7 +148,7 @@ class BuiltInsForStringsBasic {
             }
     
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 checkMethodArgCount(args, 1, 3);
                 
                 final String checkedPrefix = getStringMethodArg(args, 0);
@@ -190,7 +189,7 @@ class BuiltInsForStringsBasic {
 
     static class index_ofBI extends ASTExpBuiltIn {
         
-        private class BIMethod implements TemplateMethodModelEx {
+        private class BIMethod implements TemplateMethodModel {
             
             private final String s;
             
@@ -199,7 +198,7 @@ class BuiltInsForStringsBasic {
             }
             
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
                 String subStr = getStringMethodArg(args, 0);
@@ -226,7 +225,7 @@ class BuiltInsForStringsBasic {
     }
     
     static class keep_afterBI extends BuiltInForString {
-        class KeepAfterMethod implements TemplateMethodModelEx {
+        class KeepAfterMethod implements TemplateMethodModel {
             private String s;
 
             KeepAfterMethod(String s) {
@@ -234,7 +233,7 @@ class BuiltInsForStringsBasic {
             }
 
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
                 String separatorString = getStringMethodArg(args, 0);
@@ -272,7 +271,7 @@ class BuiltInsForStringsBasic {
     }
     
     static class keep_after_lastBI extends BuiltInForString {
-        class KeepAfterMethod implements TemplateMethodModelEx {
+        class KeepAfterMethod implements TemplateMethodModel {
             private String s;
 
             KeepAfterMethod(String s) {
@@ -280,7 +279,7 @@ class BuiltInsForStringsBasic {
             }
 
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
                 String separatorString = getStringMethodArg(args, 0);
@@ -325,7 +324,7 @@ class BuiltInsForStringsBasic {
     }
     
     static class keep_beforeBI extends BuiltInForString {
-        class KeepUntilMethod implements TemplateMethodModelEx {
+        class KeepUntilMethod implements TemplateMethodModel {
             private String s;
 
             KeepUntilMethod(String s) {
@@ -333,7 +332,7 @@ class BuiltInsForStringsBasic {
             }
 
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
                 String separatorString = getStringMethodArg(args, 0);
@@ -369,7 +368,7 @@ class BuiltInsForStringsBasic {
     
     // TODO
     static class keep_before_lastBI extends BuiltInForString {
-        class KeepUntilMethod implements TemplateMethodModelEx {
+        class KeepUntilMethod implements TemplateMethodModel {
             private String s;
 
             KeepUntilMethod(String s) {
@@ -377,7 +376,7 @@ class BuiltInsForStringsBasic {
             }
 
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
                 String separatorString = getStringMethodArg(args, 0);
@@ -436,7 +435,7 @@ class BuiltInsForStringsBasic {
 
     static class padBI extends BuiltInForString {
         
-        private class BIMethod implements TemplateMethodModelEx {
+        private class BIMethod implements TemplateMethodModel {
             
             private final String s;
     
@@ -445,7 +444,7 @@ class BuiltInsForStringsBasic {
             }
     
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 int argCnt  = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
     
@@ -487,7 +486,7 @@ class BuiltInsForStringsBasic {
     
     static class remove_beginningBI extends BuiltInForString {
         
-        private class BIMethod implements TemplateMethodModelEx {
+        private class BIMethod implements TemplateMethodModel {
             private String s;
     
             private BIMethod(String s) {
@@ -495,7 +494,7 @@ class BuiltInsForStringsBasic {
             }
     
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 String prefix = getStringMethodArg(args, 0);
                 return new SimpleScalar(s.startsWith(prefix) ? 
s.substring(prefix.length()) : s);
@@ -510,7 +509,7 @@ class BuiltInsForStringsBasic {
 
     static class remove_endingBI extends BuiltInForString {
     
-        private class BIMethod implements TemplateMethodModelEx {
+        private class BIMethod implements TemplateMethodModel {
             private String s;
     
             private BIMethod(String s) {
@@ -518,7 +517,7 @@ class BuiltInsForStringsBasic {
             }
     
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 String suffix = getStringMethodArg(args, 0);
                 return new SimpleScalar(s.endsWith(suffix) ? s.substring(0, 
s.length() - suffix.length()) : s);
@@ -540,12 +539,14 @@ class BuiltInsForStringsBasic {
             }
 
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
-                String splitString = (String) args.get(0);
-                long flags = argCnt > 1 ? 
RegexpHelper.parseFlagString((String) args.get(1)) : 0;
-                String[] result = null;
+                String splitString = _CallableUtils.castArgToString(args, 0);
+                long flags = argCnt > 1
+                        ? 
RegexpHelper.parseFlagString(_CallableUtils.castArgToString(args, 1))
+                        : 0;
+                String[] result;
                 if ((flags & RegexpHelper.RE_FLAG_REGEXP) == 0) {
                     RegexpHelper.checkNonRegexpFlags("split", flags);
                     result = _StringUtil.split(s, splitString,
@@ -567,7 +568,7 @@ class BuiltInsForStringsBasic {
     
     static class starts_withBI extends BuiltInForString {
     
-        private class BIMethod implements TemplateMethodModelEx {
+        private class BIMethod implements TemplateMethodModel {
             private String s;
     
             private BIMethod(String s) {
@@ -575,7 +576,7 @@ class BuiltInsForStringsBasic {
             }
     
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 checkMethodArgCount(args, 1);
                 return s.startsWith(getStringMethodArg(args, 0)) ?
                         TemplateBooleanModel.TRUE : TemplateBooleanModel.FALSE;
@@ -592,10 +593,10 @@ class BuiltInsForStringsBasic {
         
         @Override
         TemplateModel calculateResult(final String s, final Environment env) 
throws TemplateException {
-            return new TemplateMethodModelEx() {
+            return new TemplateMethodModel() {
                 
                 @Override
-                public Object exec(java.util.List args) throws 
TemplateModelException {
+                public TemplateModel execute(List<? extends TemplateModel> 
args) throws TemplateModelException {
                     int argCount = args.size();
                     checkMethodArgCount(argCount, 1, 2);
     
@@ -618,9 +619,9 @@ class BuiltInsForStringsBasic {
                         }
                         if (beginIdx > endIdx) {
                             throw 
MessageUtil.newMethodArgsInvalidValueException("?" + key,
-                                    "The begin index argument, ", 
Integer.valueOf(beginIdx),
+                                    "The begin index argument, ", beginIdx,
                                     ", shouldn't be greater than the end index 
argument, ",
-                                    Integer.valueOf(endIdx), ".");
+                                    endIdx, ".");
                         }
                         return new SimpleScalar(s.substring(beginIdx, endIdx));
                     } else {
@@ -633,15 +634,14 @@ class BuiltInsForStringsBasic {
                     return MessageUtil.newMethodArgInvalidValueException(
                             "?" + key, argIdx,
                             "The index mustn't be greater than the length of 
the string, ",
-                            Integer.valueOf(len),
-                            ", but it was ", Integer.valueOf(idx), ".");
+                            len, ", but it was ", idx, ".");
                 }
     
                 private TemplateModelException newIndexLessThan0Exception(
                         int argIdx, int idx) throws TemplateModelException {
                     return MessageUtil.newMethodArgInvalidValueException(
                             "?" + key, argIdx,
-                            "The index must be at least 0, but was ", 
Integer.valueOf(idx), ".");
+                            "The index must be at least 0, but was ", idx, 
".");
                 }
                 
             };

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java
index bfb44c6..cee1b49 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsEncoding.java
@@ -148,11 +148,11 @@ class BuiltInsForStringsEncoding {
         protected abstract String encodeWithCharset(Charset charset) throws 
UnsupportedEncodingException;
     
         @Override
-        public Object exec(List args) throws TemplateModelException {
+        public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
             parent.checkMethodArgCount(args.size(), 1);
             try {
-                String charsetName = (String) args.get(0);
-                Charset charset = null;
+                String charsetName = _CallableUtils.castArgToString(args,0);
+                Charset charset;
                 try {
                     charset = Charset.forName(charsetName);
                 } catch (UnsupportedCharsetException e) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java
index 2d50556..6bf7e2a 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsMisc.java
@@ -28,7 +28,7 @@ import org.apache.freemarker.core.model.ArgumentArrayLayout;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateDirectiveModel;
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
+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.TemplateScalarModel;
@@ -72,7 +72,7 @@ class BuiltInsForStringsMisc {
         TemplateModel calculateResult(String s, Environment env) throws 
TemplateException {
             Template parentTemplate = getTemplate();
             
-            ASTExpression exp = null;
+            ASTExpression exp;
             try {
                 try {
                     ParsingConfiguration pCfg = 
parentTemplate.getParsingConfiguration();
@@ -151,9 +151,11 @@ class BuiltInsForStringsMisc {
             ASTExpression sourceExpr = null;
             String id = "anonymous_interpreted";
             if (model instanceof TemplateSequenceModel) {
-                sourceExpr = ((ASTExpression) new ASTExpDynamicKeyName(target, 
new ASTExpNumberLiteral(Integer.valueOf(0))).copyLocationFrom(target));
+                sourceExpr = ((ASTExpression) new ASTExpDynamicKeyName(target, 
new ASTExpNumberLiteral(0))
+                        .copyLocationFrom(target));
                 if (((TemplateSequenceModel) model).size() > 1) {
-                    id = ((ASTExpression) new ASTExpDynamicKeyName(target, new 
ASTExpNumberLiteral(Integer.valueOf(1))).copyLocationFrom(target)).evalAndCoerceToPlainText(env);
+                    id = ((ASTExpression) new ASTExpDynamicKeyName(target, new 
ASTExpNumberLiteral(1))
+                            
.copyLocationFrom(target)).evalAndCoerceToPlainText(env);
                 }
             } else if (model instanceof TemplateScalarModel) {
                 sourceExpr = target;
@@ -252,12 +254,12 @@ class BuiltInsForStringsMisc {
             return new 
ConstructorFunction(target.evalAndCoerceToPlainText(env), env, 
target.getTemplate());
         }
 
-        class ConstructorFunction implements TemplateMethodModelEx {
+        class ConstructorFunction implements TemplateMethodModel {
 
             private final Class<?> cl;
             private final Environment env;
             
-            public ConstructorFunction(String classname, Environment env, 
Template template) throws TemplateException {
+            ConstructorFunction(String classname, Environment env, Template 
template) throws TemplateException {
                 this.env = env;
                 cl = env.getNewBuiltinClassResolver().resolve(classname, env, 
template);
                 if (!TemplateModel.class.isAssignableFrom(cl)) {
@@ -271,13 +273,13 @@ class BuiltInsForStringsMisc {
             }
 
             @Override
-            public Object exec(List arguments) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
                 ObjectWrapper ow = env.getObjectWrapper();
                 if (ow instanceof DefaultObjectWrapper) {
-                    return ((DefaultObjectWrapper) ow).newInstance(cl, 
arguments);
+                    return ow.wrap(((DefaultObjectWrapper) ow).newInstance(cl, 
args));
                 }
 
-                if (!arguments.isEmpty()) {
+                if (!args.isEmpty()) {
                     throw new TemplateModelException(
                             "className?new(args) only supports 0 arguments in 
the current configuration, because "
                             + " the objectWrapper setting value is not a "
@@ -285,7 +287,7 @@ class BuiltInsForStringsMisc {
                             " (or its subclass).");
                 }
                 try {
-                    return cl.newInstance();
+                    return ow.wrap(cl.newInstance());
                 } catch (Exception e) {
                     throw new TemplateModelException("Failed to instantiate "
                             + cl.getName() + " with its parameterless 
constructor; see cause exception", e);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java
index 0420d64..025b599 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/BuiltInsForStringsRegexp.java
@@ -70,12 +70,14 @@ class BuiltInsForStringsRegexp {
             }
             
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 1, 2);
                 
-                String patternString = (String) args.get(0);
-                long flags = argCnt > 1 ? 
RegexpHelper.parseFlagString((String) args.get(1)) : 0;
+                String patternString = _CallableUtils.castArgToString(args, 0);
+                long flags = argCnt > 1
+                        ? 
RegexpHelper.parseFlagString(_CallableUtils.castArgToString(args, 1))
+                        : 0;
                 if ((flags & RegexpHelper.RE_FLAG_FIRST_ONLY) != 0) {
                     RegexpHelper.logFlagWarning("?" + key + " doesn't support 
the \"f\" flag.");
                 }
@@ -101,12 +103,14 @@ class BuiltInsForStringsRegexp {
             }
 
             @Override
-            public Object exec(List args) throws TemplateModelException {
+            public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateException {
                 int argCnt = args.size();
                 checkMethodArgCount(argCnt, 2, 3);
-                String arg1 = (String) args.get(0);
-                String arg2 = (String) args.get(1);
-                long flags = argCnt > 2 ? 
RegexpHelper.parseFlagString((String) args.get(2)) : 0;
+                String arg1 = _CallableUtils.castArgToString(args, 0);
+                String arg2 = _CallableUtils.castArgToString(args, 1);
+                long flags = argCnt > 2
+                        ? 
RegexpHelper.parseFlagString(_CallableUtils.castArgToString(args, 2))
+                        : 0;
                 String result;
                 if ((flags & RegexpHelper.RE_FLAG_REGEXP) == 0) {
                     RegexpHelper.checkNonRegexpFlags("replace", flags);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java 
b/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java
index 25ea39d..ee212db 100644
--- a/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java
+++ b/freemarker-core/src/main/java/org/apache/freemarker/core/Environment.java
@@ -581,7 +581,7 @@ public final class Environment extends 
MutableProcessingConfiguration<Environmen
         try {
             TemplateDirectiveModel nodeProcessor = getNodeProcessor(node);
             if (nodeProcessor != null) {
-                _TemplateCallableModelUtils.executeWith0Arguments(
+                _CallableUtils.executeWith0Arguments(
                         nodeProcessor, NonTemplateCallPlace.INSTANCE, out, 
this);
             } else if (nodeProcessor == null) {
                 String nodeType = node.getNodeType();
@@ -640,7 +640,7 @@ public final class Environment extends 
MutableProcessingConfiguration<Environmen
     void fallback() throws TemplateException, IOException {
         TemplateDirectiveModel nodeProcessor = 
getNodeProcessor(currentNodeName, currentNodeNS, nodeNamespaceIndex);
         if (nodeProcessor != null) {
-            _TemplateCallableModelUtils.executeWith0Arguments(
+            _CallableUtils.executeWith0Arguments(
                     nodeProcessor, NonTemplateCallPlace.INSTANCE, out, this);
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/NonStringException.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/NonStringException.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/NonStringException.java
index c8cbc6d..6cf29f4 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/NonStringException.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/NonStringException.java
@@ -19,6 +19,8 @@
 
 package org.apache.freemarker.core;
 
+import java.io.Serializable;
+
 import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateModel;
@@ -37,7 +39,9 @@ public class NonStringException extends 
UnexpectedTypeException {
     static final Class[] STRING_COERCABLE_TYPES = new Class[] {
         TemplateScalarModel.class, TemplateNumberModel.class, 
TemplateDateModel.class, TemplateBooleanModel.class
     };
-    
+
+    private static final Class<?>[] EXPECTED_TYPES = { 
TemplateScalarModel.class };
+
     private static final String DEFAULT_DESCRIPTION
             = "Expecting " + NonStringException.STRING_COERCABLE_TYPES_DESC + 
" value here";
 
@@ -70,5 +74,11 @@ public class NonStringException extends 
UnexpectedTypeException {
             ASTExpression blamed, TemplateModel model, String[] tips, 
Environment env) throws InvalidReferenceException {
         super(blamed, model, NonStringException.STRING_COERCABLE_TYPES_DESC, 
STRING_COERCABLE_TYPES, tips, env);
     }
-        
+
+    NonStringException(
+            Serializable argumentNameOrIndex, TemplateModel model, String[] 
tips, Environment env)
+            throws InvalidReferenceException {
+        super(argumentNameOrIndex, model, "string", EXPECTED_TYPES, tips, env);
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/_CallableUtils.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/_CallableUtils.java 
b/freemarker-core/src/main/java/org/apache/freemarker/core/_CallableUtils.java
new file mode 100644
index 0000000..0a69e51
--- /dev/null
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/_CallableUtils.java
@@ -0,0 +1,156 @@
+/*
+ * 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;
+
+import java.io.IOException;
+import java.io.Serializable;
+import java.io.Writer;
+import java.util.List;
+
+import org.apache.freemarker.core.model.ArgumentArrayLayout;
+import org.apache.freemarker.core.model.Constants;
+import org.apache.freemarker.core.model.TemplateCallableModel;
+import org.apache.freemarker.core.model.TemplateDirectiveModel;
+import org.apache.freemarker.core.model.TemplateFunctionModel;
+import org.apache.freemarker.core.model.TemplateModel;
+import org.apache.freemarker.core.model.TemplateNumberModel;
+import org.apache.freemarker.core.model.TemplateScalarModel;
+
+/**
+ * For internal use only; don't depend on this, there's no backward 
compatibility guarantee at all!
+ */
+// TODO [FM3] Most functionality here should be made public on some way. Also 
BuiltIn-s has some duplicates utiltity
+// methods for this functionality (checking arguments). Need to clean this up.
+public final class _CallableUtils {
+
+    private _CallableUtils() {
+        //
+    }
+
+    public static void executeWith0Arguments(
+            TemplateDirectiveModel directive, CallPlace callPlace, Writer out, 
Environment env)
+            throws IOException, TemplateException {
+        directive.execute(getArgumentArrayWithNoArguments(directive), 
callPlace, out, env);
+    }
+
+    public static TemplateModel executeWith0Arguments(
+            TemplateFunctionModel function, CallPlace callPlace, Environment 
env)
+            throws TemplateException {
+        return function.execute(getArgumentArrayWithNoArguments(function), 
callPlace, env);
+    }
+
+    private static TemplateModel[] 
getArgumentArrayWithNoArguments(TemplateCallableModel callable) {
+        ArgumentArrayLayout argsLayout = callable.getArgumentArrayLayout();
+        int totalLength = argsLayout.getTotalLength();
+        if (totalLength == 0) {
+            return Constants.EMPTY_TEMPLATE_MODEL_ARRAY;
+        } else {
+            TemplateModel[] args = new TemplateModel[totalLength];
+
+            int positionalVarargsArgumentIndex = 
argsLayout.getPositionalVarargsArgumentIndex();
+            if (positionalVarargsArgumentIndex != -1) {
+                args[positionalVarargsArgumentIndex] = 
Constants.EMPTY_SEQUENCE;
+            }
+
+            int namedVarargsArgumentIndex = 
argsLayout.getNamedVarargsArgumentIndex();
+            if (namedVarargsArgumentIndex != -1) {
+                args[namedVarargsArgumentIndex] = Constants.EMPTY_SEQUENCE;
+            }
+            
+            return args;
+        }
+    }
+
+    public static Number castArgToNumber(TemplateModel[] args, int argIndex, 
boolean allowNull)
+            throws TemplateException {
+        return castArgToNumber(args[argIndex], argIndex, allowNull);
+    }
+
+    public static Number castArgToNumber(TemplateModel argValue, int argIndex, 
boolean allowNull)
+            throws TemplateException {
+        return castArgToNumber(argValue, null, argIndex, allowNull);
+    }
+
+    public static Number castArgToNumber(TemplateModel argValue, String 
argName, boolean allowNull)
+            throws TemplateException {
+        return castArgToNumber(argValue, argName, -1, allowNull);
+    }
+
+    private static Number castArgToNumber(TemplateModel argValue, String 
argName, int argIndex, boolean allowNull)
+            throws TemplateException {
+        if (argValue instanceof TemplateNumberModel) {
+            return ((TemplateNumberModel) argValue).getAsNumber();
+        }
+        if (argValue == null) {
+            if (allowNull) {
+                return null;
+            }
+            throw new _MiscTemplateException(
+                    "The ", argName != null ? new _DelayedJQuote(argName) : 
new _DelayedOrdinal(argIndex + 1),
+                    " argument can't be null.");
+        }
+        throw new NonNumericalException((Serializable) argName != null ? 
argName : argIndex, argValue, null, null);
+    }
+    
+    //
+
+    public static String castArgToString(List<? extends TemplateModel> args, 
int argIndex) throws TemplateException {
+        return castArgToString(args, argIndex, false);
+    }
+
+    public static String castArgToString(List<? extends TemplateModel> args, 
int argIndex, boolean allowNull) throws
+            TemplateException {
+        return castArgToString(args.get(argIndex), argIndex, allowNull);
+    }
+
+    public static String castArgToString(TemplateModel[] args, int argIndex, 
boolean allowNull) throws TemplateException {
+        return castArgToString(args[argIndex], argIndex, allowNull);
+    }
+
+    public static String castArgToString(TemplateModel argValue, int argIndex) 
throws TemplateException {
+        return castArgToString(argValue, argIndex, false);
+    }
+
+    public static String castArgToString(TemplateModel argValue, int argIndex, 
boolean allowNull) throws TemplateException {
+        return castArgToString(argValue, null, argIndex, allowNull);
+    }
+
+    public static String castArgToString(TemplateModel argValue, String 
argName, boolean allowNull) throws TemplateException {
+        return castArgToString(argValue, argName, -1, allowNull);
+    }
+
+    private static String castArgToString(
+            TemplateModel argValue, String argName, int argIndex,
+            boolean allowNull) throws TemplateException {
+        if (argValue instanceof TemplateScalarModel) {
+            return _EvalUtil.modelToString((TemplateScalarModel) argValue, 
null, null);
+        }
+        if (argValue == null) {
+            if (allowNull) {
+                return null;
+            }
+            throw new _MiscTemplateException(
+                    "The ", argName != null ? new _DelayedJQuote(argName) : 
new _DelayedOrdinal(argIndex + 1),
+                    " argument can't be null.");
+        }
+        throw new NonStringException((Serializable) argName != null ? argName 
: argIndex, argValue, null, null);
+    }
+    
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
index 3ff249a..d2fe617 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/_ObjectBuilderSettingEvaluator.java
@@ -36,7 +36,7 @@ import java.util.Map;
 import java.util.Properties;
 
 import org.apache.freemarker.core.model.TemplateHashModel;
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
+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.impl.DefaultObjectWrapper;
@@ -763,13 +763,13 @@ public class _ObjectBuilderSettingEvaluator {
                     throw new _ObjectBuilderSettingEvaluationException(
                             "Can't find " + beanPropSetter + " as FreeMarker 
method.");
                 }
-                if (!(m instanceof TemplateMethodModelEx)) {
+                if (!(m instanceof TemplateMethodModel)) {
                     throw new _ObjectBuilderSettingEvaluationException(
-                            _StringUtil.jQuote(beanPropSetter.getName()) + " 
wasn't a TemplateMethodModelEx.");
+                            _StringUtil.jQuote(beanPropSetter.getName()) + " 
wasn't a TemplateMethodModel.");
                 }
                 List/*TemplateModel*/ args = new ArrayList();
                 args.add(env.getObjectWrapper().wrap(namedParamValues.get(i)));
-                ((TemplateMethodModelEx) m).exec(args);
+                ((TemplateMethodModel) m).execute(args);
             } catch (Exception e) {
                 throw new _ObjectBuilderSettingEvaluationException(
                         "Failed to set " + _StringUtil.jQuote(name), e);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/_TemplateCallableModelUtils.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/_TemplateCallableModelUtils.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/_TemplateCallableModelUtils.java
deleted file mode 100644
index 277dc1a..0000000
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/_TemplateCallableModelUtils.java
+++ /dev/null
@@ -1,112 +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;
-
-import java.io.IOException;
-import java.io.Writer;
-
-import org.apache.freemarker.core.model.ArgumentArrayLayout;
-import org.apache.freemarker.core.model.Constants;
-import org.apache.freemarker.core.model.TemplateCallableModel;
-import org.apache.freemarker.core.model.TemplateDirectiveModel;
-import org.apache.freemarker.core.model.TemplateFunctionModel;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateNumberModel;
-
-/**
- * For internal use only; don't depend on this, there's no backward 
compatibility guarantee at all!
- */
-// TODO [FM3] Most functionality here should be made public on some way
-public final class _TemplateCallableModelUtils {
-
-    private _TemplateCallableModelUtils() {
-        //
-    }
-
-    public static void executeWith0Arguments(
-            TemplateDirectiveModel directive, CallPlace callPlace, Writer out, 
Environment env)
-            throws IOException, TemplateException {
-        directive.execute(getArgumentArrayWithNoArguments(directive), 
callPlace, out, env);
-    }
-
-    public static TemplateModel executeWith0Arguments(
-            TemplateFunctionModel function, CallPlace callPlace, Environment 
env)
-            throws TemplateException {
-        return function.execute(getArgumentArrayWithNoArguments(function), 
callPlace, env);
-    }
-
-    private static TemplateModel[] 
getArgumentArrayWithNoArguments(TemplateCallableModel callable) {
-        ArgumentArrayLayout argsLayout = callable.getArgumentArrayLayout();
-        int totalLength = argsLayout.getTotalLength();
-        if (totalLength == 0) {
-            return Constants.EMPTY_TEMPLATE_MODEL_ARRAY;
-        } else {
-            TemplateModel[] args = new TemplateModel[totalLength];
-
-            int positionalVarargsArgumentIndex = 
argsLayout.getPositionalVarargsArgumentIndex();
-            if (positionalVarargsArgumentIndex != -1) {
-                args[positionalVarargsArgumentIndex] = 
Constants.EMPTY_SEQUENCE;
-            }
-
-            int namedVarargsArgumentIndex = 
argsLayout.getNamedVarargsArgumentIndex();
-            if (namedVarargsArgumentIndex != -1) {
-                args[namedVarargsArgumentIndex] = Constants.EMPTY_SEQUENCE;
-            }
-            
-            return args;
-        }
-    }
-
-    public static TemplateNumberModel castArgumentToNumber(TemplateModel[] 
args, int argIndex, boolean allowNull,
-            Environment env) throws TemplateException {
-        return getTemplateNumberModel(args[argIndex], argIndex, allowNull, 
env);
-    }
-
-    private static TemplateNumberModel getTemplateNumberModel(TemplateModel 
argValue, int argIndex, boolean allowNull,
-            Environment env) throws TemplateException {
-        if (argValue instanceof TemplateNumberModel) {
-            return (TemplateNumberModel) argValue;
-        }
-        if (argValue == null) {
-            if (allowNull) {
-                return null;
-            }
-            throw new _MiscTemplateException(env,
-                    "The ", new _DelayedOrdinal(argIndex + 1), " argument 
can't be null.");
-        }
-        throw new NonNumericalException(argIndex, argValue, null, env);
-    }
-
-    public static TemplateNumberModel castArgumentToNumber(TemplateModel 
argValue, String argName, boolean allowNull,
-            Environment env) throws TemplateException {
-        if (argValue instanceof TemplateNumberModel) {
-            return (TemplateNumberModel) argValue;
-        }
-        if (argValue == null) {
-            if (allowNull) {
-                return null;
-            }
-            throw new _MiscTemplateException(env,
-                    "The ", new _DelayedJQuote(argName), " argument can't be 
null.");
-        }
-        throw new NonNumericalException(argName, argValue, null, env);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java
index 0158bd9..1c6bc66 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/DebugModel.java
@@ -46,7 +46,6 @@ public interface DebugModel extends Remote {
     public static final int TYPE_HASH          =   64;
     public static final int TYPE_HASH_EX       =  128;
     public static final int TYPE_METHOD        =  256;
-    public static final int TYPE_METHOD_EX     =  512;
     public static final int TYPE_DIRECTIVE     = 1024;
     public static final int TYPE_ENVIRONMENT   = 2048;
     public static final int TYPE_TEMPLATE      = 4096;

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java
index e8e8cf1..7ab7ec7 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/debug/RmiDebugModelImpl.java
@@ -32,7 +32,6 @@ 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.TemplateMethodModelEx;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateModelException;
 import org.apache.freemarker.core.model.TemplateModelIterator;
@@ -155,9 +154,8 @@ class RmiDebugModelImpl extends UnicastRemoteObject 
implements DebugModel {
         if (model instanceof TemplateSequenceModel) type += TYPE_SEQUENCE;
         if (model instanceof TemplateCollectionModel) type += TYPE_COLLECTION;
         if (model instanceof TemplateHashModelEx) type += TYPE_HASH_EX;
-        else if (model instanceof TemplateHashModel) type += TYPE_HASH;
-        if (model instanceof TemplateMethodModelEx) type += TYPE_METHOD_EX;
-        else if (model instanceof TemplateMethodModel) type += TYPE_METHOD;
+        if (model instanceof TemplateHashModel) type += TYPE_HASH;
+        if (model instanceof TemplateMethodModel) type += TYPE_METHOD;
         if (model instanceof TemplateDirectiveModel) type += TYPE_DIRECTIVE;
         return type;
     }

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java
index da1c102..92b0b58 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/GeneralPurposeNothing.java
@@ -28,7 +28,7 @@ import java.util.List;
  */
 
 final class GeneralPurposeNothing
-implements TemplateBooleanModel, TemplateScalarModel, TemplateSequenceModel, 
TemplateHashModelEx, TemplateMethodModelEx {
+implements TemplateBooleanModel, TemplateScalarModel, TemplateSequenceModel, 
TemplateHashModelEx, TemplateMethodModel {
 
     public static final TemplateModel INSTANCE = new GeneralPurposeNothing();
       
@@ -66,7 +66,7 @@ implements TemplateBooleanModel, TemplateScalarModel, 
TemplateSequenceModel, Tem
     }
 
     @Override
-    public Object exec(List args) {
+    public TemplateModel execute(List<? extends TemplateModel> args) {
         return null;
     }
     

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModel.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModel.java
index 5bfe7e3..c35a500 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModel.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModel.java
@@ -17,44 +17,37 @@
  * under the License.
  */
 
-/*
- * 22 October 1999: This class added by Holger Arendt.
- */
-
 package org.apache.freemarker.core.model;
 
 import java.util.List;
 
 import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
+import org.apache.freemarker.core.util.DeepUnwrap;
 
 /**
- * "method" template language data type: Objects that act like functions. The 
name comes from that their original
- * application was calling Java methods via {@link 
org.apache.freemarker.core.model.impl.DefaultObjectWrapper}.
- * 
- * <p>In templates they are used like {@code myMethod("foo", "bar")} or {@code 
myJavaObject.myJavaMethod("foo", "bar")}. 
+ * "method" template language data type: Objects that act like functions. 
Their main application is calling
+ * Java methods via {@link 
org.apache.freemarker.core.model.impl.DefaultObjectWrapper}, but you can 
implement this
+ * interface to invoke top-level functions too.
  * 
- * @deprecated Use {@link TemplateMethodModelEx} instead. This interface is 
from the old times when the only kind of
- *    value you could pass in was string.
+ * <p>In templates they are used like {@code myMethod(1, "foo")} or {@code 
myJavaObject.myJavaMethod(1, "foo")}.
  */
-@Deprecated
 public interface TemplateMethodModel extends TemplateModel {
 
     /**
-     * Executes the method call. All arguments passed to the method call are 
-     * coerced to strings before being passed, if the FreeMarker rules allow
-     * the coercion. If some of the passed arguments can not be coerced to a
-     * string, an exception will be raised in the engine and the method will 
-     * not be called. If your method would like to act on actual data model 
-     * objects instead of on their string representations, implement the 
-     * {@link TemplateMethodModelEx} instead.
-     * 
-     * @param arguments a <tt>List</tt> of <tt>String</tt> objects
-     *     containing the values of the arguments passed to the method.
+     * Executes the method call.
      *  
+     * @param args a {@link List} of {@link TemplateModel}-s,
+     *     containing the arguments passed to the method. If the 
implementation absolutely wants
+     *     to operate on POJOs, it can use the static utility methods in the 
{@link DeepUnwrap}
+     *     class to easily obtain them. However, unwrapping is not always 
possible (or not perfectly), and isn't always
+     *     efficient, so it's recommended to use the original {@link 
TemplateModel} value as much as possible.
+     *
      * @return the return value of the method, or {@code null}. If the 
returned value
      *     does not implement {@link TemplateModel}, it will be automatically 
-     *     wrapped using the {@link Environment#getObjectWrapper() environment 
+     *     wrapped using the {@link Environment#getObjectWrapper() 
environment's 
      *     object wrapper}.
      */
-    Object exec(List arguments) throws TemplateModelException;
-}
+    TemplateModel execute(List<? extends TemplateModel> args) throws 
TemplateException;
+    
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModelEx.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModelEx.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModelEx.java
deleted file mode 100644
index 2517d22..0000000
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/TemplateMethodModelEx.java
+++ /dev/null
@@ -1,54 +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.model;
-
-import java.util.List;
-
-import org.apache.freemarker.core.Environment;
-import org.apache.freemarker.core.util.DeepUnwrap;
-
-/**
- * "extended method" template language data type: Objects that act like 
functions. Their main application is calling
- * Java methods via {@link 
org.apache.freemarker.core.model.impl.DefaultObjectWrapper}, but you can 
implement this interface to invoke
- * top-level functions too. They are "extended" compared to the deprecated 
{@link TemplateMethodModel}, which could only
- * accept string parameters.
- * 
- * <p>In templates they are used like {@code myMethod(1, "foo")} or {@code 
myJavaObject.myJavaMethod(1, "foo")}.
- */
-public interface TemplateMethodModelEx extends TemplateMethodModel {
-
-    /**
-     * Executes the method call.
-     *  
-     * @param arguments a {@link List} of {@link TemplateModel}-s,
-     *     containing the arguments passed to the method. If the 
implementation absolutely wants 
-     *     to operate on POJOs, it can use the static utility methods in the 
{@link DeepUnwrap} 
-     *     class to easily obtain them. However, unwrapping is not always 
possible (or not perfectly), and isn't always
-     *     efficient, so it's recommended to use the original {@link 
TemplateModel} value as much as possible.
-     *      
-     * @return the return value of the method, or {@code null}. If the 
returned value
-     *     does not implement {@link TemplateModel}, it will be automatically 
-     *     wrapped using the {@link Environment#getObjectWrapper() 
environment's 
-     *     object wrapper}.
-     */
-    @Override
-    Object exec(List arguments) throws TemplateModelException;
-    
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java
index aa2f2f1..bc7ce67 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/BeanModel.java
@@ -38,6 +38,7 @@ import org.apache.freemarker.core._TemplateModelException;
 import org.apache.freemarker.core.model.AdapterTemplateModel;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 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.TemplateModelIterator;
@@ -105,7 +106,7 @@ public class BeanModel
     /**
      * Uses Beans introspection to locate a property or method with name
      * matching the key name. If a method or property is found, it's wrapped
-     * into {@link org.apache.freemarker.core.model.TemplateMethodModelEx} 
(for a method or
+     * into {@link TemplateMethodModel} (for a method or
      * indexed property), or evaluated on-the-fly and the return value wrapped
      * into appropriate model (for a simple property) Models for various
      * properties and methods are cached on a per-class basis, so the costly

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java
index e4436e9..1a0e251 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/DefaultObjectWrapper.java
@@ -56,7 +56,7 @@ import org.apache.freemarker.core.model.TemplateBooleanModel;
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 import org.apache.freemarker.core.model.TemplateDateModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
+import org.apache.freemarker.core.model.TemplateMethodModel;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateModelAdapter;
 import org.apache.freemarker.core.model.TemplateModelException;
@@ -481,7 +481,7 @@ public class DefaultObjectWrapper implements 
RichObjectWrapper {
      * Wraps a Java method so that it can be called from templates, without 
wrapping its parent ("this") object. The
      * result is almost the same as that you would get by wrapping the parent 
object then getting the method from the
      * resulting {@link TemplateHashModel} by name. Except, if the wrapped 
method is overloaded, with this method you
-     * explicitly select a an overload, while otherwise you would get a {@link 
TemplateMethodModelEx} that selects an
+     * explicitly select a an overload, while otherwise you would get a {@link 
TemplateMethodModel} that selects an
      * overload each time it's called based on the argument values.
      *
      * @param object The object whose method will be called, or {@code null} 
if {@code method} is a static method.
@@ -489,7 +489,7 @@ public class DefaultObjectWrapper implements 
RichObjectWrapper {
      * @param method The method to call, which must be an (inherited) member 
of the class of {@code object}, as
      *          described by {@link Method#invoke(Object, Object...)}
      */
-    public TemplateMethodModelEx wrap(Object object, Method method) {
+    public TemplateMethodModel wrap(Object object, Method method) {
         return new JavaMethodModel(object, method, method.getParameterTypes(), 
this);
     }
 
@@ -582,7 +582,7 @@ public class DefaultObjectWrapper implements 
RichObjectWrapper {
         // This is for transparent interop with other wrappers (and ourselves)
         // Passing the targetClass allows e.g. a Jython-aware method that 
declares a
         // PyObject as its argument to receive a PyObject from a Jython-aware 
TemplateModel
-        // passed as an argument to TemplateMethodModelEx etc.
+        // passed as an argument to TemplateMethodModel etc.
         if (model instanceof AdapterTemplateModel) {
             Object wrapped = ((AdapterTemplateModel) 
model).getAdaptedObject(targetClass);
             if (targetClass == Object.class || 
targetClass.isInstance(wrapped)) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/JavaMethodModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/JavaMethodModel.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/JavaMethodModel.java
index 6408117..f89952e 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/JavaMethodModel.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/JavaMethodModel.java
@@ -24,14 +24,15 @@ import java.lang.reflect.Method;
 import java.util.List;
 
 import org.apache.freemarker.core._UnexpectedTypeErrorExplainerTemplateModel;
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
+import org.apache.freemarker.core.model.TemplateMethodModel;
+import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
- * Wraps a {@link Method} into the {@link TemplateMethodModelEx} interface. It 
is used by {@link BeanModel} to wrap
+ * Wraps a {@link Method} into the {@link TemplateMethodModel} interface. It 
is used by {@link BeanModel} to wrap
  * non-overloaded methods.
  */
-public final class JavaMethodModel extends SimpleMethod implements 
TemplateMethodModelEx,
+public final class JavaMethodModel extends SimpleMethod implements 
TemplateMethodModel,
         _UnexpectedTypeErrorExplainerTemplateModel {
     private final Object object;
     private final DefaultObjectWrapper wrapper;
@@ -53,10 +54,10 @@ public final class JavaMethodModel extends SimpleMethod 
implements TemplateMetho
      * Invokes the method, passing it the arguments from the list.
      */
     @Override
-    public Object exec(List arguments) throws TemplateModelException {
+    public TemplateModel execute(List<? extends TemplateModel> args) throws 
TemplateModelException {
         try {
             return wrapper.invokeMethod(object, (Method) getMember(), 
-                    unwrapArguments(arguments, wrapper));
+                    unwrapArguments(args, wrapper));
         } catch (TemplateModelException e) {
             throw e;
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsModel.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsModel.java
index 9a66a6d..72ca642 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsModel.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/OverloadedMethodsModel.java
@@ -23,14 +23,14 @@ package org.apache.freemarker.core.model.impl;
 import java.util.List;
 
 import org.apache.freemarker.core.model.TemplateMethodModel;
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
+import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateModelException;
 
 /**
  * Wraps a set of same-name overloaded methods behind {@link 
TemplateMethodModel} interface,
  * like if it was a single method, chooses among them behind the scenes on 
call-time based on the argument values.
  */
-class OverloadedMethodsModel implements TemplateMethodModelEx {
+class OverloadedMethodsModel implements TemplateMethodModel {
     private final Object object;
     private final OverloadedMethods overloadedMethods;
     private final DefaultObjectWrapper wrapper;
@@ -49,8 +49,8 @@ class OverloadedMethodsModel implements TemplateMethodModelEx 
{
      * unambiguously.
      */
     @Override
-    public Object exec(List arguments) throws TemplateModelException {
-        MemberAndArguments maa = 
overloadedMethods.getMemberAndArguments(arguments, wrapper);
+    public TemplateModel execute(List<? extends TemplateModel> args) throws 
TemplateModelException {
+        MemberAndArguments maa = overloadedMethods.getMemberAndArguments(args, 
wrapper);
         try {
             return maa.invokeMethod(wrapper, object);
         } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java
index 31af451..457c7ef 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/ResourceBundleModel.java
@@ -31,7 +31,7 @@ import java.util.Set;
 
 import org.apache.freemarker.core._DelayedJQuote;
 import org.apache.freemarker.core._TemplateModelException;
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
+import org.apache.freemarker.core.model.TemplateMethodModel;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateModelException;
 
@@ -54,9 +54,9 @@ public class ResourceBundleModel
     extends
     BeanModel
     implements
-    TemplateMethodModelEx {
+        TemplateMethodModel {
 
-    private Hashtable formats = null;
+    private Hashtable<String, MessageFormat> formats = null;
 
     public ResourceBundleModel(ResourceBundle bundle, DefaultObjectWrapper 
wrapper) {
         super(bundle, wrapper);
@@ -108,13 +108,13 @@ public class ResourceBundleModel
      * rest of the arguments. The created MessageFormats are cached for later 
reuse.
      */
     @Override
-    public Object exec(List arguments)
+    public TemplateModel execute(List<? extends TemplateModel> args)
         throws TemplateModelException {
         // Must have at least one argument - the key
-        if (arguments.size() < 1)
+        if (args.size() < 1)
             throw new TemplateModelException("No message key was specified");
         // Read it
-        Iterator it = arguments.iterator();
+        Iterator<? extends TemplateModel> it = args.iterator();
         String key = unwrap((TemplateModel) it.next()).toString();
         try {
             if (!it.hasNext()) {
@@ -122,10 +122,10 @@ public class ResourceBundleModel
             }
     
             // Copy remaining arguments into an Object[]
-            int args = arguments.size() - 1;
-            Object[] params = new Object[args];
-            for (int i = 0; i < args; ++i)
-                params[i] = unwrap((TemplateModel) it.next());
+            int paramsLen = args.size() - 1;
+            Object[] params = new Object[paramsLen];
+            for (int i = 0; i < paramsLen; ++i)
+                params[i] = unwrap(it.next());
     
             // Invoke format
             return new BeanAndStringModel(format(key, params), wrapper);

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java
index 8a7f082..9c4db4e 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/StaticModel.java
@@ -28,6 +28,7 @@ import java.util.Map;
 
 import org.apache.freemarker.core.model.TemplateCollectionModel;
 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.slf4j.Logger;
@@ -37,7 +38,7 @@ import org.slf4j.LoggerFactory;
  * Wraps the static fields and methods of a class in a
  * {@link org.apache.freemarker.core.model.TemplateHashModel}.
  * Fields are wrapped using {@link DefaultObjectWrapper#wrap(Object)}, and
- * methods are wrapped into an appropriate {@link 
org.apache.freemarker.core.model.TemplateMethodModelEx} instance.
+ * methods are wrapped into an appropriate {@link TemplateMethodModel} 
instance.
  * Unfortunately, there is currently no support for bean property-style
  * calls of static methods, similar to that in {@link BeanModel}.
  */

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java
----------------------------------------------------------------------
diff --git 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java
 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java
index b049c63..2394394 100644
--- 
a/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java
+++ 
b/freemarker-core/src/main/java/org/apache/freemarker/core/model/impl/TemplateModelListSequence.java
@@ -21,13 +21,13 @@ package org.apache.freemarker.core.model.impl;
 
 import java.util.List;
 
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
+import org.apache.freemarker.core.model.TemplateMethodModel;
 import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateSequenceModel;
 
 /**
  * A sequence that wraps a {@link List} of {@link TemplateModel}-s. It does 
not copy the original
- * list. It's mostly useful when implementing {@link TemplateMethodModelEx}-es 
that collect items from other
+ * list. It's mostly useful when implementing {@link TemplateMethodModel}-es 
that collect items from other
  * {@link TemplateModel}-s.
  */
 public class TemplateModelListSequence implements TemplateSequenceModel {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/CustomTagAndELFunctionCombiner.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/CustomTagAndELFunctionCombiner.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/CustomTagAndELFunctionCombiner.java
index fb63309..ff9db12 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/CustomTagAndELFunctionCombiner.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/CustomTagAndELFunctionCombiner.java
@@ -28,7 +28,7 @@ import 
org.apache.freemarker.core._UnexpectedTypeErrorExplainerTemplateModel;
 import org.apache.freemarker.core.model.ArgumentArrayLayout;
 import org.apache.freemarker.core.CallPlace;
 import org.apache.freemarker.core.model.TemplateDirectiveModel;
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
+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.impl.JavaMethodModel;
@@ -47,7 +47,7 @@ class CustomTagAndELFunctionCombiner {
      * @param customTag
      *            A {@link TemplateDirectiveModel}.
      */
-    static TemplateModel combine(TemplateModel customTag, 
TemplateMethodModelEx elFunction) {
+    static TemplateModel combine(TemplateModel customTag, TemplateMethodModel 
elFunction) {
         if (customTag instanceof TemplateDirectiveModel) {
             return elFunction instanceof JavaMethodModel //
                     ? new TemplateDirectiveModelAndSimpleMethodModel( //
@@ -62,7 +62,7 @@ class CustomTagAndELFunctionCombiner {
 
     /**
      * Tells if the value can be used as the "custom tag" parameter to
-     * {@link #combine(TemplateModel, TemplateMethodModelEx)}.
+     * {@link #combine(TemplateModel, TemplateMethodModel)}.
      */
     static boolean canBeCombinedAsCustomTag(TemplateModel tm) {
         return (tm instanceof TemplateDirectiveModel) && !(tm instanceof 
CombinedTemplateModel);
@@ -70,10 +70,10 @@ class CustomTagAndELFunctionCombiner {
 
     /**
      * Tells if the value can be used as the "EL function" parameter to
-     * {@link #combine(TemplateModel, TemplateMethodModelEx)}.
+     * {@link #combine(TemplateModel, TemplateMethodModel)}.
      */
     static boolean canBeCombinedAsELFunction(TemplateModel tm) {
-        return tm instanceof TemplateMethodModelEx && !(tm instanceof 
CombinedTemplateModel);
+        return tm instanceof TemplateMethodModel && !(tm instanceof 
CombinedTemplateModel);
     }
 
     private static class CombinedTemplateModel {
@@ -81,7 +81,7 @@ class CustomTagAndELFunctionCombiner {
     }
 
     private static class TemplateDirectiveModelAndSimpleMethodModel extends 
CombinedTemplateModel
-            implements TemplateDirectiveModel, TemplateMethodModelEx,
+            implements TemplateDirectiveModel, TemplateMethodModel,
             _UnexpectedTypeErrorExplainerTemplateModel {
 
         private final TemplateDirectiveModel templateDirectiveModel;
@@ -94,8 +94,8 @@ class CustomTagAndELFunctionCombiner {
         }
 
         @Override
-        public Object exec(List arguments) throws TemplateModelException {
-            return simpleMethodModel.exec(arguments);
+        public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
+            return simpleMethodModel.execute(args);
         }
 
         @Override
@@ -121,20 +121,20 @@ class CustomTagAndELFunctionCombiner {
     }
 
     private static class TemplateDirectiveModelAndTemplateMethodModelEx 
extends CombinedTemplateModel
-            implements TemplateDirectiveModel, TemplateMethodModelEx {
+            implements TemplateDirectiveModel, TemplateMethodModel {
 
         private final TemplateDirectiveModel templateDirectiveModel;
-        private final TemplateMethodModelEx templateMethodModelEx;
+        private final TemplateMethodModel templateMethodModelEx;
 
         public TemplateDirectiveModelAndTemplateMethodModelEx( //
-                TemplateDirectiveModel templateDirectiveModel, 
TemplateMethodModelEx templateMethodModelEx) {
+                TemplateDirectiveModel templateDirectiveModel, 
TemplateMethodModel templateMethodModelEx) {
             this.templateDirectiveModel = templateDirectiveModel;
             this.templateMethodModelEx = templateMethodModelEx;
         }
 
         @Override
-        public Object exec(List arguments) throws TemplateModelException {
-            return templateMethodModelEx.exec(arguments);
+        public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateException {
+            return templateMethodModelEx.execute(args);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
index 606cef8..98634bd 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TaglibFactory.java
@@ -66,7 +66,7 @@ import org.apache.freemarker.core.Environment;
 import org.apache.freemarker.core.model.ObjectWrapper;
 import org.apache.freemarker.core.model.TemplateDirectiveModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
+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.impl.DefaultObjectWrapper;
@@ -233,7 +233,7 @@ public class TaglibFactory implements TemplateHashModel {
      * 
      * @return a {@link TemplateHashModel} representing the JSP taglib. Each 
element of this hash represents a single
      *         custom tag or EL function from the library, implemented as a 
{@link TemplateDirectiveModel} or
-     *         {@link TemplateMethodModelEx}, respectively.
+     *         {@link TemplateMethodModel}, respectively.
      */
     @Override
     public TemplateModel get(final String taglibUri) throws 
TemplateModelException {
@@ -1777,7 +1777,7 @@ public class TaglibFactory implements TemplateHashModel {
                     if (replacedTagOrFunction != null) {
                         if 
(CustomTagAndELFunctionCombiner.canBeCombinedAsELFunction(replacedTagOrFunction))
 {
                             tagsAndFunctions.put(tagNameCData, 
CustomTagAndELFunctionCombiner.combine(
-                                    customTagModel, (TemplateMethodModelEx) 
replacedTagOrFunction));
+                                    customTagModel, (TemplateMethodModel) 
replacedTagOrFunction));
                         } else {
                             if (LOG.isWarnEnabled()) {
                                 LOG.warn("TLD contains multiple tags with name 
" + _StringUtil.jQuote(tagNameCData)
@@ -1816,7 +1816,7 @@ public class TaglibFactory implements TemplateHashModel {
                                 locator);
                     }
 
-                    final TemplateMethodModelEx elFunctionModel;
+                    final TemplateMethodModel elFunctionModel;
                     try {
                         elFunctionModel = defaultObjectWrapper.wrap(null, 
functionMethod);
                     } catch (Exception e) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/1333a715/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java
 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java
index 38e69b5..43285c5 100644
--- 
a/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java
+++ 
b/freemarker-servlet/src/test/java/org/apache/freemarker/servlet/jsp/TLDParsingTest.java
@@ -33,12 +33,10 @@ import javax.servlet.jsp.tagext.TagSupport;
 import javax.xml.parsers.SAXParserFactory;
 
 import org.apache.freemarker.core.Configuration;
-import org.apache.freemarker.core.model.TemplateMethodModelEx;
+import org.apache.freemarker.core.model.TemplateMethodModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
-import org.apache.freemarker.servlet.jsp.JspTagModelBase;
-import org.apache.freemarker.servlet.jsp.TaglibFactory;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -84,13 +82,13 @@ public class TLDParsingTest {
         tag = (JspTagModelBase) tagsAndFunctions.get("setStringAttributeTag2");
         assertNotNull(tag);
 
-        TemplateMethodModelEx function = (TemplateMethodModelEx) 
tagsAndFunctions.get("toUpperCase");
+        TemplateMethodModel function = (TemplateMethodModel) 
tagsAndFunctions.get("toUpperCase");
         assertNotNull(function);
-        TemplateScalarModel result = (TemplateScalarModel) 
function.exec(Arrays.asList(new SimpleScalar("abc")));
+        TemplateScalarModel result = (TemplateScalarModel) 
function.execute(Arrays.asList(new SimpleScalar("abc")));
         assertEquals("ABC", result.getAsString());
-        function = (TemplateMethodModelEx) 
tagsAndFunctions.get("toUpperCase2");
+        function = (TemplateMethodModel) tagsAndFunctions.get("toUpperCase2");
         assertNotNull(function);
-        result = (TemplateScalarModel) function.exec(Arrays.asList(new 
SimpleScalar("abc")));
+        result = (TemplateScalarModel) function.execute(Arrays.asList(new 
SimpleScalar("abc")));
         assertEquals("ABC", result.getAsString());
     }
 

Reply via email to