=pod

=head1 OVERVIEW

This is a build directory for custom PMCs with a sample foo.pmc
providing the Foo PMC class.

=head1 CREATING A DYNAMIC PMC

=over 4

=item 1

Edit/create your foo.pmc source - For details on creating PMCs, see L<../classes/genclass.pl>

There are some differences you have to be aware of when creating dynamic PMCs.

When declaring the dynamic pmc, you must specify  the C<dynpmc> flag, as in:

	pmclass TclString extends tclobject dynpmc { ... }

Note that regular (non-dynamic) PMCs have a type id
C<enum_class_PMCNAME>, but dynamic PMCs obviously cannot use the same
thing. Instead, a dynamically-chosen value is assigned at runtime -
so, when you refer to the type of the class , you must dynamically
determine the PMC type. So, while C<perlscalar> (a builtin) has the
luxury of knowing at compile time what the class number of its child
C<PerlString> is, for example:

	if (type == enum_class_PerlString) {

A dynamic PMC such as C<tclobject> must instead perform a runtime lookup
of its corresponding C<TclString> PMC, resulting in the more complicated:

	if (type == pmc_type(
	        interpreter,
	        string_from_cstring(interpreter, "TclString", 9))
	   )

Finally, if you have a group of PMCs that are interdependent, use the
C<group GROUPNAME> syntax to trigger a group library to built. You
will use the group name as the name of the library to load using the
PASM op C<loadlib>.

        pmclass Match extends PerlHash dynpmc group match_group { ... }

and then in your .imc or .pasm file:

        loadlib $P0, "match_group"

=item 2

edit C<../config/gen/makefiles/dynclasses.in> and append your PMC(s) to 
the build target.

	$ make
	$ make shared
	$ cd dynclasses; make

=item 3

Try the sample dynamic class, Foo. Note that the numbers listed here will
change over time.

	$ ./parrot dynclasses/dynfoo.pasm
	ok 1
	41
	ok 2
	42

=item 4

There are two other similar test files: dynmatch.pasm and dyntcl.pasm.
They do pretty much the same thing as dynfoo, but they load in PMC
group libraries instead of a standalone PMC library.

If anything changes inside parrot, be sure to:

	$ cd dynclasses; make clean
