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)
 {
 }
            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;
            }