#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.Globalization;
using Spring.Util;

#endregion

namespace Spring.Objects.Support
{
	/// <summary>
	/// Base class implementation for classes that describe an event handler.
    /// </summary>
    /// <author>Rick Evans</author>
    public abstract class AbstractEventHandlerValue : IEventHandlerValue
    {
        #region Constructor (s) / Destructor
        /// <summary>
        /// Creates a new instance of the
        /// <see cref="Spring.Objects.Support.AbstractEventHandlerValue"/> class.
        /// </summary>
        /// <remarks>
        /// <p>
        /// This is an <see langword="abstract"/> class, and as such exposes no public constructors.
        /// </p>
        /// </remarks>
        protected AbstractEventHandlerValue() {}

        /// <summary>
        /// Creates a new instance of the
        /// <see cref="Spring.Objects.Support.AbstractEventHandlerValue"/> class.
        /// </summary>
        /// <param name="source">
        /// The object (possibly unresolved) that is exposing the event.
        /// </param>
        /// <param name="methodName">
        /// The name of the method on the handler that is going to handle the event.
        /// </param>
        /// <remarks>
        /// <p>
        /// This is an <see langword="abstract"/> class, and as such exposes no public constructors.
        /// </p>
        /// </remarks>
        protected AbstractEventHandlerValue (object source, string methodName) 
        {
            _source = source;
            _methodName = methodName;
        }
        #endregion

        #region Properties
        /// <summary>
        /// The source of the event (may be unresolved, as in the case
        /// of a <see cref="Spring.Objects.Factory.Config.RuntimeObjectReference"/>
        /// value).
        /// </summary>
        public virtual object Source 
        {
            get 
            {
                return _source;
            }
            set 
            {
                _source = value;
            }
        }

        /// <summary>
        /// The name of the method that is going to handle the event.
        /// </summary>
        public virtual string MethodName 
        {
            get 
            {
                return _methodName;
            }
            set 
            {
                _methodName = StringUtils.HasText (value) ? value.Trim () : string.Empty;
            }
        }

        /// <summary>
        /// The name of the event that is being wired up.
        /// </summary>
        public virtual string EventName 
        {
            get 
            {
                return _eventName;
            }
            set 
            {
                _eventName = StringUtils.HasText (value) ? value.Trim () : string.Empty;
            }
        }
        #endregion

        #region Methods
        /// <summary>
        /// Wires up the specified handler to the named event on the
        /// supplied event source.
        /// </summary>
        /// <param name="source">
        /// The object (an object instance, a <see cref="System.Type"/>, etc)
        /// exposing the named event.
        /// </param>
        /// <param name="handler">
        /// The handler for the event (an object instance, a
        /// <see cref="System.Type"/>, etc).
        /// </param>
        public abstract void Wire (object source, object handler);

        /// <summary>
        /// Returns a stringified representation of this object.
        /// </summary>
        /// <returns>A stringified representation of this object.</returns>
        public override string ToString()
        {
            return string.Format (
                CultureInfo.InvariantCulture,
                "{0} [Source = '{1}', Method = '{2}']", GetType ().FullName, Source, MethodName);
        }
        #endregion

        #region Fields
        private object _source;
        private string _methodName;
        private string _eventName;
        #endregion
	}
}
