001 package org.codehaus.groovy.runtime; 002 003 import groovy.lang.ParameterArray; 004 import groovy.lang.Closure; 005 import groovy.lang.MetaClass; 006 007 008 /** 009 * Represents a method on an object using a closure which can be invoked 010 * at any time 011 * 012 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a> 013 * @version $Revision: 1.7 $ 014 */ 015 public class MethodClosure extends Closure { 016 017 private String method; 018 MetaClass metaClass = InvokerHelper.getMetaClass(this); 019 020 public MethodClosure(Object delegate) { 021 super(delegate); 022 } 023 024 public MethodClosure(Object owner, String method) { 025 super(owner); 026 this.method = method; 027 } 028 029 public String getMethod() { 030 return method; 031 } 032 033 public Object call(Object arguments) { 034 if (arguments instanceof Object[] && ((Object[])arguments).length > 0) 035 return InvokerHelper.invokeMethod(getDelegate(), method, new ParameterArray(arguments)); 036 else 037 return InvokerHelper.invokeMethod(getDelegate(), method, arguments); 038 } 039 040 public MetaClass getMetaClass() { 041 return metaClass; 042 } 043 044 public void setMetaClass(MetaClass metaClass) { 045 this.metaClass = metaClass; 046 } 047 048 protected Object doCall(Object arguments) { 049 if (arguments instanceof Object[] && ((Object[])arguments).length > 0) 050 return InvokerHelper.invokeMethod(getDelegate(), method, new ParameterArray(arguments)); 051 else 052 return InvokerHelper.invokeMethod(getDelegate(), method, arguments); 053 } 054 }