using CPF.Mac.Foundation;
using CPF.Mac.ObjCRuntime;
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;

namespace CPF.Mac.CoreData
{
	[Register("NSManagedObject", true)]
	public class NSManagedObject : NSObject
	{
		private static readonly IntPtr selManagedObjectContextHandle = Selector.GetHandle("managedObjectContext");

		private static readonly IntPtr selEntityHandle = Selector.GetHandle("entity");

		private static readonly IntPtr selObjectIDHandle = Selector.GetHandle("objectID");

		private static readonly IntPtr selIsInsertedHandle = Selector.GetHandle("isInserted");

		private static readonly IntPtr selIsUpdatedHandle = Selector.GetHandle("isUpdated");

		private static readonly IntPtr selIsDeletedHandle = Selector.GetHandle("isDeleted");

		private static readonly IntPtr selIsFaultHandle = Selector.GetHandle("isFault");

		private static readonly IntPtr selObservationInfoHandle = Selector.GetHandle("observationInfo");

		private static readonly IntPtr selSetObservationInfo_Handle = Selector.GetHandle("setObservationInfo:");

		private static readonly IntPtr selChangedValuesHandle = Selector.GetHandle("changedValues");

		private static readonly IntPtr selHasChangesHandle = Selector.GetHandle("hasChanges");

		private static readonly IntPtr selChangedValuesForCurrentEventHandle = Selector.GetHandle("changedValuesForCurrentEvent");

		private static readonly IntPtr selInitWithEntityInsertIntoManagedObjectContext_Handle = Selector.GetHandle("initWithEntity:insertIntoManagedObjectContext:");

		private static readonly IntPtr selHasFaultForRelationshipNamed_Handle = Selector.GetHandle("hasFaultForRelationshipNamed:");

		private static readonly IntPtr selWillAccessValueForKey_Handle = Selector.GetHandle("willAccessValueForKey:");

		private static readonly IntPtr selDidAccessValueForKey_Handle = Selector.GetHandle("didAccessValueForKey:");

		private static readonly IntPtr selWillChangeValueForKey_Handle = Selector.GetHandle("willChangeValueForKey:");

		private static readonly IntPtr selDidChangeValueForKey_Handle = Selector.GetHandle("didChangeValueForKey:");

		private static readonly IntPtr selWillChangeValueForKeyWithSetMutationUsingObjects_Handle = Selector.GetHandle("willChangeValueForKey:withSetMutation:usingObjects:");

		private static readonly IntPtr selDidChangeValueForKeyWithSetMutationUsingObjects_Handle = Selector.GetHandle("didChangeValueForKey:withSetMutation:usingObjects:");

		private static readonly IntPtr selAwakeFromFetchHandle = Selector.GetHandle("awakeFromFetch");

		private static readonly IntPtr selAwakeFromInsertHandle = Selector.GetHandle("awakeFromInsert");

		private static readonly IntPtr selWillSaveHandle = Selector.GetHandle("willSave");

		private static readonly IntPtr selDidSaveHandle = Selector.GetHandle("didSave");

		private static readonly IntPtr selWillTurnIntoFaultHandle = Selector.GetHandle("willTurnIntoFault");

		private static readonly IntPtr selDidTurnIntoFaultHandle = Selector.GetHandle("didTurnIntoFault");

		private static readonly IntPtr selValueForKey_Handle = Selector.GetHandle("valueForKey:");

		private static readonly IntPtr selSetValueForKey_Handle = Selector.GetHandle("setValue:forKey:");

		private static readonly IntPtr selPrimitiveValueForKey_Handle = Selector.GetHandle("primitiveValueForKey:");

		private static readonly IntPtr selSetPrimitiveValueForKey_Handle = Selector.GetHandle("setPrimitiveValue:forKey:");

		private static readonly IntPtr selCommittedValuesForKeys_Handle = Selector.GetHandle("committedValuesForKeys:");

		private static readonly IntPtr selValidateValueForKeyError_Handle = Selector.GetHandle("validateValue:forKey:error:");

		private static readonly IntPtr selValidateForDelete_Handle = Selector.GetHandle("validateForDelete:");

		private static readonly IntPtr selValidateForInsert_Handle = Selector.GetHandle("validateForInsert:");

		private static readonly IntPtr selValidateForUpdate_Handle = Selector.GetHandle("validateForUpdate:");

		private static readonly IntPtr class_ptr = Class.GetHandle("NSManagedObject");

		private object __mt_ManagedObjectContext_var;

		private object __mt_Entity_var;

		private object __mt_ObjectID_var;

		private object __mt_ChangedValues_var;

		private object __mt_ChangedValuesForCurrentEvent_var;

		public override IntPtr ClassHandle => class_ptr;

		public virtual NSManagedObjectContext ManagedObjectContext
		{
			[Export("managedObjectContext")]
			get
			{
				return (NSManagedObjectContext)(__mt_ManagedObjectContext_var = ((!IsDirectBinding) ? ((NSManagedObjectContext)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selManagedObjectContextHandle))) : ((NSManagedObjectContext)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selManagedObjectContextHandle)))));
			}
		}

		public virtual NSEntityDescription Entity
		{
			[Export("entity")]
			get
			{
				return (NSEntityDescription)(__mt_Entity_var = ((!IsDirectBinding) ? ((NSEntityDescription)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selEntityHandle))) : ((NSEntityDescription)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selEntityHandle)))));
			}
		}

		public virtual NSManagedObjectID ObjectID
		{
			[Export("objectID")]
			get
			{
				return (NSManagedObjectID)(__mt_ObjectID_var = ((!IsDirectBinding) ? ((NSManagedObjectID)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selObjectIDHandle))) : ((NSManagedObjectID)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selObjectIDHandle)))));
			}
		}

		public virtual bool IsInserted
		{
			[Export("isInserted")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selIsInsertedHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selIsInsertedHandle);
			}
		}

		public virtual bool IsUpdated
		{
			[Export("isUpdated")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selIsUpdatedHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selIsUpdatedHandle);
			}
		}

		public virtual bool IsDeleted
		{
			[Export("isDeleted")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selIsDeletedHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selIsDeletedHandle);
			}
		}

		public virtual bool IsFault
		{
			[Export("isFault")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selIsFaultHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selIsFaultHandle);
			}
		}

		public virtual IntPtr ObservationInfo
		{
			[Export("observationInfo")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.IntPtr_objc_msgSend(base.Handle, selObservationInfoHandle);
				}
				return Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selObservationInfoHandle);
			}
			[Export("setObservationInfo:")]
			set
			{
				if (IsDirectBinding)
				{
					Messaging.void_objc_msgSend_IntPtr(base.Handle, selSetObservationInfo_Handle, value);
				}
				else
				{
					Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selSetObservationInfo_Handle, value);
				}
			}
		}

		public virtual NSDictionary ChangedValues
		{
			[Export("changedValues")]
			get
			{
				return (NSDictionary)(__mt_ChangedValues_var = ((!IsDirectBinding) ? ((NSDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selChangedValuesHandle))) : ((NSDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selChangedValuesHandle)))));
			}
		}

		[Since(5, 0)]
		public virtual bool HasChanges
		{
			[Export("hasChanges")]
			get
			{
				if (IsDirectBinding)
				{
					return Messaging.bool_objc_msgSend(base.Handle, selHasChangesHandle);
				}
				return Messaging.bool_objc_msgSendSuper(base.SuperHandle, selHasChangesHandle);
			}
		}

		public virtual NSDictionary ChangedValuesForCurrentEvent
		{
			[Export("changedValuesForCurrentEvent")]
			get
			{
				return (NSDictionary)(__mt_ChangedValuesForCurrentEvent_var = ((!IsDirectBinding) ? ((NSDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper(base.SuperHandle, selChangedValuesForCurrentEventHandle))) : ((NSDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend(base.Handle, selChangedValuesForCurrentEventHandle)))));
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		[Export("initWithCoder:")]
		public NSManagedObject(NSCoder coder)
			: base(NSObjectFlag.Empty)
		{
			if (IsDirectBinding)
			{
				base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, Selector.InitWithCoder, coder.Handle);
			}
			else
			{
				base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, Selector.InitWithCoder, coder.Handle);
			}
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		public NSManagedObject(NSObjectFlag t)
			: base(t)
		{
		}

		[EditorBrowsable(EditorBrowsableState.Advanced)]
		public NSManagedObject(IntPtr handle)
			: base(handle)
		{
		}

		[Export("initWithEntity:insertIntoManagedObjectContext:")]
		public NSManagedObject(NSEntityDescription entity, NSManagedObjectContext context)
			: base(NSObjectFlag.Empty)
		{
			if (entity == null)
			{
				throw new ArgumentNullException("entity");
			}
			if (context == null)
			{
				throw new ArgumentNullException("context");
			}
			if (IsDirectBinding)
			{
				base.Handle = Messaging.IntPtr_objc_msgSend_IntPtr_IntPtr(base.Handle, selInitWithEntityInsertIntoManagedObjectContext_Handle, entity.Handle, context.Handle);
			}
			else
			{
				base.Handle = Messaging.IntPtr_objc_msgSendSuper_IntPtr_IntPtr(base.SuperHandle, selInitWithEntityInsertIntoManagedObjectContext_Handle, entity.Handle, context.Handle);
			}
		}

		[Export("hasFaultForRelationshipNamed:")]
		public virtual bool HasFaultForRelationshipNamed(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			IntPtr intPtr = NSString.CreateNative(key);
			bool result = (!IsDirectBinding) ? Messaging.bool_objc_msgSendSuper_IntPtr(base.SuperHandle, selHasFaultForRelationshipNamed_Handle, intPtr) : Messaging.bool_objc_msgSend_IntPtr(base.Handle, selHasFaultForRelationshipNamed_Handle, intPtr);
			NSString.ReleaseNative(intPtr);
			return result;
		}

		[Export("willAccessValueForKey:")]
		public virtual void WillAccessValueForKey(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			IntPtr intPtr = NSString.CreateNative(key);
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr(base.Handle, selWillAccessValueForKey_Handle, intPtr);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selWillAccessValueForKey_Handle, intPtr);
			}
			NSString.ReleaseNative(intPtr);
		}

		[Export("didAccessValueForKey:")]
		public virtual void DidAccessValueForKey(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			IntPtr intPtr = NSString.CreateNative(key);
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr(base.Handle, selDidAccessValueForKey_Handle, intPtr);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selDidAccessValueForKey_Handle, intPtr);
			}
			NSString.ReleaseNative(intPtr);
		}

		[Export("willChangeValueForKey:")]
		public virtual void WillChangeValueForKey(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			IntPtr intPtr = NSString.CreateNative(key);
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr(base.Handle, selWillChangeValueForKey_Handle, intPtr);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selWillChangeValueForKey_Handle, intPtr);
			}
			NSString.ReleaseNative(intPtr);
		}

		[Export("didChangeValueForKey:")]
		public virtual void DidChangeValueForKey(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			IntPtr intPtr = NSString.CreateNative(key);
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr(base.Handle, selDidChangeValueForKey_Handle, intPtr);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr(base.SuperHandle, selDidChangeValueForKey_Handle, intPtr);
			}
			NSString.ReleaseNative(intPtr);
		}

		[Export("willChangeValueForKey:withSetMutation:usingObjects:")]
		public virtual void WillChangeValueForKey(string inKey, NSKeyValueSetMutationKind inMutationKind, NSSet inObjects)
		{
			if (inKey == null)
			{
				throw new ArgumentNullException("inKey");
			}
			if (inObjects == null)
			{
				throw new ArgumentNullException("inObjects");
			}
			IntPtr intPtr = NSString.CreateNative(inKey);
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr_UInt64_IntPtr(base.Handle, selWillChangeValueForKeyWithSetMutationUsingObjects_Handle, intPtr, (ulong)inMutationKind, inObjects.Handle);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr_UInt64_IntPtr(base.SuperHandle, selWillChangeValueForKeyWithSetMutationUsingObjects_Handle, intPtr, (ulong)inMutationKind, inObjects.Handle);
			}
			NSString.ReleaseNative(intPtr);
		}

		[Export("didChangeValueForKey:withSetMutation:usingObjects:")]
		public virtual void DidChangeValueForKey(string inKey, NSKeyValueSetMutationKind inMutationKind, NSSet inObjects)
		{
			if (inKey == null)
			{
				throw new ArgumentNullException("inKey");
			}
			if (inObjects == null)
			{
				throw new ArgumentNullException("inObjects");
			}
			IntPtr intPtr = NSString.CreateNative(inKey);
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr_UInt64_IntPtr(base.Handle, selDidChangeValueForKeyWithSetMutationUsingObjects_Handle, intPtr, (ulong)inMutationKind, inObjects.Handle);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr_UInt64_IntPtr(base.SuperHandle, selDidChangeValueForKeyWithSetMutationUsingObjects_Handle, intPtr, (ulong)inMutationKind, inObjects.Handle);
			}
			NSString.ReleaseNative(intPtr);
		}

		[Export("awakeFromFetch")]
		public virtual void AwakeFromFetch()
		{
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend(base.Handle, selAwakeFromFetchHandle);
			}
			else
			{
				Messaging.void_objc_msgSendSuper(base.SuperHandle, selAwakeFromFetchHandle);
			}
		}

		[Export("awakeFromInsert")]
		public virtual void AwakeFromInsert()
		{
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend(base.Handle, selAwakeFromInsertHandle);
			}
			else
			{
				Messaging.void_objc_msgSendSuper(base.SuperHandle, selAwakeFromInsertHandle);
			}
		}

		[Export("willSave")]
		public virtual void WillSave()
		{
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend(base.Handle, selWillSaveHandle);
			}
			else
			{
				Messaging.void_objc_msgSendSuper(base.SuperHandle, selWillSaveHandle);
			}
		}

		[Export("didSave")]
		public virtual void DidSave()
		{
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend(base.Handle, selDidSaveHandle);
			}
			else
			{
				Messaging.void_objc_msgSendSuper(base.SuperHandle, selDidSaveHandle);
			}
		}

		[Export("willTurnIntoFault")]
		public virtual void WillTurnIntoFault()
		{
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend(base.Handle, selWillTurnIntoFaultHandle);
			}
			else
			{
				Messaging.void_objc_msgSendSuper(base.SuperHandle, selWillTurnIntoFaultHandle);
			}
		}

		[Export("didTurnIntoFault")]
		public virtual void DidTurnIntoFault()
		{
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend(base.Handle, selDidTurnIntoFaultHandle);
			}
			else
			{
				Messaging.void_objc_msgSendSuper(base.SuperHandle, selDidTurnIntoFaultHandle);
			}
		}

		[Export("valueForKey:")]
		public virtual IntPtr ValueForKey(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			IntPtr intPtr = NSString.CreateNative(key);
			IntPtr result = (!IsDirectBinding) ? Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, selValueForKey_Handle, intPtr) : Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, selValueForKey_Handle, intPtr);
			NSString.ReleaseNative(intPtr);
			return result;
		}

		[Export("setValue:forKey:")]
		public virtual void SetValue(IntPtr value, string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			IntPtr intPtr = NSString.CreateNative(key);
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr_IntPtr(base.Handle, selSetValueForKey_Handle, value, intPtr);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr_IntPtr(base.SuperHandle, selSetValueForKey_Handle, value, intPtr);
			}
			NSString.ReleaseNative(intPtr);
		}

		[Export("primitiveValueForKey:")]
		public virtual IntPtr PrimitiveValueForKey(string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			IntPtr intPtr = NSString.CreateNative(key);
			IntPtr result = (!IsDirectBinding) ? Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, selPrimitiveValueForKey_Handle, intPtr) : Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, selPrimitiveValueForKey_Handle, intPtr);
			NSString.ReleaseNative(intPtr);
			return result;
		}

		[Export("setPrimitiveValue:forKey:")]
		public virtual void SetPrimitiveValue(IntPtr value, string key)
		{
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			IntPtr intPtr = NSString.CreateNative(key);
			if (IsDirectBinding)
			{
				Messaging.void_objc_msgSend_IntPtr_IntPtr(base.Handle, selSetPrimitiveValueForKey_Handle, value, intPtr);
			}
			else
			{
				Messaging.void_objc_msgSendSuper_IntPtr_IntPtr(base.SuperHandle, selSetPrimitiveValueForKey_Handle, value, intPtr);
			}
			NSString.ReleaseNative(intPtr);
		}

		[Export("committedValuesForKeys:")]
		public virtual NSDictionary CommittedValuesForKeys(string[] keys)
		{
			if (keys == null)
			{
				throw new ArgumentNullException("keys");
			}
			NSArray nSArray = NSArray.FromStrings(keys);
			NSDictionary result = (!IsDirectBinding) ? ((NSDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSendSuper_IntPtr(base.SuperHandle, selCommittedValuesForKeys_Handle, nSArray.Handle))) : ((NSDictionary)Runtime.GetNSObject(Messaging.IntPtr_objc_msgSend_IntPtr(base.Handle, selCommittedValuesForKeys_Handle, nSArray.Handle)));
			nSArray.Dispose();
			return result;
		}

		[Export("validateValue:forKey:error:")]
		public virtual bool ValidateValue(NSObject value, string key, out NSError error)
		{
			if (value == null)
			{
				throw new ArgumentNullException("value");
			}
			if (key == null)
			{
				throw new ArgumentNullException("key");
			}
			IntPtr intPtr = Marshal.AllocHGlobal(4);
			Marshal.WriteInt32(intPtr, 0);
			IntPtr intPtr2 = NSString.CreateNative(key);
			bool result = (!IsDirectBinding) ? Messaging.bool_objc_msgSendSuper_IntPtr_IntPtr_IntPtr(base.SuperHandle, selValidateValueForKeyError_Handle, value.Handle, intPtr2, intPtr) : Messaging.bool_objc_msgSend_IntPtr_IntPtr_IntPtr(base.Handle, selValidateValueForKeyError_Handle, value.Handle, intPtr2, intPtr);
			NSString.ReleaseNative(intPtr2);
			IntPtr intPtr3 = Marshal.ReadIntPtr(intPtr);
			error = ((intPtr3 != IntPtr.Zero) ? ((NSError)Runtime.GetNSObject(intPtr3)) : null);
			Marshal.FreeHGlobal(intPtr);
			return result;
		}

		[Export("validateForDelete:")]
		public virtual bool ValidateForDelete(out NSError error)
		{
			IntPtr intPtr = Marshal.AllocHGlobal(4);
			Marshal.WriteInt32(intPtr, 0);
			bool result = (!IsDirectBinding) ? Messaging.bool_objc_msgSendSuper_IntPtr(base.SuperHandle, selValidateForDelete_Handle, intPtr) : Messaging.bool_objc_msgSend_IntPtr(base.Handle, selValidateForDelete_Handle, intPtr);
			IntPtr intPtr2 = Marshal.ReadIntPtr(intPtr);
			error = ((intPtr2 != IntPtr.Zero) ? ((NSError)Runtime.GetNSObject(intPtr2)) : null);
			Marshal.FreeHGlobal(intPtr);
			return result;
		}

		[Export("validateForInsert:")]
		public virtual bool ValidateForInsert(out NSError error)
		{
			IntPtr intPtr = Marshal.AllocHGlobal(4);
			Marshal.WriteInt32(intPtr, 0);
			bool result = (!IsDirectBinding) ? Messaging.bool_objc_msgSendSuper_IntPtr(base.SuperHandle, selValidateForInsert_Handle, intPtr) : Messaging.bool_objc_msgSend_IntPtr(base.Handle, selValidateForInsert_Handle, intPtr);
			IntPtr intPtr2 = Marshal.ReadIntPtr(intPtr);
			error = ((intPtr2 != IntPtr.Zero) ? ((NSError)Runtime.GetNSObject(intPtr2)) : null);
			Marshal.FreeHGlobal(intPtr);
			return result;
		}

		[Export("validateForUpdate:")]
		public virtual bool ValidateForUpdate(out NSError error)
		{
			IntPtr intPtr = Marshal.AllocHGlobal(4);
			Marshal.WriteInt32(intPtr, 0);
			bool result = (!IsDirectBinding) ? Messaging.bool_objc_msgSendSuper_IntPtr(base.SuperHandle, selValidateForUpdate_Handle, intPtr) : Messaging.bool_objc_msgSend_IntPtr(base.Handle, selValidateForUpdate_Handle, intPtr);
			IntPtr intPtr2 = Marshal.ReadIntPtr(intPtr);
			error = ((intPtr2 != IntPtr.Zero) ? ((NSError)Runtime.GetNSObject(intPtr2)) : null);
			Marshal.FreeHGlobal(intPtr);
			return result;
		}

		protected override void Dispose(bool disposing)
		{
			base.Dispose(disposing);
			if (base.Handle == IntPtr.Zero)
			{
				__mt_ManagedObjectContext_var = null;
				__mt_Entity_var = null;
				__mt_ObjectID_var = null;
				__mt_ChangedValues_var = null;
				__mt_ChangedValuesForCurrentEvent_var = null;
			}
		}
	}
}
