:- object(class,
	instantiates(class),
	specializes(abstract_class)).


	:- info([
		authors is 'Paulo Moura',
		version is 1.0,
		date is 2000/4/22,
		comment is 'Instantiation root and default metaclass for all classes.']).


	:- public(new/1).
	:- mode(new(+object), zero_or_one).

	:- public(delete/1).
	:- mode(delete(+object), zero_or_one).

	:- public(instances/1).
	:- mode(instances(-list), one).


	new(Object) :-
		self(Self),
		create_object(Object, [instantiates(Self)], [], []).


	delete(Object) :-
		self(Self),
		instantiates_class(Object, Self),
		\+ instantiates_class(_, Object),
		\+ specializes_class(_, Object),
		abolish_object(Object).


	instances(Instances) :-
		self(Self),
		findall(Instance, instantiates_class(Instance, Self), Instances).


	abstract_class :-
		fail.


:- end_object.