Package-level declarations
Types
A single alias(Alias, Ref) fact, associating the ground term alias with the it.unibo.tuprolog.solve.libs.oop.Ref it names -- the mechanism backing $Alias dealiasing expressions and the default aliases (string, int, system, ...) OOPLib registers. New aliases can be added at solve-time via register/2 (it.unibo.tuprolog.solve.libs.oop.primitives.Register) and removed via unregister/1 (it.unibo.tuprolog.solve.libs.oop.primitives.Unregister); forObject and forType are the two convenience factories used to build the library's own default aliases.
The three clauses of the :=/2 operator, the entry point of :oop-lib's fluent syntax: it dispatches, based on whether its first argument is unbound and its second a cast expression, to either invoking a (possibly chained) method/constructor call (Invocation, Cast) or assigning a property (Assignment).
The ./2 (xfy, priority 800) operator that lets Prolog code chain member accesses fluently, e.g. Obj.foo(1).bar for "invoke foo(1) on Obj, then bar on the result".
fluent_reduce(+Expression, ?Result): reduces a fluent chain of accesses -- as built by the ./2 operator (it.unibo.tuprolog.solve.libs.oop.rules.Dot, e.g. Obj.foo(1).bar parses into the list [Obj, foo(1), bar]) -- down to a single Result, by repeatedly invoking each element of the list as a method on the result of invoking the previous one:
new_object(+Type, ?ObjectRef): sugar for NewObject3 with an empty argument list, i.e. invoking Type's no-argument public constructor.
property_reduce(+Expression, ?Ref, ?Property): splits a fluent chain Expression (see FluentReduce for the term shape, built by Dot) into the object/type Ref its final segment is a property of, and that final segment's name Property -- reducing every access before the last one exactly like FluentReduce does. This is what lets the third clause of :=/2 (it.unibo.tuprolog.solve.libs.oop.rules.ColonEquals.Assignment) turn Obj.foo(1).name := V into "invoke foo(1) on Obj, then assign V to name on the result".