<< §5.4.1 Regular guards | ↑ Table of Contents ↑ | §5.4.3 Multiple guards >> |
§5.4.2 Base guards
The intention behind base guards is to prevent lifting of a callin-target
if a guard evaluates to false
and thus refuses to invoke the
callin bound role method. Using base guards it is easier to prevent any
side-effects caused by a callin binding, because lifting could cause side-effects
at two levels:
- Creating a role on-demand already is a side-effect (observable e.g.
by the reflective function
hasRole (§6.1)
) - Role creation triggers execution of a role constructor (see custom lifting constructor (§2.3.1.(c))) which could produce arbitrary side-effects.
Both kinds of side-effects can be avoided using a base guard which prevents unnecessary lifting.
Any guard (5.4.1 (b)-(e)) can be turned into a base guard by adding
the modifier base
as in:
protected class MyRole playedBy MyBase base when (base.value > MyTeam.this.threshold) { class body declarations }
However, different scoping rules apply for the identifiers that can be used in a base guard:
(a) Base object reference
In all base guard predicates the special identifier base
can be used to denote the base object that is about to be lifted.
(b) Method binding guards
A base method binding guard may access parameters as passed to the
base method. Parameter mappings are not considered.
Additionally, for after
callin bindings, the identifier result
may be used to refer to the result of the base method (if any).
Note:
In order to achieve the same effect of accessing the base method's result, a regular binding guard (not a base guard) must use a suitable parameter mapping (see §4.4.(c)).
(c) Method guards
In contrast to regular method guards, a base guard attached to a role method cannot access any method parameters. See the next item (d) for values that are actually in scope.
(d) Role level guards
Role level base guards may use these values:
- The base instance using the special identifier
base
. - The team instance using a qualified this references (
MyTeam.this
).
(e) Team level guards
Team level base guards have the same scope as role level base guards (d).
However, the type of the role instance is not known here, i.e., here base
has the static type java.lang.Object
.
(f) Unbound roles
In contrast to regular guards, base guards cannot be attached to
unbound role classes nor to their methods.
Only team level base guards are independent of role binding.

<< §5.4.1 Regular guards | ↑ Table of Contents ↑ | §5.4.3 Multiple guards >> |