We had originally intended to implement Guaranį in 100% Pure Java, by writing an extended Java interpreter in Java or by introducing interception mechanisms through a bytecode preprocessor. The first alternative was immediately discarded because it would imply poor performance and difficulties in handling native methods .
A bytecode preprocessor implementation was not possible either, due to restrictions imposed by the Java bytecode verifier  and the impossibility to rename native methods, needed in order to ensure their interception. We are currently working on a paper describing thoroughly the limitations we have encountered that have prevented us from pursuing further these implementation strategies.
Therefore, we have decided to implement Guaranį by modifying the Kaffe OpenVM TM, an open-source Java Virtual Machine. The performance impact due to the introduction of interception capabilities was quite small .
The Java Programming Language, however, has not been modified: any Java program, compiled with any Java compiler, will run on our implementation, within the limitations of the Kaffe OpenVM, and it will be possible to use reflective mechanisms in order to adapt and/or extend it.
The MOP of Guaranį can also be implemented in other object-oriented programming languages, or even upon existing reflective platforms, as an extension to their built-in MOPs. However, some particular features of Guaranį may be difficult to duplicate, if some design decisions of the target language or MOP conflict with those of Guaranį.