=pod
=head1 NAME
10,000 ft view of the Perl6 MetaModel (2.0)
=head1 DISCLAIMER
It should be noted that version 2.0 of the Metamodel is not yet
complete, and is still missing some core features. However it
currently does have the base elements needed to support those
additional features. This document describes the current state
of the metamodel, so it I<will> change.
=head1 NOTATIONAL CONVENTIONS
i(Foo) - instance of Foo
class(Foo) - the instance of Class named "Foo"
=head1 DESCRIPTION
Here is the basic layout of the metamodel 2.0 (in ASCII art).
<user space> <meta space>
-----------------------------------------------------------
:
+---------------+ :
| i(Foo) | :
+---------------+ :
| class |----+ :
| instance_data | | :
+---------------+ | :
| :
+--------------------------+ :
| :
| +---------------+ : +---------------+
+---->| class(Foo) | +---:---->| class(Class) |<---+
+---------------+ | : +---------------+ |
| class |---+ : | class |----+
+---------------+ : +---------------+
| name | : | name |
| version | : | version |
| authority | : | authority |
| %methods | : | %methods |
| %attributes | : | %attributes |
| ... | : | ... |
+---------------+ : +---------------+
:
=head1 BOOTSTRAPPING
This is a rough description of the bootstrapping process. It follows the
files which are loaded, and what those files do.
=over 4
=item I<chaos.pl>
This file contains all the primitive elements needed for the meta-model
including global functions (C<WALKMETH>, C<WALKCLASS>, etc.), method
generators, tagged attribute types, and opaque instance creators.
This is also where the Perl 5 magic exists to allow for "normal" method
dispatching behavior.
=item I<gnosis.pl>
This file creates a the basic class C<$::Class> manually, and then adds the
C<add_method> function to it. This is the very first "object" in our system
and after this is loaded, we can actually start using it as such.
=item I<metamorph.pl>
This fills in the remaining methods in C<$::Class>, each method giving
C<$::Class> more and more capabilities. It also then defines the attributes
of C<$::Class>.
Once this file is loaded, we have a fully formed class C<$::Class>, however
it is not over yet.
=item I<pneuma.pl>
This file constructs C<$::Object> using the same tools used in F<gnosis.pl>
and F<metamorph.pl>.
=item I<genesis.pl>
This file connects C<$::Class> to C<$::Object> by adding C<$::Object> to
C<$::Class>'s superclass list. We also manually populate the MRO's of both
classes to avoid meta-circularity issues.
We now have a working object model, and at this point, the following things
are true:
class($::Class) is an instance of $::Class
class($::Object) is an instance of $::Class
$::Class is a subclass of $::Object
Or represented visually here:
---> is subclass of
...> is instance of
class($::Class)
: ^
: :
V :
$::Class ------+
^ |
: |
: |
class($::Object) |
^ |
: |
: |
$::Object <-----+
=item I<Perl6::MetaModel>
This package loads all the other files above, and then provides what I
am calling a "macro" layer to make class construction easier. This layer
will likely be handled by the language parser in a real implementation,
but is here purely for prototyping/testing convenience.
=back
=head1 AUTHOR
This basically means that anything incorrect in here is my fault.
Stevan Little E<lt>stevan@iinteractive.comE<gt>
=cut