---------------------------------------------------------------------
 Perl 6 Object Meta Model
---------------------------------------------------------------------

This is a first sketch/prototype of the Perl 6 Object Meta Model. It 
is very much a work in progress, and any thoughts/ideas/suggestions
are very much welcome. 

Currently the people involved in this are:

    Stevan "stevan" Little & Sam "mugwump" Vilian 

Contact them on #perl6 for more details.

The many levels of introspection
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
There are several "layers" to the Perl 6 object system.  Overview
information can be found in:

    docs/meta_meta_classes.pod

off the Pugs root there is some more information:
    docs/class/*
    src/Pugs/Class.hs

Each level is currently being developed in parallel, as 

M1 - Class level - the language Model
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
The Perl 6 "clean" prototypes of Perl 6 core language entities, for
example the "Class" class defined as a class, can be found in;

    lib/*

These entities should be derived primarily from features required by
things in the Synopses.  In particular, most of S29 should end up
defined as methods on classes in this directory.

Currently in Pugs, the closest corresponding entities are;

  - Compiled Types:
      - MkType inserting to envClasses in Pugs/AST/Internals.hs

  - "Core" types, including "Classes":
      - Type in Pugs/Types.hs (as a base class)

      - VStr, VBool, VInt, VRat, VNum, VComplex, VHandle, VSocket,
	VThread, MatchPGE in Pugs/Types.hs

      - VRef, VOpaque, VControl, VScalar, VPair, VList, VSubst,
        VArray, VHash, VThunk, VProcess, VMatch, VCode, VJunc,
        VObject, VType in Pugs/AST/Internals.hs

Classes that are what you would get out of introspecting the Haskell
source at:

    lib/Pugs/*.pm 

Attribute names should be taken from the Haskell source where
possible.  Note that there are several Haskell constructs that are
hazy areas about how the same thing is written in Perl 6; Haskell is
an advanced language!

M2 - Meta::Class level - the langauge Meta-Model
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
These objects represent data structures capable of describing the M1
classes, and changes that are permitted to the M1 objects, such as
defining new Class traits.  These are being built in:

    lib/Meta/*.pm

M3 - Meta::Meta::Class - the language Meta-Meta-Model
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
These are designed to be a minimal set of classes that can describe
any Meta::Model.

If we follow the same path that SmallTalk72 did when they found the M3
was unnecessary, then perhaps the M3 will be unnecessary.

For now, the M3 is based on the core Class support in Pugs, and the
module;

    lib/Meta/Util.pm

This module generates accessors which support the Class::Tangram
collection message passing convention, which allows references and
collection properties of objects to "track" each other; see the last
few tests in t/01-util.t for an example of how this works.
