| |
let
TraitSupport = load "Traits.lf" // import meta model for traits
in
(|
// keyword 'trait'
trait = (\TraitName:: (\TraitConstructor:: TraitConstructor (| traitName = TraitName |))),
// keyword 'provides'
provides = (\Args:: (\Provided:: (\ReqCont:: ReqCont (| Args, provides = Provided |)))),
// keyword 'requires'
requires = (\Args:: (\Required:: TraitSupport.newTrait (| Args, requires = Required |))),
// trait composition
// keyword 'join'
join = (\Args:: (\Left:: (\JoinCont:: JoinCont (| Args, left = Left |)))),
// keyword 'with'
with = (\Args:: (\Right:: TraitSupport.composeTraits (| Args, right = Right |))),
// Auxiliaries
// keyword 'refine'
refine = (\Trait:: (\TraitModifier:: TraitModifier (| trait = Trait |))),
// Method aliasing, keyword 'aliases'
aliases = (\Args:: (\Aliases:: TraitSupport.aliasMethods (| Args, aliases = Aliases |))),
// Method exclusion, keyword 'exclude'
exclude = (\Args:: (\Exclude:: TraitSupport.excludeMethods (| Args, excludes = Exclude |)))
|)
end
|