module CosLifeCycle {

        typedef ::CosNaming::Name Key;

        typedef Object Factory;

        typedef sequence<Factory> Factories;

        struct NVP {
                ::CosNaming::Istring name;
                any value;
        };

        typedef NVP 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(NotCopyable, NoFactory, CannotMeetCriteria, InvalidCriteria);

                void move(in FactoryFinder there, in Criteria the_criteria)
                        raises(NotMovable, CannotMeetCriteria, InvalidCriteria, NoFactory);

                void remove()
                        raises(NotRemovable);
        };

        interface GenericFactory {
                boolean supports(in Key k);

                Object create_object(in Key k, in Criteria the_criteria)
                        raises(InvalidCriteria, NoFactory, CannotMeetCriteria);
        };
};

