Fix 154 - expose method annotations via new MethodReference
diff --git a/api/src/main/java/jakarta/el/MethodExpression.java b/api/src/main/java/jakarta/el/MethodExpression.java
index 83668a2..2136e29 100644
--- a/api/src/main/java/jakarta/el/MethodExpression.java
+++ b/api/src/main/java/jakarta/el/MethodExpression.java
@@ -110,4 +110,31 @@
     public boolean isParametersProvided() {
         return false;
     }
+    
+    /**
+     * Obtain the {@link MethodReference} for the method to which this method
+     * expression resolves.
+     *
+     * @param context The EL context for this evaluation
+     *
+     * @return This default implementation always returns <code>null</code>
+     *
+     * @throws NullPointerException
+     *              If the supplied context is <code>null</code>
+     * @throws PropertyNotFoundException
+     *              If a property/variable resolution failed because no match
+     *              was found or a match was found but was not readable
+     * @throws MethodNotFoundException
+     *              If no matching method can be found
+     * @throws ELException
+     *              Wraps any exception throw whilst resolving the property
+     *
+     * @since EL 5.0
+     */
+    public MethodReference getMethodReference(ELContext context) {
+        // Expected to be over-ridden by implementations
+        context.notifyBeforeEvaluation(getExpressionString());
+        context.notifyAfterEvaluation(getExpressionString());
+        return null;
+    }
 }
diff --git a/api/src/main/java/jakarta/el/MethodReference.java b/api/src/main/java/jakarta/el/MethodReference.java
new file mode 100644
index 0000000..5d4e39a
--- /dev/null
+++ b/api/src/main/java/jakarta/el/MethodReference.java
@@ -0,0 +1,84 @@
+/*
+ * Copyright (c) 2019 Contributors to the Eclipse Foundation
+ * 
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+package jakarta.el;
+
+import java.lang.annotation.Annotation;
+
+/**
+ * Provides information about the method to which a method expression resolves.
+ */
+public class MethodReference {
+
+    private final Object base;
+    private final MethodInfo methodInfo;
+    private final Annotation[] annotations;
+    private final Object[] evaluatedParameters;
+
+
+    public MethodReference(Object base, MethodInfo methodInfo, Annotation[] annotations, Object[] evaluatedParameters) {
+        this.base = base;
+        this.methodInfo = methodInfo;
+        this.annotations = annotations;
+        this.evaluatedParameters = evaluatedParameters;
+    }
+
+
+    /**
+     * Obtain the base object on which the method will be invoked.
+     *
+     * @return The base object on which the method will be invoked or
+     *         {@code null} for literal method expressions.
+     */
+    public Object getBase() {
+        return base;
+    }
+
+
+    /**
+     * Obtain the {@link MethodInfo} for the {@link MethodExpression} for which
+     * this {@link MethodReference} has been generated.
+     *
+     * @return The {@link MethodInfo} for the {@link MethodExpression} for which
+     *         this {@link MethodReference} has been generated.
+     */
+    public MethodInfo getMethodInfo() {
+        return this.methodInfo;
+    }
+
+
+    /**
+     * Obtain the annotations on the method to which the associated expression
+     * resolves.
+     *
+     * @return The annotations on the method to which the associated expression
+     *         resolves. If the are no annotations, then an empty array is
+     *         returned.
+     */
+    public Annotation[] getAnnotations() {
+        return annotations;
+    }
+
+
+    /**
+     * Obtain the evaluated parameter values that will be passed to the method
+     * to which the associated expression resolves.
+     *
+     *  @return The evaluated parameters.
+     */
+    public Object[] getEvaluatedParameters() {
+        return evaluatedParameters;
+    }
+}
diff --git a/spec/src/main/asciidoc/ELSpec.adoc b/spec/src/main/asciidoc/ELSpec.adoc
index fb85d8c..18e4c1c 100644
--- a/spec/src/main/asciidoc/ELSpec.adoc
+++ b/spec/src/main/asciidoc/ELSpec.adoc
@@ -2961,6 +2961,11 @@
   Remove the deprecated, mis-spelt method
   `MethodExpression#isParmetersProvided()` from the API
 
+* https://github.com/eclipse-ee4j/el-ri/issues/154[#154]
+  Add the `MethodReference` class to provide access to details of the method to
+  which a `MethodExpression` resolves, including any annotations present on the
+  method.
+
 * https://github.com/eclipse-ee4j/el-ri/issues/157[#157]
   Generics are now used where appropriate throughout the API