Das objektorientierte Prinzip funktioniert umso besser, je konsequenter man es anwendet. In diesem Fall besteht die Konsequenz darin, nicht das Attribut nach außen zu reichen, sondern eine Methode anzubieten, um auf dem Attribut zu operieren:
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{pgf}
\usepgfmodule{oo}
\pgfooclass{MyClass}{
\attribute name;
\attribute id;
\method MyClass(#1){ % constructor
\pgfooset{name}{#1}
\pgfooset{id}{\detokenize{#1}}
\pgfooset{name}{#1}%
\pgfooset{id}{\detokenize{#1}}%
}
\method printName() {
\pgfoovalueof{name}
{%
\pgfoovalueof{name}%
}
\method IdOperation(#1){%
\begingroup
\pgfooget{id}{\temporaryidvalue}%
\edef\temporaryaction{\noexpand\endgroup\noexpand#1{\temporaryidvalue}}%
\temporaryaction
}
}
\pgfoonew \myObject=new MyClass(EinName)
\begin{document}
\myObject.printName()
\section{Section}
\myObject.IdOperation(\label)
Lorem
\section{Another section}
Ipsum \myObject.IdOperation(\ref).
\end{document}
Noch konsequenter ist es, nur bestimmte Operationen zuzulassen und für jede einzelne dieser Operationen einzelne Methoden zur Verfügung zu stellen:
\documentclass{scrartcl}
\usepackage[utf8]{inputenc}
\usepackage{pgf}
\usepgfmodule{oo}
\pgfooclass{MyClass}{
\attribute name;
\method MyClass(#1){ % constructor
\pgfooset{name}{#1}
\pgfooset{label}{\detokenize{#1}}
\pgfooset{name}{#1}%
\pgfooset{label}{\detokenize{#1}}%
}
\method printName() {
\pgfoovalueof{name}
{%
\pgfoovalueof{name}%
}
\method set label(#1){
label(#1){%
\begingroup
\pgfoothis.get id(\temporaryidvalue)
\edef\temporaryaction{
\noexpand\endgroup\noexpand\label{objectid.\temporaryidvalue}}
id(\temporaryidvalue)%
\edef\temporaryaction{%
\noexpand\endgroup\noexpand\label{objectid.\temporaryidvalue}}%
\temporaryaction
}
\method show reference(){
reference(){%
\begingroup
\pgfoothis.get id(\temporaryidvalue)
\edef\temporaryaction{
\noexpand\endgroup\noexpand\ref{objectid.\temporaryidvalue}}
id(\temporaryidvalue)%
\edef\temporaryaction{%
\noexpand\endgroup\noexpand\ref{objectid.\temporaryidvalue}}%
\temporaryaction
}
\method show page reference(){
reference(){%
\begingroup
\pgfoothis.get id(\temporaryidvalue)
\edef\temporaryaction{
\noexpand\endgroup\noexpand\pageref{objectid.\temporaryidvalue}}
id(\temporaryidvalue)%
\edef\temporaryaction{%
\noexpand\endgroup\noexpand\pageref{objectid.\temporaryidvalue}}%
\temporaryaction
}
}
\pgfoonew \myObject=new MyClass(EinName)
\begin{document}
\myObject.printName()
\section{Section}
\myObject.set label()
Lorem
\section{Another section}
Ipsum \myObject.show reference().
\end{document}
Dabei mache ich mir auch gleich zu Nutze, dass `pgf` für jedes Objekt selbst bereits eine eindeutige Id erzeugt, die *zufällig* für Labels verwendbar ist. Man könnte das ggf. auch mit einem zusätzlichen `\detokenize` absichern. Notwendig ist das aber nicht.
Noch schöner wäre, wenn `pgf` auch private Methoden bieten würde. Dann könnte man `IdOperation` als private Operation anbieten und die drei Methoden `show reference`, `show page reference` und `set label` darauf aufbauend definieren.