Cursus Raku / Objecten, in- en uitvoer en excepties / Klassen en objecten / Het meta-objectprotocol 🆕
Methoden toevoegen tijdens de uitvoering
Het MOP is niet alleen voor inspectie — het kan een type ook
veranderen terwijl het programma draait. De metamethode
.^add_method voegt een nieuwe methode aan een klasse
toe:
class Empty {
}
Empty.^add_method('greet', method { 'hi' });
say Empty.new.greet; # hiDe klasse Empty is gedefinieerd zonder ook maar één
methode. Empty.^add_method('greet', …) hangt er vervolgens
een methode met de naam greet aan, gegeven als een anonieme
method { … }. Vanaf dat punt reageert elk
Empty-object op .greet, precies alsof de
methode in de klasse geschreven was.
Dit is echte metaprogrammering: het metaobject voor
Empty krijgt te horen dat het een nieuwe methode moet laten
groeien. Hetzelfde protocol ligt onder mogelijkheden die je al gebruikt
hebt — conceptueel bouwt de compiler, wanneer je class,
role, has of method schrijft,
jouw type namens jou op via MOP-methoden als .^add_method
en .^add_attribute.
“Conceptueel”, omdat dit een model van de taal is, geen belofte over
een bepaalde compiler. Het MOP is datgene waarin het objectsysteem
gespecificeerd is; of een gegeven implementatie werkelijk elke
declaratie via die metamethoden leidt — en of je dat kunt waarnemen — is
aan die implementatie. Om dezelfde reden is het zelf aanroepen
van deze metamethoden implementatieafhankelijk: welke een compiler
blootstelt, en hoe die zich precies gedragen, kan verschillen, dus code
die naar .^add_method en verwanten grijpt draait misschien
niet op elke Raku hetzelfde.
Methoden toevoegen tijdens het draaien is een krachtig en zelden nodig gereedschap. De meeste programma’s grijpen er nooit naar, maar het is wat Raku’s objectsysteem open maakt: de regels van klassen zijn zelf in termen van het MOP geschreven, dus je kunt ze uitbreiden. Voor alledaagse code zijn de inspecterende metamethoden uit het vorige onderwerp het deel van het MOP dat je werkelijk zult gebruiken.
Cursusnavigatie
← Quiz — Het MOP | Vind een methode →
💪 Of ga direct naar de
oefeningen in deze sectie.