indexing
	description: "Behavior of commands"
	author: "Patrick Schoenbach"

deferred class interface
	COMMAND_BEHAVIOR

feature -- Access

	get_context: like context
			-- Returned context
		require
			context_available: context_available
		ensure
			context_retrieved: not context_available
	
feature -- Status report

	arguments_needed: BOOLEAN
			-- Does command need arguments?

	arguments_set: BOOLEAN
			-- Are arguments set?

	clear_history: BOOLEAN
			-- Shall history be cleared after execution?

	context_available: BOOLEAN
			-- Is context available for retrieval?

	context_set: BOOLEAN
			-- Is context set?

	is_undoable: BOOLEAN
			-- Can command be taken back?

	valid_arguments_type (other: ANY): BOOLEAN
			-- Is arguments type valid?

	valid_context_type (other: ANY): BOOLEAN
			-- Is context type valid?
	
feature -- Status setting

	set_arguments (args: like arguments)
			-- Set arguments.
		require
			arguments_not_set: not arguments_set
		ensure
			arguments_set: arguments_set

	set_context (c: like context)
			-- Set context.
		require
			no_context_returned: not context_available
		ensure
			context_set: context_set
	
feature -- Basic operations

	frozen run
			-- Run the command.
		require
			arguments_set: arguments_set;
			no_context_set: not context_set;
			no_context_available: not context_available
		ensure
			context_available: context_available;
			arguments_flag_reset: arguments_needed implies not arguments_set

	frozen take_back
			-- Take command back.
		require
			context_set: context_set
		ensure
			no_context_set: not context_set
	
invariant

		-- from GENERAL
	reflexive_equality: standard_is_equal (Current);
	reflexive_conformance: conforms_to (Current);
	context_availability_constraint: context_available implies not context_set;
	context_set_constraint: context_set implies not context_available;
	arguments_exist: arguments /= void;
	context_exists: context /= void;
	unneeded_arguments_empty: not arguments_needed implies arguments.empty;

end -- class COMMAND_BEHAVIOR