public IJsValue SetValue(IJsValue self, IJsValue value)
        {
            if (!Writable)
            {
                throw new JsReferenceException("Property {0} is not writable", Name);
            }
            if (!ReferenceEquals(self, Owner))
            {
                // We are setting an inherited property in a subclassed instance
                var @this = self.Cast<IJsObject>("Cannot set property {0} on non-object", Name);

                // Is the property present in subclassed instance?
                var pd = @this.GetOwnProperty(Name);
                if (pd != null)
                {
                    return pd.SetValue(self, value);
                }

                // If not, create it and return
                @this.DefineOwnProperty(new OwnedValuePropertyDescriptor(@this, Name, value, Flags));
                return value;
            }

            return Value = value;
        }