]> gitweb.factorcode.org Git - factor.git/blob - extra/roles/roles-docs.factor
d5b44081046742fd2c6a478eabccfd24e339eaa6
[factor.git] / extra / roles / roles-docs.factor
1 ! (c)2009 Joe Groff bsd license
2 USING: classes.mixin help.markup help.syntax kernel multiline roles ;
3 IN: roles
4
5 HELP: ROLE:
6 { $syntax "ROLE: name slots... ;
7 ROLE: name < role slots... ;
8 ROLE: name <{ roles... } slots... ;" }
9 { $description "Defines a new " { $link role } ". " { $link tuple } " classes which inherit this role will contain the specified " { $snippet "slots" } " as well as the slots associated with the optional inherited " { $snippet "roles" } "."
10 $nl
11 "Slot specifiers take one of the following three forms:"
12 { $list
13     { { $snippet "name" } " - a slot which can hold any object, with no attributes" }
14     { { $snippet "{ name attributes... }" } " - a slot which can hold any object, with optional attributes" }
15     { { $snippet "{ name class attributes... }" } " - a slot specialized to a specific class, with optional attributes" }
16 }
17 "Slot attributes are lists of slot attribute specifiers followed by values; a slot attribute specifier is one of " { $link initial: } " or " { $link read-only } ". See " { $link "tuple-declarations" } " for details." } ;
18
19 HELP: ROLE-TUPLE:
20 { $syntax "ROLE-TUPLE: name slots ;
21 ROLE-TUPLE: name < estate slots ;
22 ROLE-TUPLE: name <{ estates... } slots... ;" }
23 { $description "Defines a new " { $link tuple } " class."
24 $nl
25 "The list of inherited " { $snippet "estates" } " is optional; a single tuple superclass and/or a set of " { $link role } "s can be specified. If no superclass is provided, it defaults to " { $link tuple } "."
26 $nl
27 "Slot specifiers take one of the following three forms:"
28 { $list
29     { { $snippet "name" } " - a slot which can hold any object, with no attributes" }
30     { { $snippet "{ name attributes... }" } " - a slot which can hold any object, with optional attributes" }
31     { { $snippet "{ name class attributes... }" } " - a slot specialized to a specific class, with optional attributes" }
32 }
33 "Slot attributes are lists of slot attribute specifiers followed by values; a slot attribute specifier is one of " { $link initial: } " or " { $link read-only } ". See " { $link "tuple-declarations" } " for details." } ;
34
35 {
36     POSTPONE: ROLE:
37     POSTPONE: ROLE-TUPLE:
38 } related-words
39
40 HELP: role
41 { $class-description "The superclass of all role classes. A " { $snippet "role" } " is a " { $link mixin-class } " that includes a set of slot definitions that can be added to " { $link tuple } " classes alongside other " { $snippet "role" } "s." } ;
42
43 HELP: multiple-inheritance-attempted
44 { $class-description "This error is thrown if a " { $link POSTPONE: ROLE-TUPLE: } " definition attempts to inherit more than one " { $link tuple } " class." } ;
45
46 HELP: role-slot-overlap
47 { $class-description "This error is thrown if a " { $link POSTPONE: ROLE-TUPLE: } " or " { $link POSTPONE: ROLE: } " definition attempts to inherit a set of " { $link role } "s in which more than one attempts to define the same slot." } ;
48
49 ARTICLE: "roles" "Roles"
50 "The " { $vocab-link "roles" } " vocabulary provides a form of tuple interface that can be implemented by concrete tuple classes. A " { $link role } " definition is a mixin class that also prescribes a set of tuple slots. Roles are not tuple classes by themselves and cannot be instantiated by " { $link new } ". The vocabulary extends " { $link POSTPONE: ROLE-TUPLE: } " syntax to allow concrete tuple types to declare membership to one or more roles, automatically including their prescribed slots." $nl
51 "The role superclass:"
52 { $subsections role }
53 "Syntax for making a new role:"
54 { $subsection POSTPONE: ROLE: }
55 "Syntax for making tuples that use roles:"
56 { $subsection POSTPONE: ROLE-TUPLE: }
57 "Errors with roles:"
58 { $subsections multiple-inheritance-attempted role-slot-overlap } ;
59
60 ABOUT: "roles"