Ein Attribute ist eine Einschränkung, dass das Objekt nur akzeptiert wird, wenn es für diese Einschränkung gültig ist.
Integer contains
{
valid is constraint; // is attribute, dass das gegenteil nicht ausschließt. Wird ein nicht valides Integer
// verlangt, ist ein valides auch okay.
invalid is valid~;
data is int;
public:
construct () := data : 0;
construct valid( int to data );
getValue2 is code() as int valid : data;
verify valid:
getValue is code() as int : data;
};
test is code( a is valid Integer ) as int :=
{
return a.getValue();
}
forward is code( a is Integer )
{
test( a ); // not ok, valid kann nicht garantiert werden
verify a as valid Integer
{
test( a ); // ok
}
else
{
print "a ist kein valider integer";
}
}
main is code() :=
{
v is Integer( 1 ); // -> valid
i is Integer(); // -> invalid
test( v ); // ok
test( i ); // not ok
}
Die Erweiterung ist auch notwendig, wenn ich beispielsweise ein Refactoring vornehme und erkläre, dass eine Funktion (und deren Ableitungen) bestimmte Funktionen nicht mehr aufrufen dürfen. Entsprechend „tagge“ ich die Funktionen und erkläre dass die Methode verlangt, dass keine getaggten Funktionen gerufen werden. Genauso umgekehrt: Diese Methode darf nur Funktionen rufen, die ein spezielles Tag besitzen.