src/pmc/class.pmc - defines a class
This class implements the Class PMC,
as outlined in docs/pdds/pdd15_objects.pod.
Class is not derived from any other PMC.
The Class PMC structure (Parrot_Class) consists of twelve items:
id 
- The type number of the PMC.
[deprecated: See RT #48024]
 
name 
- The name of the class -- a STRING.
An empty STRING is allocated during initialization.
 
namespace 
- The namespace the class is associated with,
if any.
A Null PMC is allocated during initialization.
 
instantiated 
- A flag denoting whether this class has been instantiated since last modification.
A native integer with value zero is allocated during initialization.
 
parents 
- An array of immediate parent classes.
An empty ResizablePMCArray PMC is allocated during initialization.
 
all_parents 
- A cached array of ourself and all parent classes,
in MRO order.
A ResizablePMCArray PMC is allocated during initialization,
and is populated with the current class.
 
roles 
- An array of the roles this class has been composed from.
An empty ResizablePMCArray PMC is allocated during initialization.
 
methods 
- A directory of method names and method bodies this class provides.
An empty Hash PMC is allocated during initialization.
 
vtable_overrides 
- A directory of vtable method names and method bodies this class overrides.
An empty Hash PMC is allocated during initialization.
 
attrib_metadata 
- A directory of attribute names and attribute metadata this class contains.
An empty Hash PMC is allocated during initialization.
 
attrib_index 
- A lookup table for attributes in this class and parents.
A Null PMC is allocated during initialization.
 
attrib_cache 
- A cache of visible attribute names to attribute indexes.
A Null PMC is allocated during initialization.
 
vtable_cache 
- Cache of the vtable used for objects (only STM).
 
resolve_method 
- A list of method names the class provides used for name conflict resolution.
An empty ResizablePMCArray PMC is allocated during initialization.
 
void init() 
- Initializes a Class PMC.
 
void init_pmc(PMC *init_data) 
- The actual class creation code,
called from 
newclass opcode.
The init argument may either be the name of the class,
or a hash of initialization arguments.
The class is attatched to the current HLL namespace. 
PMC *subclass(PMC *name) 
- Creates a subclass,
optionally with a given 
name. 
void destroy() 
- Frees the memory associated with the class's underlying struct.
 
STRING *get_string() 
- Returns the name of the class (without the HLL namespace).
 
void mark() 
- Marks any referenced strings and PMCs in the structure as live.
 
void add_attribute(STRING *name, PMC *type) 
- Adds the given attribute (
name) with an optional type.
Creates a new class if the current class has been instantiated.
Enters the attribute in the attributes array.
Returns an error if an attribute of name already exists. 
void add_method(STRING *name, PMC *sub) 
- Adds the given sub PMC as a method with the given name.
 
void add_vtable_override(STRING *name, PMC *sub) 
- Adds the given sub PMC as a vtable override with the given name.
 
void add_parent(PMC *parent) 
- Adds the supplied PMC to the list of parents for the class.
 
void add_role(PMC *role) 
- Adds the supplied PMC to the list of roles for the class,
provided there are no conflicts.
 
PMC *inspect_str(STRING *what) 
- Provides introspection of a specific piece of information about the class.
The available information is:
 
- name
 
- String PMC containing the name of the class
 
- namespace
 
- NameSpace PMC of the the namespace attached to the class.
 
- attributes
 
- Hash keyed on attribute name,
where the value is a hash describing it.
 
- methods
 
- Hash keyed on method name,
value is an invokable PMC.
Includes methods composed in from roles.
 
- roles
 
- Array of Role PMCs.
Includes roles done by the roles that were composed into this class.
 
- parents
 
- Array of Class PMCs representing the direct parents of this class.
 
PMC *inspect() 
- Returns a Hash describing the class,
with key/value pairs as described in inspect_str.
 
PMC *clone() 
- Returns an anonymous copy of the class (with no name and no link to a namespace).
Unsets the instantiated flag,
allowing modifications.
 
PMC *clone_pmc(PMC *args) 
- Makes a copy of the class,
then modifies or adds to it based upon the contents of the supplied initialization data.
If a new name or namespace is not supplied in 
args then the cloned class will be anonymous.
The instantiated flag is unset to allow further modifications. 
PMC *instantiate(PMC *init) 
- Creates a new PMC object of the type of the class and calls init().
 
INTVAL isa_pmc(PMC *class) 
- Returns whether the class is or inherits from 
*class. 
INTVAL isa(STRING *classname) 
- Returns whether the class is or inherits from 
*classname. 
INTVAL does(STRING *role_name) 
- Returns whether the class does the role with the given 
*role_name. 
INTVAL does_pmc(PMC *role) 
- Returns whether the class does the given 
*role. 
INTVAL type() 
- Returns the integer type of the class.
 
void visit(visit_info *info) 
- This is used by freeze/thaw to visit the contents of the class.
 
*info is the visit info,
(see include/parrot/pmc_freeze.h). 
void freeze(visit_info *info) 
- Used to archive the class.
 
void thaw(visit_info *info) 
- Used to unarchive the class.
 
void thawfinish(visit_info *info) 
- Called after the class has been thawed.
 
void name(STRING *name :optional, int has_name :opt_flag) 
- Sets the name of the class,
and updates the namespace accoringly.
 
void get_namespace() 
- Gets the namespace that this class is attached to.
 
void resolve_method() 
- Sets the list of method names that the class provides to resolve conflicts in methods from roles.
When called with no parameter,
returns the list.
 
void new(PMC *args :slurpy :named) 
- Creates an instance of the object.
Initializes any attributes specified in the parameter list.
 
void attributes() 
- Return a hash where the keys are attribute names and the values are hashes providing a set of key/value pairs describing the attribute.
 
void add_attribute() 
- Add an attribute to the class.
Requires a name and,
optionally,
a type.
 
void methods() 
- Return a hash where the keys are method names and the values are methods.
 
void add_method(STRING *name, PMC *sub) 
- Adds the given sub PMC as a method with the given name.
Delegates to the 
add_method vtable method. 
PMC *find_method(STRING *name) 
- Walks the MRO of the class and finds the method with the given name.
 
void parents() 
- Returns the parents array PMC.
 
void add_parent(PMC *parent) 
- Adds the supplied PMC to the list of parents for the class.
 
void roles() 
- Returns the roles array PMC.
 
void add_role(PMC *role, PMC *exclude :optional :named("exclude"), PMC *alias :optional :named("alias")) 
- Composes a role into a class with the given exclusions and aliases.
 
void inspect(STRING *what :optional) 
- Gets all introspection data for the class or,
if the optional string parameter is supplied,
a particular item of introspection data.
 
void isa(STRING *class_name) 
- Returns true if this object is or derives from the class named in 
class_name,
false otherwise. 
void does(STRING *role_name) 
- Returns true if this object or one of its parents performs the named role,
false otherwise.
 
docs/pdds/pdd15_objects.pod.