#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;

#endregion

namespace Spring.Aop
{
	/// <summary>
	/// Base interface holding AOP advice and a filter determining the
	/// applicability of the advice (such as a pointcut).
	/// </summary>
	/// <remarks>
	/// <note>
	/// This interface is not for use by Spring.NET users, but exists rather to
	/// allow for commonality in the support for different types of advice
	/// within the framework.
	/// </note>
	/// <p>
	/// Spring.NET AOP is centered on <b>around advice</b> delivered via method
	/// <b>interception</b>, compliant with the AOP Alliance interception API. 
	/// The <see cref="Spring.Aop.IAdvisor"/> interface allows support for
	/// different types of advice, such as <b>before</b> and <b>after</b>
	/// advice, which need not be implemented using interception.
	/// </p>
	/// </remarks>
	/// <author>Rod Johnson</author>
	/// <author>Aleksandar Seovic (.NET)</author>
	/// <seealso cref="Spring.Aop.IMethodBeforeAdvice"/>
	/// <seealso cref="Spring.Aop.IAfterReturningAdvice"/>
	/// <seealso cref="Spring.Aop.IThrowsAdvice"/>
	/// <seealso cref="AopAlliance.Intercept.IMethodInterceptor"/>
	public interface IAdvisor
	{
		/// <summary>
		/// Is this advice associated with a particular instance?
		/// </summary>
		/// <remarks>
		/// <p>
		/// An advisor that was creating a mixin would be a per instance
		/// operation and would thus return <see langword="true"/>. If the
		/// advisor is not per instance, it is shared with all instances of the
		/// advised class obtained from the same Spring.NET IoC container.
		/// </p>
		/// <p>
		/// Use <c>singleton</c> and <c>prototype</c> object definitions or
		/// appropriate programmatic proxy creation to ensure that
		/// <see cref="Spring.Aop.IAdvisor"/>s have the correct lifecycle model. 
		/// </p>
		/// <note>
		/// This method is not currently used by the framework.
		/// </note>
		/// </remarks>
		/// <value>
		/// <see langword="true"/> if this advice is associated with a
		/// particular instance.
		/// </value>
		bool IsPerInstance { get; }

		/// <summary>
		/// Return the advice part of this aspect.
		/// </summary>
		/// <remarks>
		/// <p>
		/// An advice may be an interceptor, a throws advice, before advice,
		/// introduction etc.
		/// </p>
		/// </remarks>
		/// <returns>
		/// The advice that should apply if the pointcut matches.
		/// </returns>
		IAdvice Advice { get; }
	}
}