:- object(root,				% avoid infinite metaclass regression by
	instantiates(root)).	% making the class its own metaclass

	:- public(method/0).

	method :-
		this(This),
		write('This is the default definition for the method, stored in class '),
		writeq(This), write('.'), nl.

:- end_object.



:- object(instance1,		% this instance simply inherits the method/0 predicate
	instantiates(root)).

:- end_object.



:- object(instance2,		% this instance provides its own definition for the
	instantiates(root)).	% method/0 predicate

	method :-
		this(This),
		write('This is an overriding definition stored in the '),
		writeq(This),
		write(' instance itself.'), nl.

:- end_object.



:- object(instance3,		% this instance specializes the inherited definition
	instantiates(root)).	% of the method/0 predicate

	method :-
		this(This),
		write('This is a specializing definition stored in the '),
		writeq(This),
		write(' instance itself.'), nl,
		write('It makes a super call to execute the default definition:'), nl, nl,
		^^method.

:- end_object.