#region License

/*
 * Copyright © 2002-2005 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#endregion

#region Imports

using System;
using AopAlliance.Aop;
using AopAlliance.Intercept;

#endregion

namespace Spring.Aop.Framework.Adapter
{
	/// <summary>
	/// Permits the handling of new advisors and advice types as extensions to
	/// the Spring AOP framework.
	/// </summary>
	/// <remarks>
	/// <p>
	/// Implementors can create AOP Alliance
	/// <see cref="AopAlliance.Intercept.IInterceptor"/>s from custom advice
	/// types, enabling these advice types to be used in the Spring.NET AOP
	/// framework, which uses interception under the covers.
	/// </p>
	/// <p>
	/// There is no need for most Spring.NET users to implement this interface;
	/// do so only if you need to introduce more
	/// <see cref="Spring.Aop.IAdvisor"/> or <see cref="AopAlliance.Aop.IAdvice"/>
	/// types to Spring.NET.
	/// </p>
	/// </remarks>
	/// <author>Rod Johnson</author>
	/// <author>Aleksandar Seovic (.NET)</author>
	public interface IAdvisorAdapter
	{
	    /// <summary>
	    /// Does this adapter understand the supplied <paramref name="advice"/>?
	    /// </summary>
	    /// <remarks>
	    /// <p>
	    /// Is it valid to invoke the
	    /// <see cref="Spring.Aop.Framework.Adapter.IAdvisorAdapterRegistry.Wrap"/>
	    /// method with the given advice as an argument?
	    /// </p>
	    /// </remarks>
	    /// <param name="advice">
	    /// <see cref="AopAlliance.Aop.IAdvice"/> such as
	    /// <see cref="Spring.Aop.IBeforeAdvice"/>.
	    /// </param>
	    /// <returns><see langword="true"/> if this adapter understands the
	    /// supplied <paramref name="advice"/>.
	    /// </returns>
	    bool SupportsAdvice(IAdvice advice);

	    /// <summary>
	    /// Return an AOP Alliance
	    /// <see cref="AopAlliance.Intercept.IInterceptor"/> exposing the
	    /// behaviour of the given advice to an interception-based AOP
	    /// framework.
	    /// </summary>
	    /// <remarks>
	    /// <p>
	    /// Don't worry about any <see cref="Spring.Aop.IPointcut"/>
	    /// contained in the supplied <see cref="Spring.Aop.IAdvisor"/>;
	    /// the AOP framework will take care of checking the pointcut.
	    /// </p>
	    /// </remarks>
	    /// <param name="advisor">
	    /// The advice. The
	    /// <see cref="Spring.Aop.Framework.Adapter.IAdvisorAdapter.SupportsAdvice"/>
	    /// method must have previously returned <see langword="true"/> on the
	    /// supplied <paramref name="advisor"/>.
	    /// </param>
	    /// <returns>
	    /// An AOP Alliance
	    /// <see cref="AopAlliance.Intercept.IInterceptor"/> exposing the
	    /// behaviour of the given advice to an interception-based AOP
	    /// framework.
	    /// </returns>
	    IInterceptor GetInterceptor(IAdvisor advisor);
	}
}