#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 Spring.Objects.Factory;
using Spring.Objects.Factory.Config;

#endregion

namespace Spring.Objects.Factory.Support
{
	/// <summary>
	/// Interface for registries that hold object definitions, i.e. 
    /// <see cref="Spring.Objects.Factory.Support.RootObjectDefinition"/>
    /// and
    /// <see cref="Spring.Objects.Factory.Support.ChildObjectDefinition"/>
    /// instances.
	/// </summary>
	/// <remarks>
	/// <p>
	/// Typically implemented by object factories that work with the
	/// <see cref="Spring.Objects.Factory.Support.AbstractObjectDefinition"/>
	/// hierarchy internally.
	/// </p>
    /// </remarks>
    /// <author>Juergen Hoeller</author>
    /// <author>Rick Evans (.NET)</author>
	public interface IObjectDefinitionRegistry 
    {
        /// <summary>
        /// Determine whether the given object name is already in use within this registry, 
        /// i.e. whether there is a local object or alias registered under this name.
        /// </summary>
	    bool IsObjectNameInUse(string objectName);

        /// <summary>
        /// Return the number of objects defined in the registry.
        /// </summary>
        /// <value>
        /// The number of objects defined in the registry.
        /// </value>
        int ObjectDefinitionCount
        {
            get;
        }
		
        /// <summary>
        /// Return the names of all objects defined in this registry.
        /// </summary>
        /// <returns>
        /// The names of all objects defined in this registry, or an empty array
        /// if none defined
        /// </returns>
        string [] GetObjectDefinitionNames ();
		
        /// <summary>
        /// Check if this registry contains a object definition with the given name.
        /// </summary>
        /// <param name="name">
        /// The name of the object to look for.
        /// </param>
        /// <returns>
        /// True if this object factory contains an object definition with the
        /// given name.
        /// </returns>
        bool ContainsObjectDefinition (string name);
		
        /// <summary>
        /// Returns the
        /// <see cref="Spring.Objects.Factory.Config.IObjectDefinition"/>
        /// for the given object name.
        /// </summary>
        /// <param name="name">
        /// The name of the object to find a definition for.
        /// </param>
        /// <returns>
        /// The <see cref="Spring.Objects.Factory.Config.IObjectDefinition"/> for
        /// the given name (never null).
        /// </returns>
        /// <exception cref="Spring.Objects.Factory.NoSuchObjectDefinitionException">
        /// If the object definition cannot be resolved.
        /// </exception>
        /// <exception cref="Spring.Objects.ObjectsException">
        /// In case of errors.
        /// </exception>
        IObjectDefinition GetObjectDefinition (string name);
		
        /// <summary>
        /// Register a new object definition with this registry.
        /// Must support
        /// <see cref="Spring.Objects.Factory.Support.RootObjectDefinition"/>
        /// and <see cref="Spring.Objects.Factory.Support.ChildObjectDefinition"/>.
        /// </summary>
        /// <param name="name">
        /// The name of the object instance to register.
        /// </param>
        /// <param name="definition">
        /// The definition of the object instance to register.
        /// </param>
        /// <remarks>
        /// <p>
        /// Must support
        /// <see cref="Spring.Objects.Factory.Support.RootObjectDefinition"/> and
        /// <see cref="Spring.Objects.Factory.Support.ChildObjectDefinition"/>.
        /// </p>
        /// </remarks>
        /// <exception cref="Spring.Objects.ObjectsException">
        /// If the object definition is invalid.
        /// </exception>
        void RegisterObjectDefinition (string name, IObjectDefinition definition);
		
        /// <summary>
        /// Return the aliases for the given object name, if defined.
        /// </summary>
        /// <param name="name">the object name to check for aliases
        /// </param>
        /// <remarks>
        /// <p>
        /// Will ask the parent factory if the object cannot be found in this
        /// factory instance.
        /// </p>
        /// </remarks>
        /// <returns>
        /// The aliases, or an empty array if none.
        /// </returns>
        /// <exception cref="Spring.Objects.Factory.NoSuchObjectDefinitionException">
        /// If there's no such object definition.
        /// </exception>
        string [] GetAliases (string name);
		
        /// <summary>
        /// Given a object name, create an alias. We typically use this method to
        /// support names that are illegal within XML ids (used for object names).
        /// </summary>
        /// <param name="name">
        /// The name of the object.
        /// </param>
        /// <param name="theAlias">
        /// The alias that will behave the same as the object name.
        /// </param>
        /// <exception cref="Spring.Objects.Factory.NoSuchObjectDefinitionException">
        /// If there is no object with the given name.
        /// </exception>
        /// <exception cref="Spring.Objects.Factory.ObjectDefinitionStoreException">
        /// If the alias is already in use.
        /// </exception>
        void RegisterAlias (string name, string theAlias);
	}
}
