/*
 * $Id$
 * 
 * Copyright 2003 (C) James Strachan and Bob Mcwhirter. All Rights Reserved.
 * 
 * Redistribution and use of this software and associated documentation
 * ("Software"), with or without modification, are permitted provided that the
 * following conditions are met: 1. Redistributions of source code must retain
 * copyright statements and notices. Redistributions must also contain a copy
 * of this document. 2. Redistributions in binary form must reproduce the above
 * copyright notice, this list of conditions and the following disclaimer in
 * the documentation and/or other materials provided with the distribution. 3.
 * The name "groovy" must not be used to endorse or promote products derived
 * from this Software without prior written permission of The Codehaus. For
 * written permission, please contact info@codehaus.org. 4. Products derived
 * from this Software may not be called "groovy" nor may "groovy" appear in
 * their names without prior written permission of The Codehaus. "groovy" is a
 * registered trademark of The Codehaus. 5. Due credit should be given to The
 * Codehaus - http://groovy.codehaus.org/
 * 
 * THIS SOFTWARE IS PROVIDED BY THE CODEHAUS AND CONTRIBUTORS ``AS IS'' AND ANY
 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL THE CODEHAUS OR ITS CONTRIBUTORS BE LIABLE FOR
 * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
 * DAMAGE.
 *  
 */
package org.codehaus.groovy.runtime;

import groovy.lang.Closure;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;

/**
 * Represents a method on an object using a closure which can be invoked at any
 * time
 * 
 * @author <a href="mailto:james@coredevelopers.net">James Strachan</a>
 * @version $Revision$
 */
public class ClosureListener implements InvocationHandler {

    private String listenerMethodName;
    private Closure closure;

    public ClosureListener(String listenerMethodName, Closure closure) {
        this.listenerMethodName = listenerMethodName;
        this.closure = closure;
    }

    public Object invoke(Object object, Method method, Object[] arguments) throws Throwable {
        if (listenerMethodName.equals(method.getName())) {
            /** @todo hack! */
            closure.call(arguments[0]);
            return null;
        }

        // lets try call this object
        String name = method.getName();
        if (name.equals("equals")) {
            return object == arguments[0] ? Boolean.TRUE : Boolean.FALSE;
        }
        else if (name.equals("hashCode")) {
            return new Integer(hashCode());
        }
        else if (name.equals("toString")) {
            return super.toString() + "[listener:" + listenerMethodName + "]";
        }

        /*
		 * int paramCount = method.getParameterTypes().length;
		 * 
		 * System.out.println("Now calling method: " + method);
		 * 
		 * Method[] methods = Object.class.getMethods(); for (int i = 0; i
		 * < methods.length; i++ ) { Method aMethod = methods[i]; if
		 * (name.equals(aMethod.getName()) &&
		 * aMethod.getParameterTypes().length == paramCount) { return
		 * aMethod.invoke(object, arguments); } }
		 */
        return null;
    }

}