role Metamodel::MethodContainer { }
roles, classes, grammars and enums can contain methods. This role implements the API around storing and introspecting them.
say . name for Int . ^ methods ( : all );
Int . ^ add_method ( ' double ' , method ( $ x : ) { 2 * $ x } );
say 21 . double ;
method add_method ( Metamodel :: MethodContainer : $ obj , $ name , $ code )
Adds a method to the metaclass, to be called with name $name
. This should only be done before a type is composed.
method methods ( Metamodel :: MethodContainer : $ obj , : $ all , : $ local )
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.
class A {
method x () { } ;
}
say A . ^ methods ();
say A . ^ methods ( : all );
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.
method method_table ( Metamodel :: MethodContainer : D : $ obj --> Hash : D )
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.
method lookup ( Metamodel :: MethodContainer : $ obj , $ name --> 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 :
say Str . ^ lookup ( " BUILD " ) . perl ;
say Int . ^ lookup ( " does-not-exist " );
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.
Type relations for Metamodel::MethodContainer
perl6-type-graph
Metamodel::MethodContainer
Metamodel::MethodContainer
Mu
Mu
Any
Any
Any->Mu
Metamodel::Naming
Metamodel::Naming
Metamodel::Documenting
Metamodel::Documenting
Metamodel::Versioning
Metamodel::Versioning
Metamodel::PrivateMethodContainer
Metamodel::PrivateMethodContainer
Metamodel::MultiMethodContainer
Metamodel::MultiMethodContainer
Metamodel::AttributeContainer
Metamodel::AttributeContainer
Metamodel::RoleContainer
Metamodel::RoleContainer
Metamodel::MultipleInheritance
Metamodel::MultipleInheritance
Metamodel::Stashing
Metamodel::Stashing
Metamodel::TypePretense
Metamodel::TypePretense
Metamodel::RolePunning
Metamodel::RolePunning
Metamodel::ParametricRoleHOW
Metamodel::ParametricRoleHOW
Metamodel::ParametricRoleHOW->Metamodel::MethodContainer
Metamodel::ParametricRoleHOW->Any
Metamodel::ParametricRoleHOW->Metamodel::Naming
Metamodel::ParametricRoleHOW->Metamodel::Documenting
Metamodel::ParametricRoleHOW->Metamodel::Versioning
Metamodel::ParametricRoleHOW->Metamodel::PrivateMethodContainer
Metamodel::ParametricRoleHOW->Metamodel::MultiMethodContainer
Metamodel::ParametricRoleHOW->Metamodel::AttributeContainer
Metamodel::ParametricRoleHOW->Metamodel::RoleContainer
Metamodel::ParametricRoleHOW->Metamodel::MultipleInheritance
Metamodel::ParametricRoleHOW->Metamodel::Stashing
Metamodel::ParametricRoleHOW->Metamodel::TypePretense
Metamodel::ParametricRoleHOW->Metamodel::RolePunning
Metamodel::BaseType
Metamodel::BaseType
Metamodel::MROBasedMethodDispatch
Metamodel::MROBasedMethodDispatch
Metamodel::MROBasedTypeChecking
Metamodel::MROBasedTypeChecking
Metamodel::BUILDPLAN
Metamodel::BUILDPLAN
Metamodel::BoolificationProtocol
Metamodel::BoolificationProtocol
Metamodel::EnumHOW
Metamodel::EnumHOW
Metamodel::EnumHOW->Metamodel::MethodContainer
Metamodel::EnumHOW->Any
Metamodel::EnumHOW->Metamodel::Naming
Metamodel::EnumHOW->Metamodel::MultiMethodContainer
Metamodel::EnumHOW->Metamodel::AttributeContainer
Metamodel::EnumHOW->Metamodel::RoleContainer
Metamodel::EnumHOW->Metamodel::Stashing
Metamodel::EnumHOW->Metamodel::BaseType
Metamodel::EnumHOW->Metamodel::MROBasedMethodDispatch
Metamodel::EnumHOW->Metamodel::MROBasedTypeChecking
Metamodel::EnumHOW->Metamodel::BUILDPLAN
Metamodel::EnumHOW->Metamodel::BoolificationProtocol
Metamodel::ConcreteRoleHOW
Metamodel::ConcreteRoleHOW
Metamodel::ConcreteRoleHOW->Metamodel::MethodContainer
Metamodel::ConcreteRoleHOW->Any
Metamodel::ConcreteRoleHOW->Metamodel::Naming
Metamodel::ConcreteRoleHOW->Metamodel::Versioning
Metamodel::ConcreteRoleHOW->Metamodel::PrivateMethodContainer
Metamodel::ConcreteRoleHOW->Metamodel::MultiMethodContainer
Metamodel::ConcreteRoleHOW->Metamodel::AttributeContainer
Metamodel::ConcreteRoleHOW->Metamodel::RoleContainer
Metamodel::ConcreteRoleHOW->Metamodel::MultipleInheritance
Metamodel::Finalization
Metamodel::Finalization
Metamodel::DefaultParent
Metamodel::DefaultParent
Metamodel::C3MRO
Metamodel::C3MRO
Metamodel::Trusting
Metamodel::Trusting
Metamodel::Mixins
Metamodel::Mixins
Metamodel::ClassHOW
Metamodel::ClassHOW
Metamodel::ClassHOW->Metamodel::MethodContainer
Metamodel::ClassHOW->Any
Metamodel::ClassHOW->Metamodel::Naming
Metamodel::ClassHOW->Metamodel::Documenting
Metamodel::ClassHOW->Metamodel::Versioning
Metamodel::ClassHOW->Metamodel::PrivateMethodContainer
Metamodel::ClassHOW->Metamodel::MultiMethodContainer
Metamodel::ClassHOW->Metamodel::AttributeContainer
Metamodel::ClassHOW->Metamodel::RoleContainer
Metamodel::ClassHOW->Metamodel::MultipleInheritance
Metamodel::ClassHOW->Metamodel::Stashing
Metamodel::ClassHOW->Metamodel::MROBasedMethodDispatch
Metamodel::ClassHOW->Metamodel::MROBasedTypeChecking
Metamodel::ClassHOW->Metamodel::BUILDPLAN
Metamodel::ClassHOW->Metamodel::BoolificationProtocol
Metamodel::ClassHOW->Metamodel::Finalization
Metamodel::ClassHOW->Metamodel::DefaultParent
Metamodel::ClassHOW->Metamodel::C3MRO
Metamodel::ClassHOW->Metamodel::Trusting
Metamodel::ClassHOW->Metamodel::Mixins
Expand above chart