package php.runtime.lang;
import php.runtime.Memory;
import php.runtime.annotation.Reflection;
import php.runtime.annotation.Reflection.BaseType;
import php.runtime.annotation.Reflection.Ignore;
import php.runtime.env.Environment;
import php.runtime.memory.ArrayMemory;
import php.runtime.reflection.ClassEntity;
import java.lang.ref.WeakReference;
@Ignore
@BaseType
abstract public class BaseObject implements IObject {
protected ArrayMemory __dynamicProperties__;
protected ClassEntity __class__;
protected final WeakReference<Environment> __env__;
private boolean isFinalized;
public BaseObject(Environment env){
this(env, null);
__class__ = env.fetchClass(getClass());
}
protected BaseObject(ClassEntity entity) {
this.__class__ = entity;
this.__dynamicProperties__ = null;
this.__env__ = new WeakReference<Environment>(null);
}
public BaseObject(Environment env, ClassEntity clazz) {
this.__class__ = clazz;
this.__dynamicProperties__ = new ArrayMemory(true);
this.__env__ = new WeakReference<Environment>(env);
}
@Override
final public int getPointer(){
return super.hashCode();
}
@Override
public ClassEntity getReflection() {
return __class__;
}
@Override
public ArrayMemory getProperties() {
if (__dynamicProperties__ == null) {
synchronized (this) {
if (__dynamicProperties__ != null) return __dynamicProperties__;
if (__dynamicProperties__ == null) {
__dynamicProperties__ = new ArrayMemory(true);
}
}
}
return __dynamicProperties__;
}
@Override
public Environment getEnvironment() {
return __env__.get();
}
@Override
public boolean isFinalized() {
return isFinalized;
}
@Override
public void doFinalize() {
isFinalized = true;
}
@Override
public boolean isMock() {
return __class__ == null;
}
@Override
public void setAsMock() {
__class__ = null;
}
@Override
public String toString() {
if (__class__.methodMagicToString != null) {
Environment environment = getEnvironment();
if (environment != null) {
return environment.invokeMethodNoThrow(this, "__toString").toString();
}
}
return super.toString();
}
}