
## Property

A `Property` represents custom property behavior that can be defined on many objects if you so desire.

These are most useful when defining the properties of a new `Type`.

```CoffeeScript
MyType = Type
	instance:

```

There are a plethora of use cases for the `Property` type. Be sure to read all of the examples to see what's possible.

---

### Glossary

&nbsp;&nbsp;&nbsp;&nbsp;
[Options]()

&nbsp;&nbsp;&nbsp;&nbsp;
[Properties]()

&nbsp;&nbsp;&nbsp;&nbsp;
[Examples]()

---

### Options

If you decide to pass an options object when constructing a `Property`, these are the recognized options:

-

#### value

Type: `Any`

Required: **No**

Default: `undefined`

The initial value of this property.

-

#### type

Type: `Type.Kind` or `ArrayOf(Type.Kind)`

Required: **No**

Default: `Any`

If this property is ever set to an invalid type, a `TypeError` will be thrown.

-

#### lazy

Type: `Function.Kind`

Required: **No**

Default: `undefined`

This function is called the first time this property is accessed via the getter.

-

#### get(currentValue)

Type: `Boolean`

Required: **No**

Default: `false`

-

#### set(newValue, oldValue)

Type: `Boolean`

Required: **No**

Default: `false`

-

#### willSet(newValue, currentValue)

Type: `Boolean`

Required: **No**

Default: `false`

-

#### didSet(oldValue, currentValue)

Type: `Boolean`

Required: **No**

Default: `false`

-

#### enumerable

Type: `Boolean`

Required: **No**

Default: `false`

-

#### writable

Type: `Boolean`

Required: **No**

Default: `false`

-

#### configurable

Type: `Boolean`

Required: **No**

Default: `false`

---

### Properties

The options object you pass when creating a `Property` is turned into the created `Property`; thus, all keys defined on the options object will be accessible on the returned `Property` instance.

These properties are available on all `Property` instances:

-

#### define(object, key)

Defines this `Property` using the passed `key` with the passed `object`.

---

### Examples

#### 
