All persistent state in Shore is encapsulated in objects. An object has attributes, which define its persistent state, operations, which may change its state and/or return information about its current state, and relationships, which determine how it is related to other objects. An object also has a unique identity; that is, modifying the state of an object is different from creating a new object with the new state. Objects do not nest. Although a particular application may define a ``part-subpart'' relationship between two objects, each object has an independent identity and lifetime. A value is a unit of stored state. In contrast with objects, values may be nested but do not have independent identities. The state of an object is a value, as is the state of each attribute of the object and each component of a structured value.
Each object has a fixed-size
core
and an optional variable-size
extension.
The structure of the core is defined by an
interface definition
in SDL.
The extension supports variable-sized strings and sequences.
The user can also use the extension as a storage pool to allocate values
dynamically and link them to the core and to each other with
local references
(lrefs) which are converted to pointers (memory addresses) when they
are brought into memory.
Shore automatically brings objects into memory as an application traverses
relationships.
Large objects are faulted into memory incrementally, a page at
a time.
Each lref is adjusted as necessary to reflect the storage address used to
hold the page of the object to which it refers.