package org.seasar.framework.aop.interceptors;

import org.aopalliance.intercept.MethodInterceptor;
import org.aopalliance.intercept.MethodInvocation;
import org.seasar.framework.aop.Aspect;
import org.seasar.framework.aop.impl.AspectImpl;
import org.seasar.framework.aop.impl.MethodInvocationImpl;
import org.seasar.framework.aop.impl.PointcutImpl;
import org.seasar.framework.aop.proxy.AopProxy;

/**
 * @author higa
 *  
 */
public abstract class AbstractInterceptor implements MethodInterceptor {

	public Object createProxy(Class proxyClass) {
		Aspect aspect = new AspectImpl(this, new PointcutImpl(new String[]{".*"}));
		return new AopProxy(proxyClass, new Aspect[] { aspect }).create();
	}
	
	protected Class getTargetClass(MethodInvocation invocation) {
		if (invocation instanceof MethodInvocationImpl) {
			return ((MethodInvocationImpl) invocation).getTargetClass();
		}
		Class thisClass = invocation.getThis().getClass();
		Class superClass = thisClass.getSuperclass();
		if (superClass == Object.class) {
			return thisClass.getInterfaces()[0];
		} else {
			return superClass;
		}
	}

}