/**************************************************************
 *
 * 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_script_XInvocation2_idl__
#define __com_sun_star_script_XInvocation2_idl__

#ifndef __com_sun_star_script_XInvocation_idl__
#include <com/sun/star/script/XInvocation.idl>
#endif

#ifndef __com_sun_star_script_InvocationInfo_idl__
#include <com/sun/star/script/InvocationInfo.idl>
#endif

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

 module com {  module sun {  module star {  module script {

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

/**
	Extension of XInvocation to provide additional information
	about the methods and properties that are accessible via
	XInvocation.
	</p>
 */
published interface XInvocation2: com::sun::star::script::XInvocation
{
	/** returns the names of all methods and properties accessible via XInvocation.
	 */
	sequence< string > getMemberNames();

	/** returns information items for all methods and properties accessible via XInvocation.

		@see com::sun::star::script::Invocation
	 */
	sequence< InvocationInfo > getInfo();

	/** returns information item for the method or property defined by aName

		@param aName
			specifies the name of the method or property

		@param bExact
			specifies the name of the method or property

		@throws	IllegalArgumentException
			if aName is not the name of a supported method or property

		@see com::sun::star::script::Invocation
	 */
	InvocationInfo getInfoForName( [in] string aName, [in] boolean bExact )
		raises( com::sun::star::lang::IllegalArgumentException );

};

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

}; }; }; };

#endif
