| (none) — non-virtual (default) | node.m(...) | Inherited by sub-concepts but statically bound — cannot be overridden | A same-named method in a sub-concept's behavior shadows it (hazard) instead of overriding. Most Classifier_Behavior utilities in baseLanguage are non-virtual. |
virtual | node.m(...) | Dispatched at runtime by the node's actual concept; overridable in sub-concept behaviors | Set isVirtual: true explicitly. E.g. Expression.isLValue and every method of Type_Behavior in baseLanguage. |
abstract | node.m(...) (virtually dispatched) | No body; every non-abstract sub-concept must provide an implementation | Implies virtual — set both isAbstract and isVirtual. Declare on abstract/interface concepts (e.g. Classifier.findAncestor, IMemberContainer.getMembers in baseLanguage). |
final | node.m(...) | A virtual method that cannot be overridden further down | Rarely needed — a plain non-virtual method is already non-overridable. |
static | ConceptName.m(...) (qualified by concept name) | Belongs to the concept; no this; no dispatch | Concept-wide utilities, e.g. Classifier.getContextClassifier in baseLanguage. Called as LocalBehaviorMethodCall when unqualified inside the same ConceptBehavior. |
virtual static | conceptValue.m(...) on a concept<X> expression | Dispatched by the runtime concept value; overridable in sub-concept behaviors (link overriddenMethod) | Per-concept (not per-node) polymorphism — e.g. Expression.getPrecedenceLevel, Type.isValueType in baseLanguage, overridden across the smodel/collections behaviors. |