________________________________________________________________________

This file is part of Logtalk <https://logtalk.org/>  
SPDX-FileCopyrightText: 1998-2023 Paulo Moura <pmoura@logtalk.org>  
SPDX-License-Identifier: Apache-2.0

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
________________________________________________________________________


% start by loading the example:

| ?- logtalk_load(dynpred(loader)).
...


% sending to descendant the message p/1, returns the definition in root:

| ?- descendant::p(Value).

Value = root
yes


% asserting a local definition for p/1 in descendant overrides the inherited 
% definition:

| ?- descendant::(assertz(p(descendant)), p(Value)).

Value = descendant
yes


% if we retract the local definition, again the definition inherited from root
% will be used:

| ?- descendant::(retractall(p(_)), p(Value)).

Value = root
yes


% class does not understand the message p1/1 (the predicate is declared only 
% for the class descendant instances):

| ?- class::p1(X).

error(existence_error(predicate_declaration, p1(_)), class::p1(_), user)


% the same message is valid for the class instances:

| ?- instance::p1(X).

X = class
yes


% if we assert a clause for a new predicate, p2/1, in the class
% (a side-effect being a dynamic declaration of the predicate):

| ?- class::assertz(p2(class)).

yes


% the new predicate, like p1/1, is not available for the class:

| ?- class::p2(Value).

error(existence_error(predicate_declaration, p2(_)), class::p2(_), user)


% but is available for the class instances, the same way as p1/1:

| ?- instance::p2(X).

X = class
yes


% if we change our mind and abolish the new predicate:

| ?- class::abolish(p2/1).
yes

| ?- instance::p2(_).

error(existence_error(predicate_declaration,p2/1), logtalk(_,_))) :-


% using a prototype, assert three new predicates (the method object_assert/0 
% asserts the predicate public_predicate/0 from outside the prototype; the 
% method self_assert/0 asserts the predicate protected_predicate/0 in self; 
% the method this_assert/0 asserts the predicate private_predicate/0 in this):

| ?- prototype::(object_assert, self_assert, this_assert).

yes


% and check the resulting scope of each predicate:

| ?- prototype::dynamic_predicates.

public_predicate/0 - public
protected_predicate/0 - protected
private_predicate/0 - private
yes
