/**************************************************************
 * 
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you 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.
 * 
 *************************************************************/


#ifndef __com_sun_star_uno_XAggregation_idl__
#define __com_sun_star_uno_XAggregation_idl__

#ifndef __com_sun_star_uno_XInterface_idl__
#include <com/sun/star/uno/XInterface.idl>
#endif

//=============================================================================

module com { module sun { module star { module uno { 

//=============================================================================
/** Objects which implement this interface can become aggregates of
	a delegator.
	
	<p>That means if an object "A" aggregates "B", "A" can provide all
	or some of the interfaces of "B". Whenever the method
	<member>XInterface::queryInterface()</member>
	is called on either of the objects, the call will be forwarded
	to object "A". Object "A" now can determine whether to use the
	interfaces of "A" or "B" or neither. Actually, any number of 
	aggregates can be used, even nested ones (aggregated objects which are
	delegators by themselves).
	
	<p>The following rules are to be observed:
	<ol>
	<li>All calls to <member>XInterface::acquire()</member>
	which are made before the delegator was set (using the method
	<member>XAggregation::setDelegator()</member>) must not be taken back 
	(using the method <member>XInterface::release()</member>)
	before the delegation is removed by calling
	<code>xAggregation-&gt;setDelegator(NULL)</code>.
	
	<li>The constructor of a delegator has to increment its 
	own reference count by calling its method 
	<member>XInterface::acquire()</member>
	before it sets itself to any aggregate using the method
	<member>XAggregation::setDelegator()</member>. After that
	call it has to reset its own reference count without the 
	destructor getting called.
	
	<li>The destructor of a delegator has to reset the delegator in
	its aggregated objects by calling their method
	<member>XAggregation::setDelegator()</member> with 
	<const>NULL</const> before it releases its reference to 
	its aggregated objects.
	</ol>

	@deprecated
    Aggregation will no longer be supported as a high-level concept of UNO.
    You may still have the option to implement an UNO object consisting of
    several single objects in your specific programming language, though this
    depends on your programming language.
*/
published interface XAggregation: com::sun::star::uno::XInterface
{
	//-------------------------------------------------------------------------
	/** sets the object to which all calls to the method
		<member>XInterface::queryInterface()</member>
		have to be forwarded. @
		
		@param xDelegator
		specifies the object which handles the calls to 
		<member>XInterface::queryInterface()</member>. 
		If <var>xDelegator</var> is <const>NULL</const>, the delegator is 
		removed and thus the object becomes its own delegator and has 
		to handle calls to the method
		<member>XInterface::queryInterface()</member>
		itself.
		
		@see XAggregation::queryAggregation
	*/
	void setDelegator( [in] com::sun::star::uno::XInterface pDelegator );

	//-------------------------------------------------------------------------
	/** is similar to <member>XInterface::queryInterface()</member>,
		but it is to be processed directly without being forwarded to the 
		delegator. @
		
		<p>This method is only called from within an implementation of         
		<member>XInterface::queryInterface()</member> 
		or <member>XAggregation::queryAggregation()</member>. This method
		is to be called by the delegator if it does not implement the
		interface itself. An object which got aggregated cannot depend
		on getting its own interface when it calls the method
		<member>XInterface::queryInterface()</member>.
			
		@see XAggregation::setDelegator
	*/
	any queryAggregation( [in] type aType );

};

//=============================================================================

}; }; }; }; 

#endif
