package php.runtime.lang;
import php.runtime.env.Environment;
import php.runtime.lang.support.IComparableObject;
import php.runtime.memory.ArrayMemory;
import php.runtime.reflection.ClassEntity;
import java.lang.ref.WeakReference;
import static php.runtime.annotation.Reflection.BaseType;
import static php.runtime.annotation.Reflection.Ignore;
@Ignore
@BaseType
abstract public class BaseWrapper<T> implements IObject, IComparableObject<BaseWrapper> {
protected final ArrayMemory __dynamicProperties__;
protected ClassEntity __class__;
protected final WeakReference<Environment> __env__;
private boolean __isFinalized;
protected T __wrappedObject;
public BaseWrapper(Environment env, T wrappedObject){
this(env, (ClassEntity) null);
__class__ = env.fetchClass(getClass());
__wrappedObject = wrappedObject;
}
public BaseWrapper(Environment env, ClassEntity clazz) {
this.__class__ = clazz;
this.__dynamicProperties__ = new ArrayMemory(true);
this.__env__ = new WeakReference<Environment>(env);
}
public T getWrappedObject() {
return __wrappedObject;
}
@Override
public int getPointer(){
return super.hashCode();
}
@Override
public ClassEntity getReflection() {
return __class__;
}
@Override
public ArrayMemory getProperties() {
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 boolean __equal(BaseWrapper iObject) {
return iObject.getWrappedObject() == getWrappedObject();
}
@Override
public boolean __identical(BaseWrapper iObject) {
return iObject.getWrappedObject() == getWrappedObject();
}
@Override
public boolean __greater(BaseWrapper iObject) {
return false;
}
@Override
public boolean __greaterEq(BaseWrapper iObject) {
return false;
}
@Override
public boolean __smaller(BaseWrapper iObject) {
return false;
}
@Override
public boolean __smallerEq(BaseWrapper iObject) {
return false;
}
public IObject __getOriginInstance() {
return this;
}
@Override
public String toString() {
if (__class__.methodMagicToString != null) {
Environment environment = getEnvironment();
if (environment != null) {
return environment.invokeMethodNoThrow(this, "__toString").toString();
}
}
return super.toString();
}
}