I swear I had made one of these way back when. Here it is again.
git-svn-id: svn+ssh://src.earth.threerings.net/narya/trunk@5716 542714f4-19e9-0310-aa3c-eee0fc999fb1
This commit is contained in:
@@ -0,0 +1,116 @@
|
|||||||
|
//
|
||||||
|
// $Id$
|
||||||
|
|
||||||
|
package com.threerings.util {
|
||||||
|
|
||||||
|
import flash.utils.Proxy;
|
||||||
|
import flash.utils.flash_proxy;
|
||||||
|
|
||||||
|
use namespace flash_proxy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Acts like the passed-in Object, but prevents modifications.
|
||||||
|
*/
|
||||||
|
public class ImmutableProxyObject extends Proxy
|
||||||
|
{
|
||||||
|
public function ImmutableProxyObject (source :Object, throwErrors :Boolean = true)
|
||||||
|
{
|
||||||
|
_source = source;
|
||||||
|
_throwErrors = throwErrors;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function hasOwnProperty (name :String) :Boolean
|
||||||
|
{
|
||||||
|
return _source.hasOwnProperty(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function isPrototypeOf (theClass :Object) :Boolean
|
||||||
|
{
|
||||||
|
return _source.isPrototypeOf(theClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function propertyIsEnumerable (name :String) :Boolean
|
||||||
|
{
|
||||||
|
return _source.propertyIsEnumerable(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPropertyIsEnumerable (name :String, isEnum :Boolean = true) :void
|
||||||
|
{
|
||||||
|
immutable();
|
||||||
|
}
|
||||||
|
|
||||||
|
public function toString () :String
|
||||||
|
{
|
||||||
|
return _source.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// valueOf ?
|
||||||
|
|
||||||
|
override flash_proxy function callProperty (name :*, ... rest) :*
|
||||||
|
{
|
||||||
|
Function(_source[name]).apply(null, rest);
|
||||||
|
}
|
||||||
|
|
||||||
|
override flash_proxy function deleteProperty (name :*) :Boolean
|
||||||
|
{
|
||||||
|
immutable();
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// omitted: getDescendants
|
||||||
|
|
||||||
|
override flash_proxy function getProperty (key :*) :*
|
||||||
|
{
|
||||||
|
return _source[key];
|
||||||
|
}
|
||||||
|
|
||||||
|
override flash_proxy function hasProperty (key :*) :Boolean
|
||||||
|
{
|
||||||
|
return (key in _source);
|
||||||
|
}
|
||||||
|
|
||||||
|
// omitted: isAttribute
|
||||||
|
|
||||||
|
override flash_proxy function nextName (index :int) :String
|
||||||
|
{
|
||||||
|
return _itrKeys[index - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
override flash_proxy function nextNameIndex (index :int) :int
|
||||||
|
{
|
||||||
|
if (index == 0) {
|
||||||
|
_itrKeys = Util.keys(_source);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (index < _itrKeys.length) {
|
||||||
|
return index + 1;
|
||||||
|
} else {
|
||||||
|
_itrKeys = null;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
override flash_proxy function nextValue (index :int) :*
|
||||||
|
{
|
||||||
|
return _source[_itrKeys[index - 1]];
|
||||||
|
}
|
||||||
|
|
||||||
|
override flash_proxy function setProperty (name :*, value :*) :void
|
||||||
|
{
|
||||||
|
immutable();
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function immutable () :void
|
||||||
|
{
|
||||||
|
if (_throwErrors) {
|
||||||
|
throw new Error("You may not modify this object.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected var _source :Object;
|
||||||
|
|
||||||
|
protected var _throwErrors :Boolean;
|
||||||
|
|
||||||
|
protected var _itrKeys :Array;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user