/**
* Copyright (c) 2009-2011, The HATS Consortium. All rights reserved.
* This file is licensed under the terms of the Modified BSD License.
*/
package abs.backend.java.lib.runtime.metaABS;
import abs.backend.java.lib.runtime.ABSClosure;
import abs.backend.java.lib.runtime.ABSDynamicClass;
import abs.backend.java.lib.runtime.ABSDynamicObject;
import abs.backend.java.lib.types.ABSString;
import abs.backend.java.lib.types.ABSUnit;
import abs.backend.java.lib.types.ABSValue;
public class Clazz {
private static ABSDynamicClass thisClass;
/*
* Create singleton object
*/
public static ABSDynamicClass singleton() {
if (thisClass == null) {
thisClass = new ABSDynamicClass();
setupMetaAPI();
}
return thisClass;
}
/*
* Define the methods of this class
*/
public static void setupMetaAPI() {
thisClass.setName("Class");
thisClass.addMethod(/*ABSString*/ "getName", new ABSClosure() {
@Override
public ABSString exec(ABSDynamicObject t, ABSValue... params) {
ABSDynamicClass cls = (ABSDynamicClass)t.getFieldValue_Internal("class");
return ABSString.fromString(cls.getName());
}
});
thisClass.addMethod(/*ABSClosure*/ "getMethod", new ABSClosure() {
@Override
public ABSDynamicObject exec(ABSDynamicObject t, ABSValue... params) {
ABSDynamicClass cls = (ABSDynamicClass)t.getFieldValue_Internal("class");
ABSString name = (ABSString)params[0];
ABSClosure method = cls.getMethod(name.getString());
return method;
}
});
thisClass.addMethod(/*ABSUnit*/ "addMethod", new ABSClosure() {
@Override
public ABSUnit exec(ABSDynamicObject t, ABSValue... params) {
ABSDynamicClass cls = (ABSDynamicClass)t.getFieldValue_Internal("class");
ABSString name = (ABSString)params[0];
ABSClosure method = (ABSClosure)((ABSDynamicObject)params[1]).getFieldValue_Internal("method");
cls.addMethod(name.getString(), method);
return ABSUnit.UNIT;
}
});
thisClass.addMethod(/*ABSUnit*/ "removeMethod", new ABSClosure() {
@Override
public ABSUnit exec(ABSDynamicObject t, ABSValue... params) {
ABSDynamicClass cls = (ABSDynamicClass)t.getFieldValue_Internal("class");
ABSString name = (ABSString)params[0];
cls.removeMethod(name.getString());
return ABSUnit.UNIT;
}
});
}
}