package org.libspark.common { import org.libspark.common.ability.IClonable; import org.libspark.common.ability.IComparable; import org.libspark.common.ability.ICopyable; import org.libspark.common.reflect.InstanceFactory; import org.libspark.common.store.IReadableStore; import org.libspark.common.store.IStorable; import org.libspark.common.store.IWritableStore; import org.libspark.common.support.CopySupport; import org.libspark.common.support.DeepCloneSupport; import org.libspark.common.support.DeepEqualSupport; import org.libspark.common.support.EqualSupport; import org.libspark.util.Classes; public class Any implements IAny { public function Any() { } //------------------------------------------------------ // 比較 //------------------------------------------------------ /** * 比較動作をカスタマイズしたい場合、このメソッドをオーバーライドします. * オーバーライドの例としては (TODO:具体的なクラス名) を参照して下さい. * デフォルトでは ICollector によって収集されたフィールドが比較対象になります. * * @see org.libspark.common.ability.IComprable#isEqual */ public function isEqual(other:IComparable):Boolean { if (!Classes.sameType(this, other)) { return false; } var support:EqualSupport = new EqualSupport(); support.compare(this, other as Any); return support.result; } /** * 基本的にはこのメソッドはオーバーライドしないて下さい. * 比較動作をカスタマイズしたい場合、isEqual メソッドをオーバーライドします. * * @see org.libspark.common.ability.IComprable#isDeepEqual * @see org.libspark.common.Any#isEqual */ public function isDeepEqual(other:IComparable):Boolean { if (!Classes.sameType(this, other)) { return false; } var support:DeepEqualSupport = new DeepEqualSupport(); support.compare(this, other as Any); return support.result; } //------------------------------------------------------ // 複製 //------------------------------------------------------ /** * 基本的にこのメソッドはオーバーライドしないて下さい. * インスタンスの生成動作をカスタマイズしたい場合は InstanceFactory を (TODO:もっと詳しい説明)、 * コピー動作をカスタマイズしたい場合は copyFrom メソッドをオーバーライドします. * * @see org.libspark.common.ability.IClonable#clone * @see org.libspark.common.Any#newInstance * @see org.libspark.common.Any#copyFrom */ public function get clone():IClonable { var cloned:Any = InstanceFactory.general.makeInstance(Classes.classOf(this)) as Any; cloned.copyFrom(this); return cloned; } /** * 基本的にこのメソッドはオーバーライドしないて下さい. * インスタンスの生成動作をカスタマイズしたい場合は InstanceFactory を使用します (TODO:もっと詳しい説明). * * @see org.libspark.common.ability.IClonable#deepClone * @see org.libspark.common.Any#newInstance */ public function get deepClone():IClonable { var support:DeepCloneSupport = new DeepCloneSupport(); support.makeDeepClone(this); return support.cloned; } /** * 基本的にこのメソッドはオーバーライドしないて下さい. * コピー動作をカスタマイズしたい場合は copyFrom メソッドをオーバーライドします. * * @see org.libspark.common.ability.ICopyable#copy * @see org.libspark.common.Any#copyFrom */ public function copy(from:ICopyable):void { copyFrom(from as Any); } /** * 基本的にこのメソッドはオーバーライドしないて下さい. * コピー動作をカスタマイズしたい場合は copyFrom メソッドをオーバーライドします. * * @see org.libspark.common.ability.ICopyable#deepCopy * @see org.libspark.common.Any#copyFrom */ public function deepCopy(from:ICopyable):void { copyFrom((from as Any).deepClone as Any); } /** * 全てのフィールドが 'other' と等しくなるように設定します. * 特別な動作が必要な場合はこのメソッドをオーバーライドして下さい. その際、super.copyFrom は呼び出しても呼び出さなくても構いません. * デフォルトでは、ICollector によって収集されたフィールドを IProvider によって設定します. * * Require: other != null * Ensure: isEqual(this, other) */ protected function copyFrom(other:Any):void { var support:CopySupport = new CopySupport(); other.store(support); restore(support); } //------------------------------------------------------ // ISerializable //------------------------------------------------------ public function serialize(to:IWritableStore):void { store(to); } public function deserialize(from:IReadableStore):void { restore(from); } //------------------------------------------------------ // IStorable //------------------------------------------------------ public function store(to:IWritableStore):void { } public function restore(from:IReadableStore):void { } } }