// CosLifeCycle Module, p 6-10 CORBAservices, LifeCycle Service V1.0, 3/94

#ifndef __CosLifeCycle_IDL
#define __CosLifeCycle_IDL

#include <CosNaming.idl>

#pragma prefix "omg.org"

module CosLifeCycle 
{
        typedef CosNaming::Name Key; 
        typedef Object _Factory;
        typedef sequence <_Factory> Factories;
        typedef struct NVP {     
                CosNaming::Istring  name; 
                any     value; 
        } NameValuePair;
        typedef sequence <NameValuePair> Criteria;

        exception NoFactory {
                Key search_key;
        };
        exception NotCopyable { string reason; };
        exception NotMovable { string reason; };
        exception NotRemovable { string reason; };
        exception InvalidCriteria{ 
                Criteria invalid_criteria;
        };
        exception CannotMeetCriteria {
                Criteria unmet_criteria;
        };


        interface FactoryFinder {
                Factories find_factories(in Key factory_key)
                        raises(NoFactory);
        };

        interface LifeCycleObject {
                LifeCycleObject copy(in FactoryFinder there, 
                                in Criteria the_criteria)
                        raises(NoFactory, NotCopyable, InvalidCriteria,
                                 CannotMeetCriteria);
                void move(in FactoryFinder there, 
                                in Criteria the_criteria)
                        raises(NoFactory, NotMovable, InvalidCriteria,
                                 CannotMeetCriteria);
                void remove()
                        raises(NotRemovable);
        };

        interface GenericFactory {              
                boolean _supports(in Key k);
                Object create_object(                   
                                in Key k, 
                                in Criteria the_criteria)                          
                        raises (NoFactory, InvalidCriteria,                                                                             
                                CannotMeetCriteria);
        };
};

#endif
