# Class: Enumeration

## Enumeration

#### new Enumeration()

Subclasses of this class represent enumerated types. Instances of those subclasses represent possible values of those types. Enumerated type subclasses and their possible values can be defined as in the following: exports.Suit = Enumeration.specialize("id", "name", { SPADES: [0, "Spades"], HEARTS: [1, "Hearts"], DIAMONDS: [2, "Diamonds"], CLUBS: [3, "Clubs"] }); // To be use like this: myCard = {value: 12, suit: Suit.HEARTS}; Enumerated types can also be defined as class properties using the getterFor() constructor, as in the following: exports.Card = Montage.specialize({ value: { value: undefined }, suit: { value: undefined } }, { Suit: { get: Enumeration.getterFor("_Suit", "id", "name", { SPADES: [1, "Spade"], HEARTS: [2, "Heart"], DIAMONDS: [3, "Diamond"], CLUBS: [4, "Club"] }) } }); // To be use like this: myCard = new Card(); myCard.value = 12; myCard.suit = Card.Suit.HEARTS; In addition to being created as shown above, instances of an enumerated type subclasses can be created using a `with*()` class method that will be automatically generated for each subclass based on the subclass' property names, as in the following: Card.Suit.ROSES = Card.Suit.withIdAndName(5, "Roses"); Once instances of an enumerated type subclass are created they can be looked up using `for*()` class methods that will be automatically generated for each of the subclass's unique property names, as in the following: myCard.value = Math.floor(1 + 13 * Math.random()); myCard.suit = Card.Suit.forId(Math.floor(1 + 4 * Math.random()));

Source:
  - data/model/enumeration.js, line 74
To Do:
  - [Charles] Simplify this extremely, notably by making enumerations instances of the Enumeration class instead of subclasses of it and by reworking the getterFor() constructor.
  - [Charles] Switch to initial-caps enumeration value names like "Spades" instead of all-caps names like "NAMES".
  - [Charles] Provide a "values" property to the enumeration similar to Java's "values()" Enum method.

### Extends

- external:Montage

### Methods

#### (static) getterFor(key, uniquePropertyNamesopt, otherPropertyNamesopt, prototypeDescriptoropt, constructorDescriptoropt, constantsopt) → {function}

Creates and returns a getter which, when first called, will create and cache a new enumeration subclass with the specified attributes.

##### Parameters:

Name | Type | Attributes | Description
--- | --- | --- | ---
`key` | string |  |
`uniquePropertyNames` | Array.<string> | string | <optional> |
`otherPropertyNames` | Array.<string> | string | <optional> |
`prototypeDescriptor` | Object | <optional> |
`constructorDescriptor` | Object | <optional> |
`constants` | Object | <optional> |

Source:
  - data/model/enumeration.js, line 118
To Do:
  - [Charles] Simplify this API, replacing it with simpler methods like Enumeration.withNames(), Enumeration.withValues(), and Enumeration.withPrototypeAndValues().

##### Returns:

- A getter that will create and cache the desired Enumeration subclass.

Type
  function

#### (static) specialize(uniquePropertyNamesopt, otherPropertyNamesopt, prototypeDescriptoropt, constructorDescriptoropt, constantsopt) → {function}

Creates a new enumeration subclass with the specified attributes.

##### Parameters:

Name | Type | Attributes | Description
--- | --- | --- | ---
`uniquePropertyNames` | Array.<string> | string | <optional> |
`otherPropertyNames` | Array.<string> | string | <optional> |
`prototypeDescriptor` | Object | <optional> |
`constructorDescriptor` | Object | <optional> |
`constants` | Object | <optional> |

Source:
  - data/model/enumeration.js, line 92
To Do:
  - [Charles] Simplify this API, possibly by making "uniquePropertyNames", "otherPropertyNames", and "constants" properties of the derived instance, leaving "specialize()" to its "Montage.specialize()" API and meaning.

##### Returns:

- The created Enumeration subclass.

Type
  function