% general information about Joe:

:- object(joePerson).

	:- public(getOlder/0).

	:- public(address/1).

	:- public(age/1).
	:- dynamic(age/1).

	:- public(name/1).

	:- public(phone/1).

	:- public(score/1).
	:- dynamic(score/1).

	:- public(setScore/1).

	getOlder :-						% this predicate uses property sharing, i.e.
		retract(age(Old)),			% the property and its value are shared by all 
		New is Old + 1,				% descendant prototypes/viewpoints; changes
		asserta(age(New)).			% are shared no matter which viewpoint receives
									% the getOlder/1 message
	address('8 Octave Street').

	age(30).

	name('John').

	phone(11-11-11-11).

	score(0).						% default value for the score/1 property,
									% shared by all descendant prototypes/viewpoints;
	setScore(Score) :-				% changing the default value results in
		::retractall(score(_)),		% in a local value stored in the descendant
		::asserta(score(Score)).	% prototype that received the setScore/1 message

:- end_object.


% information on Joe as an employee:

:- object(joeEmployee,
	extends(joePerson)).

	:- public(worksFor/1).

	:- public(salary/1).
	:- dynamic(salary/1).
	
	:- public(giveRaise/1).

	worksFor('ToonTown').

	salary(1500).

	giveRaise(Raise) :-				% another example of property sharing
		retract(salary(Old)),
		New is Old + Raise,
		asserta(salary(New)).

:- end_object.


% information on Joe as an chess player:

:- object(joeChessPlayer,
    extends(joePerson)).

    :- public(category/1).

    category('National Master').

:- end_object.


% information on Joe as a movies fan:

:- object(joeFilmEnthusiast,
	extends(joePerson)).

	:- public(favActor/1).
	:- public(favFilm/1).
	:- public(favDirector/1).

	favActor('Fred Filistone').

	favFilm('The Wizard of Oz').

	favDirector('Krzystof Kieslowski').

:- end_object.


% information on Joe as a sportsman:

:- object(joeSportsman,
	extends(joePerson)).

    :- public(sport/1).
	:- public(stamina/1).
	:- public(weight/1).

    sport(snowboard).

	stamina(30).

	weight(111).

:- end_object.