001    package org.codehaus.groovy.runtime;
002    
003    import java.lang.reflect.Method;
004    import java.security.AccessController;
005    import java.security.PrivilegedAction;
006    
007    import groovy.lang.Closure;
008    
009    
010    /**
011     * Represents a method on an object using a closure which can be invoked
012     * at any time
013     * 
014     * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
015     * @version $Revision: 4611 $
016     */
017    public class MethodClosure extends Closure {
018    
019        private String method;
020        
021        public MethodClosure(Object owner, String method) {
022            super(owner);
023            this.method = method;
024    
025            final Class clazz = owner.getClass()==Class.class?(Class) owner:owner.getClass();
026            
027            maximumNumberOfParameters = 0;
028    
029            Method[] methods = (Method[]) AccessController.doPrivileged(new  PrivilegedAction() {
030                public Object run() {
031                    return clazz.getMethods();
032                }
033            });
034            for (int j = 0; j < methods.length; j++) {
035                if (method.equals(methods[j].getName()) && methods[j].getParameterTypes().length > maximumNumberOfParameters) {
036                    maximumNumberOfParameters = methods[j].getParameterTypes().length;
037                }
038            }        
039            methods = (Method[]) AccessController.doPrivileged(new  PrivilegedAction() {
040                public Object run() {
041                    return clazz.getDeclaredMethods();
042                }
043            });
044            for (int j = 0; j < methods.length; j++) {
045                if (method.equals(methods[j].getName()) && methods[j].getParameterTypes().length > maximumNumberOfParameters) {
046                    maximumNumberOfParameters = methods[j].getParameterTypes().length;
047                }
048            }
049    
050        }
051        
052        public String getMethod() {
053            return method;
054        }
055    
056        protected Object doCall(Object arguments) {
057            return InvokerHelper.invokeMethod(getDelegate(), method, arguments);
058        }
059        
060        public Object getProperty(String property) {
061            if ("method".equals(property)) {
062                return getMethod();
063            } else  return super.getProperty(property);        
064        }
065    }