//
// Copyright (c) 2009, Brian Frank and Andy Frank
// Licensed under the Academic Free License version 3.0
//
// History:
// 14 Jul 09 Brian Frank Creation
// 04 Feb 10 Brian Frank Rework from old Symbol design
//
**************************************************************************
** Serializable
**************************************************************************
**
** Serializable is a facet used to annotate types which can be serialized.
** Objects are serialized via `sys::OutStream.writeObj` and deserialized
** via `sys::InStream.readObj`.
**
** See the [Serialization Doc]`docLang::Serialization` for details.
**
@FacetMeta { inherited = true }
facet class Serializable
{
**
** Simples are serialized atomically via a customized string representation
** using the following rules:
** - Override `sys::Obj.toStr` to return a suitable string representation
** of the object.
** - Must declare a static method called 'fromStr' which takes one 'Str'
** parameter and returns an instance of the declaring type. The 'fromStr'
** method may contain additional parameters if they declare defaults.
**
const Bool simple := false
**
** Collections are serialized with a collection of child objects
** using the following rules where 'Item' is the item type:
** - Provide an 'add(Item)' method to add child items during 'readObj'
** - Provide an 'each(|Item| f)' method to iterate child items
** during 'writeObj'
**
const Bool collection := false
}
**************************************************************************
** Transient
**************************************************************************
**
** Transient annotates fields which should not be serialized. It is used inside
** a `Serializable` type. See the [Serialization Doc]`docLang::Serialization`
** for details.
**
facet class Transient {}
**************************************************************************
** Js
**************************************************************************
**
** Used to annoate types which should be compiled into JavaScript.
**
facet class Js {}
**************************************************************************
** NoDoc
**************************************************************************
**
** Annotate a type or slot as undocumented. This facet indicates an API
** should not be documented with automated tools such as [Fandoc]`fandoc::pod-doc`.
** As a developer you should avoid using these types and slots since they
** are explicitly marked as not part of the public API.
**
facet class NoDoc {}
**************************************************************************
** Deprecated
**************************************************************************
**
** Indicates that a type or slot is obsolete
**
facet class Deprecated
{
**
** Message for compiler output when deprecated type or slot is used.
**
const Str msg := ""
}
**************************************************************************
** Operator
**************************************************************************
**
** Used on methods to indicate method may be used as an operator.
** The operator symbol is determined by the method name:
**
** prefix symbol degree
** ------ ------ ------
** negate -a unary
** increment ++a unary
** decrement --a unary
** plus a + b binary
** minus a - b binary
** mult a * b binary
** div a / b binary
** mod a % b binary
** get a[b] binary
** set a[b] = c ternary
** add a { b, }
**
** In the case of binary operators multiple methods may
** be declared for a given symbol as long as every method starts
** with correct name, for example "plus" and "plusInt". For
** unary/ternary operators there can only be one method and it must
** be named exactly "negate", "increment", "decrement", or "set".
**
** See [docLang]`docLang::Methods#operators` for additional details.
**
facet class Operator {}
**************************************************************************
** FacetUsage
**************************************************************************
**
** Facet meta-data applied to facet classes.
**
facet class FacetMeta
{
**
** Indicates whether the facet is inherited by sub-types.
** See [docLang]`docLang::Facets#inheritance` for additional details.
**
const Bool inherited := false
}