001 /*
002 * $Id: ClosureListener.java,v 1.2 2005/04/12 16:38:42 jstrachan Exp $
003 *
004 * Copyright 2003 (C) James Strachan and Bob Mcwhirter. All Rights Reserved.
005 *
006 * Redistribution and use of this software and associated documentation
007 * ("Software"), with or without modification, are permitted provided that the
008 * following conditions are met: 1. Redistributions of source code must retain
009 * copyright statements and notices. Redistributions must also contain a copy
010 * of this document. 2. Redistributions in binary form must reproduce the above
011 * copyright notice, this list of conditions and the following disclaimer in
012 * the documentation and/or other materials provided with the distribution. 3.
013 * The name "groovy" must not be used to endorse or promote products derived
014 * from this Software without prior written permission of The Codehaus. For
015 * written permission, please contact info@codehaus.org. 4. Products derived
016 * from this Software may not be called "groovy" nor may "groovy" appear in
017 * their names without prior written permission of The Codehaus. "groovy" is a
018 * registered trademark of The Codehaus. 5. Due credit should be given to The
019 * Codehaus - http://groovy.codehaus.org/
020 *
021 * THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS ``AS IS'' AND ANY
022 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
023 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
024 * DISCLAIMED. IN NO EVENT SHALL THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR
025 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
026 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
027 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
028 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
029 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
030 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
031 * DAMAGE.
032 *
033 */
034 package org.codehaus.groovy.runtime;
035
036 import groovy.lang.Closure;
037
038 import java.lang.reflect.InvocationHandler;
039 import java.lang.reflect.Method;
040
041 /**
042 * Represents a method on an object using a closure which can be invoked at any
043 * time
044 *
045 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
046 * @version $Revision: 1.2 $
047 */
048 public class ClosureListener implements InvocationHandler {
049
050 private String listenerMethodName;
051 private Closure closure;
052
053 public ClosureListener(String listenerMethodName, Closure closure) {
054 this.listenerMethodName = listenerMethodName;
055 this.closure = closure;
056 }
057
058 public Object invoke(Object object, Method method, Object[] arguments) throws Throwable {
059 if (listenerMethodName.equals(method.getName())) {
060 /** @todo hack! */
061 closure.call(arguments[0]);
062 return null;
063 }
064
065 // lets try call this object
066 String name = method.getName();
067 if (name.equals("equals")) {
068 return object == arguments[0] ? Boolean.TRUE : Boolean.FALSE;
069 }
070 else if (name.equals("hashCode")) {
071 return new Integer(hashCode());
072 }
073 else if (name.equals("toString")) {
074 return super.toString() + "[listener:" + listenerMethodName + "]";
075 }
076
077 /*
078 * int paramCount = method.getParameterTypes().length;
079 *
080 * System.out.println("Now calling method: " + method);
081 *
082 * Method[] methods = Object.class.getMethods(); for (int i = 0; i
083 * < methods.length; i++ ) { Method aMethod = methods[i]; if
084 * (name.equals(aMethod.getName()) &&
085 * aMethod.getParameterTypes().length == paramCount) { return
086 * aMethod.invoke(object, arguments); } }
087 */
088 return null;
089 }
090
091 }