role Metamodel::ConcreteRoleHOW
Provides an implementation of a concrete instance of a role
does Metamodel::Namingdoes Metamodel::Versioningdoes Metamodel::PrivateMethodContainerdoes Metamodel::MethodContainerdoes Metamodel::MultiMethodContainerdoes Metamodel::AttributeContainerdoes Metamodel::RoleContainerdoes Metamodel::MultipleInheritancedoes Metamodel::ArrayTypedoes Metamodel::Concretization
You can use this to build roles, in the same way that ClassHOW
can be used to build classes:
my = Metamodel::ConcreteRoleHOW.new_type(name => "Bar");.^compose;say .^roles; # OUTPUT: «(Mu)»
The main difference with ClassHOW.new_type
is that you can mix-in roles in this newly created one.
This class is Rakudo specific, and provided only for completeness. Not really intended to be used by the final user.
Type Graph
Routines supplied by role Metamodel::Naming
Metamodel::ConcreteRoleHOW does role Metamodel::Naming, which provides the following routines:
(Metamodel::Naming) method name
method name()
Returns the name of the metaobject, if any.
say 42.^name; # OUTPUT: «Int»
(Metamodel::Naming) method set_name
method set_name(, )
Sets the new name of the metaobject.
Routines supplied by role Metamodel::Versioning
Metamodel::ConcreteRoleHOW does role Metamodel::Versioning, which provides the following routines:
(Metamodel::Versioning) method ver
method ver()
Returns the version of the metaobject, if any, otherwise returns Mu.
(Metamodel::Versioning) method auth
method auth()
Returns the author of the metaobject, if any, otherwise returns an empty string.
(Metamodel::Versioning) method api
method api()
Returns the API of the metaobject, if any, otherwise returns an empty string.
(Metamodel::Versioning) method set_ver
method set_ver(, )
Sets the version of the metaobject.
(Metamodel::Versioning) method set_auth
method set_auth(, )
Sets the author of the metaobject.
(Metamodel::Versioning) method set_api
method set_api(, )
Sets the API of the metaobject.
Routines supplied by role Metamodel::PrivateMethodContainer
Metamodel::ConcreteRoleHOW does role Metamodel::PrivateMethodContainer, which provides the following routines:
(Metamodel::PrivateMethodContainer) method add_private_method
method add_private_method(Metamodel::PrivateMethodContainer: , , )
Adds a private method $code
with name $name
.
(Metamodel::PrivateMethodContainer) method private_method_table
method private_method_table(Metamodel::PrivateMethodContainer: )
Returns a hash of name => &method_object
Routines supplied by role Metamodel::MethodContainer
Metamodel::ConcreteRoleHOW does role Metamodel::MethodContainer, which provides the following routines:
(Metamodel::MethodContainer) method add_method
method add_method(Metamodel::MethodContainer: , , )
Adds a method to the metaclass, to be called with name $name
. This should only be done before a type is composed.
(Metamodel::MethodContainer) method methods
method methods(Metamodel::MethodContainer: , :, :)
Returns a list of public methods available on the class (which includes methods from superclasses and roles). By default this stops at the classes Cool, Any or Mu; to really get all methods, use the :all
adverb. If :local
is set, only methods declared directly in the class are returned.
say A.^methods(); # xsay A.^methods(:all); # x infinite defined ...
The returned list contains objects of type Method, which you can use to introspect their signatures and call them.
Some introspection method-look-alikes like WHAT
will not show up, although they are present in any Perl 6 object. They are handled at the grammar level and will likely remain so for bootstrap reasons.
(Metamodel::MethodContainer) method method_table
method method_table(Metamodel::MethodContainer: --> Hash)
Returns a hash where the keys are method names, and the values are methods. Note that the keys are the names by which the methods can be called, not necessarily the names by which the methods know themselves.
(Metamodel::MethodContainer) method lookup
method lookup(Metamodel::MethodContainer: , --> Method)
Returns the first matching method object of the provided $name
or (Mu)
if no method object was found. The search for a matching method object is done by following the mro of $obj
. Note that lookup
is supposed to be used for introspection, if you're after something which can be invoked you probably want to use find_method instead.
say 2.5.^lookup("sqrt").perl: # OUTPUT: «method sqrt (Rat $: *%_) ...»say Str.^lookup("BUILD").perl; # OUTPUT: «submethod BUILD (Str $: :$value = "", *%_ --> Nil) ...»say Int.^lookup("does-not-exist"); # OUTPUT: «(Mu)»
The difference between find_method
and lookup
are that find_method
will use a default candidate for parametric roles, whereas lookup
throws an exception in this case, and that find_method
honors FALLBACK
methods, which lookup
does not.
Routines supplied by role Metamodel::AttributeContainer
Metamodel::ConcreteRoleHOW does role Metamodel::AttributeContainer, which provides the following routines:
(Metamodel::AttributeContainer) method add_attribute
method add_attribute(Metamodel::AttributeContainer: , )
Adds an attribute. $attribute
must be an object that supports the methods name
, type
and package
, which are called without arguments. It can for example be of type Attribute.
(Metamodel::AttributeContainer) method attributes
method attributes(Metamodel::AttributeContainer: )
Returns a list of attributes. For most Perl 6 types, these will be objects of type Attribute.
(Metamodel::AttributeContainer) method set_rw
method set_rw(Metamodel::AttributeContainer: )
Marks a type whose attributes default to having a write accessor. For example in
is rw
The is rw
trait on the class calls the set_rw
method on the metaclass, making all the attributes implicitly writable, so that you can write;
my = Point.new(x => 1, y => 2);.x = 42;
(Metamodel::AttributeContainer) method rw
method rw(Metamodel::AttributeContainer: )
Returns a true value if method set_rw has been called on this object, that is, if new public attributes are writable by default.
Routines supplied by role Metamodel::RoleContainer
Metamodel::ConcreteRoleHOW does role Metamodel::RoleContainer, which provides the following routines:
(Metamodel::RoleContainer) method add_role
method add_role(Metamodel::RoleContainer: , Mu )
Adds the $role
to the list of roles to be composed.
(Metamodel::RoleContainer) method roles_to_compose
method roles_to_compose(Metamodel::RoleContainer: --> List)
returns a list of roles added with add_role
, which are to be composed at type composition time.
Routines supplied by role Metamodel::MultipleInheritance
Metamodel::ConcreteRoleHOW does role Metamodel::MultipleInheritance, which provides the following routines:
(Metamodel::MultipleInheritance) method add_parent
method add_parent(Metamodel::MultipleInheritance: , , :)
Adds $parent
as a parent type. If $hides
is set to a true value, the parent type is added as a hidden parent.
$parent
must be a fully composed typed. Otherwise an exception of type X::Inheritance::NotComposed is thrown.
(Metamodel::MultipleInheritance) method parents
method parents(Metamodel::MultipleInheritance: , :, :)
Returns the list of parent classes. By default it stops at Cool, Any or Mu, which you can suppress by supplying the :all
adverb. With :tree
, a nested list is returned.
;is D ;is D ;is C1 is C2 ;is B ;say A.^parents(:all).perl;# OUTPUT: «(B, C1, C2, D, Any, Mu)»say A.^parents(:all, :tree).perl;# OUTPUT: «[B, ([C1, [D, [Any, [Mu]]]], [C2, [D, [Any, [Mu]]]])]»
(Metamodel::MultipleInheritance) method hides
method hides(Metamodel::MultipleInheritance: )
Returns a list of all hidden parent classes.
(Metamodel::MultipleInheritance) method hidden
method hidden(Metamodel::MultipleInheritance: )
Returns a true value if (and only if) the class is marked with the trait is hidden
.
(Metamodel::MultipleInheritance) method set_hidden
method set_hidden(Metamodel::MultipleInheritance: )
Marks the type as hidden.