internal Property(IUndoRedoService undoRedoService, INotifyPropertyChanged propertyOwnerObj, PropertyInfo propertyInfo, RecordedElement initialPropertyValue, IsRecordableAttribute isRecordableAttribute)
            {
                if (undoRedoService == null)
                {
                    throw new ArgumentNullException("undoRedoService");
                }
                if (propertyOwnerObj == null)
                {
                    throw new ArgumentNullException("propertyOwnerObj");
                }
                if (propertyInfo == null)
                {
                    throw new ArgumentNullException("propertyInfo");
                }
                if (initialPropertyValue == null)
                {
                    throw new ArgumentNullException("initialPropertyValue");
                }
                if (isRecordableAttribute == null)
                {
                    throw new ArgumentNullException("isRecordableAttribute");
                }

                _undoRedoService       = undoRedoService;
                _propertyOwnerObj      = propertyOwnerObj;
                _propertyInfo          = propertyInfo;
                _value                 = initialPropertyValue;
                _isRecordableAttribute = isRecordableAttribute;
            }
            internal static Property Create(IUndoRedoService undoRedoService, INotifyPropertyChanged objAsNotifyPropertyChanged, IsRecordableAttribute isRecordableAttribute, PropertyInfo propertyInfo)
            {
                var recordableWithFilterAttribute = isRecordableAttribute as IsRecordableWithFilterAttribute;

                Property property;

                if (recordableWithFilterAttribute != null)
                {
                    property = new FilteredChangeRecordProperty(undoRedoService, objAsNotifyPropertyChanged, propertyInfo, RecordedElementFactory.Create(undoRedoService, propertyInfo.GetValue(objAsNotifyPropertyChanged, null)), recordableWithFilterAttribute);
                }
                else
                {
                    property = new EveryChangeRecordProperty(undoRedoService, objAsNotifyPropertyChanged, propertyInfo, RecordedElementFactory.Create(undoRedoService, propertyInfo.GetValue(objAsNotifyPropertyChanged, null)), isRecordableAttribute);
                }
                return(property);
            }
 internal EveryChangeRecordProperty(IUndoRedoService undoRedoService, INotifyPropertyChanged propertyOwnerObj, PropertyInfo propertyInfo, RecordedElement initialPropertyValue, IsRecordableAttribute isRecordableAttribute)
     : base(undoRedoService, propertyOwnerObj, propertyInfo, initialPropertyValue, isRecordableAttribute)
 {
 }