Moose: Eine (post-)moderne OOP-Erweiterung für Perl
Weit mehr als ein einfaches CPAN-Modul, ist Moose die vielleicht wichtigste Spracherweiterung für Perl der letzten Jahre. Einige Anwender fragen bereits scherzhaft, ob der Elch (englisch Moose) das neue Kamel (Maskottchen und Titelbild des ersten Perlbuches) sei.
- Herbert Breunung
Weit mehr als ein einfaches CPAN-Modul, ist Moose die vielleicht wichtigste Spracherweiterung für Perl der letzten Jahre. Einige Anwender fragen bereits scherzhaft, ob der Elch (englisch Moose) das neue Kamel (Maskottchen und Titelbild des ersten Perlbuches) sei.
Tatsächlich verändert Moose bei tieferer Nutzung den Entwurf und das Aussehen von Programmen weit stärker als alle großen Änderungen seit Version 5.10 der Skriptsprache Perl zusammengenommen. Es bietet deutlich mehr als "Objekte, wie in Java", sondern auch Typisierung, Constraints (Subtypen), Delegation und Teilklassen. Sogar das Objektmodell selber lässt sich ändern und bietet auf den ersten Blick kaum überschaubare Möglichkeiten.
Die Wurzeln von Moose
Stevan Little, Hauptautor von Moose und Class::MOP, war zuvor an Pugs beteiligt (mehr Infos zum System auch in der Wikipedia). Dieses vom Spieltrieb und Audrey Tang geprägte Projekt, aus dem viele weitere Systeme hervorgingen, führte zum ersten Interpreter und Compiler, der größere Teile der Perl-6-Syntax ausführen konnte.
Die frühen Perl-6-Programme machten Stevan Little die großen Unterschiede zwischen den Sprachversionen 5 und 6 schmerzlich bewusst, was ihn schließlich zu Moose motivierte.
Das mit dem System eingeführte Meta-Objekt-Protokoll ist von Common Lisp beeinflusst, Funktionalität und Syntax sind wiederum meist Perl 6 nachempfunden (mehr zu Perl 6 auf heise Developer), soweit es innerhalb der Grenzen von Perl 5 möglich ist.
Nun gibt es Objektorientierung (kurz OOP) in Perl bereits seit 1994, in einer an das ältere Python angelehnten Semantik, welche sich fast vollständig auf grundlegende Funktionalität stützt. Damit sind Objekte ein wenig mehr als Referenzen die mit einem Namensraum verknüpft sind, dessen Routinen die Methoden darstellen. Damian Conway, seinerzeit Lehrstuhlinhaber für OOP, zeigte 1999 in seinem Klassiker "Object Oriented Perl", dass die Sprache hier sehr vielseitig und mächtig ist. Jedoch widersprach der objektorientierte Ansatz dem eigenen Designprinzip, einfache Dinge auch einfach zu halten – manch üblicher Handgriff wie das Schreiben einer new-Methode verlangte (unübliche) Detailarbeit und Anfängern unnötig viel Wissen ab.
Rund 36 Module im CPAN, die das Problem zu lösen trachten, sind ein deutliches Symptom für Handlungsbedarf. Dass die Verbesserungsansätze kaum zueinander kompatibel sind, verschlimmert die Situation zusätzlich. Selbst Damian Conways Class::Std konnte sich nicht durchsetzen, da es die Objekte "inside-out“ implementiert und daher ebenfalls nicht kompatibel ist.
Auf dem Siegeszug
Moose scheint dieses Kapitel abzuschließen und entwickelte sich während der letzten drei Jahre zum beliebtesten Rahmenwerk für OOP in Perl. Selbst bei so manchem Veteranen hat Moose das Interesse an Perl neu entfacht und auf der letzten OSCON war es eines von zwei Themen, das gleich doppelt vertreten war. Moose wurde sowohl von der Perl Foundation gefördert als auch von der Enlightend Perl Organisation in den Kanon der wichtigsten Module gewählt. Auf Perls zentraler Website und im vielbeachteten Buch "Modern Perl" wird es als der empfohlene Weg für das Erzeugen von Objekten ausgewiesen. Selbst die offiziellen Kerndokumentation wird es ab Version 5.16 empfehlen.
Firmen wie Yahoo!, Cisco und die BBC setzten es ein und auch Catalyst, Perls derzeit wichtigstes Web-Framework für größere Anwendungen (etwa mit Rails 3 vergleichbar), stellte vor etwa drei Jahren mit der Version 5.8 auf Moose um. Die jetzt von Ricardo Signes geführten Perl Porter beraten sogar darüber, wie viel der Moose-Syntax mit die nächsten beiden Sprachversionen in den Kern aufgenommen werden soll. Steven Little arbeitet deshalb an einem kleinen MOP für Perl 5, welches mit 5.18 in den Kern einfließen soll.