#+begin_src prolog :tangle oop.pl
call_method(Instance, ClassName, Body) :-
is_instance(Instance, ClassName),
+ asserta(is_instance(this, ClassName)),
define_this(Instance),
- call(Body),
- retractall(field(this, _, _)).
+ call_cleanup(call(Body), (
+ retractall(is_instance(this, ClassName)),
+ retractall(field(this, _, _)))).
#+end_src
** check_value_type
call_method(Instance, ClassName, Body) :-
is_instance(Instance, ClassName),
+ asserta(is_instance(this, ClassName)),
define_this(Instance),
- call(Body),
- retractall(field(this, _, _)).
+ call_cleanup(call(Body), (
+ retractall(is_instance(this, ClassName)),
+ retractall(field(this, _, _)))).
check_value_type(nil, _X) :- !.
check_value_type(var, X) :- var(X), !.