http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8d5263f2/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/IncludePage.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/IncludePage.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/IncludePage.java
index c500c8c..0f2a061 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/IncludePage.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/IncludePage.java
@@ -185,7 +185,7 @@ public class IncludePage implements TemplateDirectiveModel {
     }
 
     @Override
-    public ArgumentArrayLayout getArgumentArrayLayout() {
+    public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
         return ARGS_LAYOUT;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8d5263f2/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
deleted file mode 100644
index ff9db12..0000000
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/CustomTagAndELFunctionCombiner.java
+++ /dev/null
@@ -1,157 +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.servlet.jsp;
-
-import java.io.IOException;
-import java.io.Writer;
-import java.util.List;
-
-import org.apache.freemarker.core.Environment;
-import org.apache.freemarker.core.TemplateException;
-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.TemplateMethodModel;
-import org.apache.freemarker.core.model.TemplateModel;
-import org.apache.freemarker.core.model.TemplateModelException;
-import org.apache.freemarker.core.model.impl.JavaMethodModel;
-import org.apache.freemarker.core.util.BugException;
-import org.apache.freemarker.core.util._ClassUtil;
-
-/**
- * Used when a custom JSP tag and an EL function uses the same name in a tag 
library, to invoke a single FTL value from
- * the two. As FTL as no separate namespace for "tags" and functions, both 
aspect has to be implemented by the same
- * value.
- */
-@SuppressWarnings("rawtypes")
-class CustomTagAndELFunctionCombiner {
-
-    /**
-     * @param customTag
-     *            A {@link TemplateDirectiveModel}.
-     */
-    static TemplateModel combine(TemplateModel customTag, TemplateMethodModel 
elFunction) {
-        if (customTag instanceof TemplateDirectiveModel) {
-            return elFunction instanceof JavaMethodModel //
-                    ? new TemplateDirectiveModelAndSimpleMethodModel( //
-                            (TemplateDirectiveModel) customTag, 
(JavaMethodModel) elFunction) //
-                    : new TemplateDirectiveModelAndTemplateMethodModelEx( //
-                            (TemplateDirectiveModel) customTag, elFunction);
-        } else {
-            throw new BugException(
-                    "Unexpected custom JSP tag class: " + 
_ClassUtil.getShortClassNameOfObject(customTag));
-        }
-    }
-
-    /**
-     * Tells if the value can be used as the "custom tag" parameter to
-     * {@link #combine(TemplateModel, TemplateMethodModel)}.
-     */
-    static boolean canBeCombinedAsCustomTag(TemplateModel tm) {
-        return (tm instanceof TemplateDirectiveModel) && !(tm instanceof 
CombinedTemplateModel);
-    }
-
-    /**
-     * Tells if the value can be used as the "EL function" parameter to
-     * {@link #combine(TemplateModel, TemplateMethodModel)}.
-     */
-    static boolean canBeCombinedAsELFunction(TemplateModel tm) {
-        return tm instanceof TemplateMethodModel && !(tm instanceof 
CombinedTemplateModel);
-    }
-
-    private static class CombinedTemplateModel {
-        // Marker only
-    }
-
-    private static class TemplateDirectiveModelAndSimpleMethodModel extends 
CombinedTemplateModel
-            implements TemplateDirectiveModel, TemplateMethodModel,
-            _UnexpectedTypeErrorExplainerTemplateModel {
-
-        private final TemplateDirectiveModel templateDirectiveModel;
-        private final JavaMethodModel simpleMethodModel;
-
-        public TemplateDirectiveModelAndSimpleMethodModel( //
-                TemplateDirectiveModel templateDirectiveModel, JavaMethodModel 
simpleMethodModel) {
-            this.templateDirectiveModel = templateDirectiveModel;
-            this.simpleMethodModel = simpleMethodModel;
-        }
-
-        @Override
-        public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateModelException {
-            return simpleMethodModel.execute(args);
-        }
-
-        @Override
-        public Object[] explainTypeError(Class[] expectedClasses) {
-            return simpleMethodModel.explainTypeError(expectedClasses);
-        }
-
-        @Override
-        public void execute(TemplateModel[] args, CallPlace callPlace, Writer 
out, Environment env)
-                throws TemplateException, IOException {
-            templateDirectiveModel.execute(args, callPlace, out, env);
-        }
-
-        @Override
-        public ArgumentArrayLayout getArgumentArrayLayout() {
-            return templateDirectiveModel.getArgumentArrayLayout();
-        }
-
-        @Override
-        public boolean isNestedContentSupported() {
-            return templateDirectiveModel.isNestedContentSupported();
-        }
-    }
-
-    private static class TemplateDirectiveModelAndTemplateMethodModelEx 
extends CombinedTemplateModel
-            implements TemplateDirectiveModel, TemplateMethodModel {
-
-        private final TemplateDirectiveModel templateDirectiveModel;
-        private final TemplateMethodModel templateMethodModelEx;
-
-        public TemplateDirectiveModelAndTemplateMethodModelEx( //
-                TemplateDirectiveModel templateDirectiveModel, 
TemplateMethodModel templateMethodModelEx) {
-            this.templateDirectiveModel = templateDirectiveModel;
-            this.templateMethodModelEx = templateMethodModelEx;
-        }
-
-        @Override
-        public TemplateModel execute(List<? extends TemplateModel> args) 
throws TemplateException {
-            return templateMethodModelEx.execute(args);
-        }
-
-        @Override
-        public void execute(TemplateModel[] args, CallPlace callPlace, Writer 
out, Environment env)
-                throws TemplateException, IOException {
-            templateDirectiveModel.execute(args, callPlace, out, env);
-        }
-
-        @Override
-        public ArgumentArrayLayout getArgumentArrayLayout() {
-            return templateDirectiveModel.getArgumentArrayLayout();
-        }
-
-        @Override
-        public boolean isNestedContentSupported() {
-            return templateDirectiveModel.isNestedContentSupported();
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8d5263f2/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
index 99e8272..01418ba 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/JspTagModelBase.java
@@ -29,10 +29,16 @@ import java.math.BigDecimal;
 import java.util.HashMap;
 import java.util.Map;
 
+import javax.servlet.jsp.JspException;
+import javax.servlet.jsp.tagext.DynamicAttributes;
+import javax.servlet.jsp.tagext.JspTag;
+
 import org.apache.freemarker.core.Template;
+import org.apache.freemarker.core.TemplateException;
 import org.apache.freemarker.core._DelayedJQuote;
 import org.apache.freemarker.core._DelayedShortClassName;
 import org.apache.freemarker.core._ErrorDescriptionBuilder;
+import org.apache.freemarker.core._MiscTemplateException;
 import org.apache.freemarker.core._TemplateModelException;
 import org.apache.freemarker.core.model.ObjectWrapperAndUnwrapper;
 import org.apache.freemarker.core.model.TemplateHashModelEx2;
@@ -45,7 +51,6 @@ import 
org.apache.freemarker.servlet.jsp.SimpleTagDirectiveModel.TemplateExcepti
 class JspTagModelBase {
     protected final String tagName;
     private final Class tagClass;
-    private final Method dynaSetter;
     private final Map propertySetters = new HashMap();
     
     protected JspTagModelBase(String tagName, Class tagClass) throws 
IntrospectionException {
@@ -59,24 +64,14 @@ class JspTagModelBase {
                 propertySetters.put(pd.getName(), m);
             }
         }
-        // Check to see if the tag implements the JSP2.0 DynamicAttributes
-        // interface, to allow setting of arbitrary attributes
-        Method dynaSetter;
-        try {
-            dynaSetter = tagClass.getMethod("setDynamicAttribute",
-                    String.class, String.class, Object.class);
-        } catch (NoSuchMethodException nsme) {
-            dynaSetter = null;
-        }
-        this.dynaSetter = dynaSetter;
     }
     
     Object getTagInstance() throws IllegalAccessException, 
InstantiationException {
         return tagClass.newInstance();
     }
     
-    void setupTag(Object tag, TemplateHashModelEx2 args, 
ObjectWrapperAndUnwrapper wrapper)
-            throws TemplateModelException,
+    void setupTag(JspTag tag, TemplateHashModelEx2 args, 
ObjectWrapperAndUnwrapper wrapper)
+            throws TemplateException,
         InvocationTargetException, 
         IllegalAccessException {
         if (args != null && !args.isEmpty()) {
@@ -88,12 +83,18 @@ class JspTagModelBase {
                 final String paramName = ((TemplateScalarModel) 
entry.getKey()).getAsString();
                 Method setterMethod = (Method) propertySetters.get(paramName);
                 if (setterMethod == null) {
-                    if (dynaSetter == null) {
+                    if (tag instanceof DynamicAttributes) {
+                        try {
+                            ((DynamicAttributes) 
tag).setDynamicAttribute(null, paramName, argArray[0]);
+                        } catch (JspException e) {
+                            throw new _MiscTemplateException(
+                                    "Failed to set JSP tag dynamic attribute 
", new _DelayedJQuote(paramName), ".",
+                                    e);
+                        }
+                    } else {
                         throw new TemplateModelException("Unknown property "
                                 + _StringUtil.jQuote(paramName.toString())
                                 + " on instance of " + tagClass.getName());
-                    } else {
-                        dynaSetter.invoke(tag, null, paramName, argArray[0]);
                     }
                 } else {
                     if (arg instanceof BigDecimal) {

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8d5263f2/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
index 6035a1f..b4f4a15 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/SimpleTagDirectiveModel.java
@@ -107,7 +107,7 @@ class SimpleTagDirectiveModel extends JspTagModelBase 
implements TemplateDirecti
     }
 
     @Override
-    public ArgumentArrayLayout getArgumentArrayLayout() {
+    public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
         return ARGS_LAYOUT;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8d5263f2/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
index ff5b435..15db96d 100644
--- 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TagDirectiveModel.java
@@ -117,7 +117,7 @@ class TagDirectiveModel extends JspTagModelBase implements 
TemplateDirectiveMode
     }
 
     @Override
-    public ArgumentArrayLayout getArgumentArrayLayout() {
+    public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
         return ARGS_LAYOUT;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8d5263f2/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 98634bd..a1525af 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
@@ -65,8 +65,8 @@ import org.apache.freemarker.core.ConfigurationException;
 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.TemplateFunctionModel;
 import org.apache.freemarker.core.model.TemplateHashModel;
-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 TemplateMethodModel}, respectively.
+     *         {@link TemplateFunctionModel}, respectively.
      */
     @Override
     public TemplateModel get(final String taglibUri) throws 
TemplateModelException {
@@ -1759,7 +1759,7 @@ public class TaglibFactory implements TemplateHashModel {
 
                     final Class<?> tagClass = 
resoveClassFromTLD(tagClassCData, "custom tag", tagNameCData);
 
-                    final TemplateModel customTagModel;
+                    final TemplateDirectiveModel customTagModel;
                     try {
                         if (Tag.class.isAssignableFrom(tagClass)) {
                             customTagModel = new 
TagDirectiveModel(tagNameCData, tagClass);
@@ -1775,9 +1775,10 @@ public class TaglibFactory implements TemplateHashModel {
 
                     TemplateModel replacedTagOrFunction = 
tagsAndFunctions.put(tagNameCData, customTagModel);
                     if (replacedTagOrFunction != null) {
-                        if 
(CustomTagAndELFunctionCombiner.canBeCombinedAsELFunction(replacedTagOrFunction))
 {
-                            tagsAndFunctions.put(tagNameCData, 
CustomTagAndELFunctionCombiner.combine(
-                                    customTagModel, (TemplateMethodModel) 
replacedTagOrFunction));
+                        if (replacedTagOrFunction instanceof 
TemplateFunctionModel
+                                && !(replacedTagOrFunction instanceof  
TemplateDirectiveModelAndTemplateFunctionModel)) {
+                            tagsAndFunctions.put(tagNameCData, new 
TemplateDirectiveModelAndTemplateFunctionModel(
+                                    customTagModel, (TemplateFunctionModel) 
replacedTagOrFunction));
                         } else {
                             if (LOG.isWarnEnabled()) {
                                 LOG.warn("TLD contains multiple tags with name 
" + _StringUtil.jQuote(tagNameCData)
@@ -1816,7 +1817,7 @@ public class TaglibFactory implements TemplateHashModel {
                                 locator);
                     }
 
-                    final TemplateMethodModel elFunctionModel;
+                    final TemplateFunctionModel elFunctionModel;
                     try {
                         elFunctionModel = defaultObjectWrapper.wrap(null, 
functionMethod);
                     } catch (Exception e) {
@@ -1827,9 +1828,10 @@ public class TaglibFactory implements TemplateHashModel {
 
                     TemplateModel replacedTagOrFunction = 
tagsAndFunctions.put(functionNameCData, elFunctionModel);
                     if (replacedTagOrFunction != null) {
-                        if 
(CustomTagAndELFunctionCombiner.canBeCombinedAsCustomTag(replacedTagOrFunction))
 {
-                            tagsAndFunctions.put(functionNameCData, 
CustomTagAndELFunctionCombiner.combine(
-                                    replacedTagOrFunction, elFunctionModel));
+                        if (replacedTagOrFunction instanceof  
TemplateDirectiveModel
+                                && !(replacedTagOrFunction instanceof  
TemplateDirectiveModelAndTemplateFunctionModel)) {
+                            tagsAndFunctions.put(functionNameCData, new 
TemplateDirectiveModelAndTemplateFunctionModel(
+                                    (TemplateDirectiveModel) 
replacedTagOrFunction, elFunctionModel));
                         } else {
                             if (LOG.isWarnEnabled()) {
                                 LOG.warn("TLD contains multiple functions with 
name "

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8d5263f2/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TemplateDirectiveModelAndTemplateFunctionModel.java
----------------------------------------------------------------------
diff --git 
a/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TemplateDirectiveModelAndTemplateFunctionModel.java
 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TemplateDirectiveModelAndTemplateFunctionModel.java
new file mode 100644
index 0000000..e4d74d1
--- /dev/null
+++ 
b/freemarker-servlet/src/main/java/org/apache/freemarker/servlet/jsp/TemplateDirectiveModelAndTemplateFunctionModel.java
@@ -0,0 +1,77 @@
+/*
+ * 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.servlet.jsp;
+
+import java.io.IOException;
+import java.io.Writer;
+
+import org.apache.freemarker.core.CallPlace;
+import org.apache.freemarker.core.Environment;
+import org.apache.freemarker.core.TemplateException;
+import org.apache.freemarker.core.model.ArgumentArrayLayout;
+import org.apache.freemarker.core.model.TemplateDirectiveModel;
+import org.apache.freemarker.core.model.TemplateFunctionModel;
+import org.apache.freemarker.core.model.TemplateModel;
+
+/**
+ * Used when a custom JSP tag and an EL function uses the same name in a tag 
library, to invoke a single FTL value from
+ * the two. As FTL as no separate namespace for "tags" and functions, both 
aspect has to be implemented by the same
+ * value.
+ */
+class TemplateDirectiveModelAndTemplateFunctionModel
+        implements TemplateDirectiveModel, TemplateFunctionModel {
+
+    private final TemplateDirectiveModel templateDirectiveModel;
+    private final TemplateFunctionModel templateFunctionModel;
+
+    TemplateDirectiveModelAndTemplateFunctionModel( //
+            TemplateDirectiveModel templateDirectiveModel, 
TemplateFunctionModel templateMethodModelEx) {
+        this.templateDirectiveModel = templateDirectiveModel;
+        this.templateFunctionModel = templateMethodModelEx;
+    }
+
+    @Override
+    public void execute(TemplateModel[] args, CallPlace callPlace, Writer out, 
Environment env)
+            throws TemplateException, IOException {
+        templateDirectiveModel.execute(args, callPlace, out, env);
+    }
+
+    @Override
+    public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
+        return templateDirectiveModel.getDirectiveArgumentArrayLayout();
+    }
+
+    @Override
+    public boolean isNestedContentSupported() {
+        return templateDirectiveModel.isNestedContentSupported();
+    }
+
+    @Override
+    public ArgumentArrayLayout getFunctionArgumentArrayLayout() {
+        return templateFunctionModel.getFunctionArgumentArrayLayout();
+    }
+
+    @Override
+    public TemplateModel execute(TemplateModel[] args, CallPlace callPlace, 
Environment env)
+            throws TemplateException {
+        return templateFunctionModel.execute(args, callPlace, env);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8d5263f2/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 43285c5..3cc6993 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
@@ -23,7 +23,6 @@ import static org.junit.Assert.*;
 
 import java.io.InputStream;
 import java.net.URL;
-import java.util.Arrays;
 import java.util.Map;
 
 import javax.servlet.ServletContextEvent;
@@ -33,9 +32,11 @@ import javax.servlet.jsp.tagext.TagSupport;
 import javax.xml.parsers.SAXParserFactory;
 
 import org.apache.freemarker.core.Configuration;
-import org.apache.freemarker.core.model.TemplateMethodModel;
+import org.apache.freemarker.core.NonTemplateCallPlace;
+import org.apache.freemarker.core.model.TemplateModel;
 import org.apache.freemarker.core.model.TemplateScalarModel;
 import org.apache.freemarker.core.model.impl.DefaultObjectWrapper;
+import org.apache.freemarker.core.model.impl.JavaMethodModel;
 import org.apache.freemarker.core.model.impl.SimpleScalar;
 import org.junit.Before;
 import org.junit.Test;
@@ -74,7 +75,7 @@ public class TLDParsingTest {
         assertEquals(1, tldParser.getListeners().size());
         assertTrue(tldParser.getListeners().get(0) instanceof 
ExampleContextListener);
 
-        Map tagsAndFunctions = tldParser.getTagsAndFunctions();
+        Map<String, TemplateModel> tagsAndFunctions = 
tldParser.getTagsAndFunctions();
         assertEquals(4, tagsAndFunctions.size());
 
         JspTagModelBase tag = (JspTagModelBase) 
tagsAndFunctions.get("setStringAttributeTag");
@@ -82,13 +83,15 @@ public class TLDParsingTest {
         tag = (JspTagModelBase) tagsAndFunctions.get("setStringAttributeTag2");
         assertNotNull(tag);
 
-        TemplateMethodModel function = (TemplateMethodModel) 
tagsAndFunctions.get("toUpperCase");
+        JavaMethodModel function = (JavaMethodModel) 
tagsAndFunctions.get("toUpperCase");
         assertNotNull(function);
-        TemplateScalarModel result = (TemplateScalarModel) 
function.execute(Arrays.asList(new SimpleScalar("abc")));
+        TemplateScalarModel result = (TemplateScalarModel) function.execute(
+                new TemplateModel[] { new SimpleScalar("abc") }, 
NonTemplateCallPlace.INSTANCE);
         assertEquals("ABC", result.getAsString());
-        function = (TemplateMethodModel) tagsAndFunctions.get("toUpperCase2");
+        function = (JavaMethodModel) tagsAndFunctions.get("toUpperCase2");
         assertNotNull(function);
-        result = (TemplateScalarModel) function.execute(Arrays.asList(new 
SimpleScalar("abc")));
+        result = (TemplateScalarModel) function.execute(
+                new TemplateModel[] { new SimpleScalar("abc") }, 
NonTemplateCallPlace.INSTANCE);
         assertEquals("ABC", result.getAsString());
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8d5263f2/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertDirective.java
----------------------------------------------------------------------
diff --git 
a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertDirective.java
 
b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertDirective.java
index 2e7ecfc..eb6930b 100644
--- 
a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertDirective.java
+++ 
b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertDirective.java
@@ -56,7 +56,7 @@ public class AssertDirective implements 
TemplateDirectiveModel {
     }
 
     @Override
-    public ArgumentArrayLayout getArgumentArrayLayout() {
+    public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
         return ArgumentArrayLayout.SINGLE_POSITIONAL_PARAMETER;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8d5263f2/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertEqualsDirective.java
----------------------------------------------------------------------
diff --git 
a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertEqualsDirective.java
 
b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertEqualsDirective.java
index 6734fbc..51baeb4 100644
--- 
a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertEqualsDirective.java
+++ 
b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertEqualsDirective.java
@@ -78,7 +78,7 @@ public class AssertEqualsDirective implements 
TemplateDirectiveModel {
     }
 
     @Override
-    public ArgumentArrayLayout getArgumentArrayLayout() {
+    public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
         return ARGS_LAYOUT;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8d5263f2/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertFailsDirective.java
----------------------------------------------------------------------
diff --git 
a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertFailsDirective.java
 
b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertFailsDirective.java
index e8120fc..6fe1505 100644
--- 
a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertFailsDirective.java
+++ 
b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/AssertFailsDirective.java
@@ -136,7 +136,7 @@ public class AssertFailsDirective implements 
TemplateDirectiveModel {
     }
 
     @Override
-    public ArgumentArrayLayout getArgumentArrayLayout() {
+    public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
         return ARGS_LAYOUT;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-freemarker/blob/8d5263f2/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/NoOutputDirective.java
----------------------------------------------------------------------
diff --git 
a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/NoOutputDirective.java
 
b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/NoOutputDirective.java
index a8a7bee..1e33dab 100644
--- 
a/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/NoOutputDirective.java
+++ 
b/freemarker-test-utils/src/main/java/org/apache/freemarker/test/templateutil/NoOutputDirective.java
@@ -45,7 +45,7 @@ public class NoOutputDirective implements 
TemplateDirectiveModel {
     }
 
     @Override
-    public ArgumentArrayLayout getArgumentArrayLayout() {
+    public ArgumentArrayLayout getDirectiveArgumentArrayLayout() {
         return ArgumentArrayLayout.PARAMETERLESS;
     }
 

Reply via email to