| #import <Foundation/Foundation.h> | 
|   | 
| /*! JKVValue represents an Immutable Value Object class that should be subclassed to use. | 
|  * | 
|  *  JKVValue subclasses will introspect all its properties for various NSObject features. | 
|  *  The following interfaces are supported when inheriting from JKVValue: | 
|  * | 
|  *  - NSSecureCoding (thus, NSCoding) | 
|  *  - NSMutableCopying | 
|  *  - NSCopying | 
|  * | 
|  *  This implementation assumes immutability. This means -[JKVValue copy] returns the same | 
|  *  instance. | 
|  * | 
|  *  If you want a mutable variant, inherit from JKVMutableValue. | 
|  */ | 
| @interface JKVValue : NSObject <NSMutableCopying, NSCopying, NSSecureCoding> | 
|   | 
| /*! Returns the difference between this value object an the given object. | 
|  * | 
|  *  This is a higher-order function to -[isEqual:] its results are similar to the | 
|  *  behavior for equality. Unlike -[isEqual:], this method is NOT recursive. | 
|  * | 
|  *  The dictionary maps fields to arrays for all differing properties. Each array contains | 
|  *  exactly two elements: the value of the field for self and the value of the field | 
|  *  for the other object. | 
|  * | 
|  *  Classes are also checked, objects that differ in classes will only have a | 
|  *  "class" key with an array of @[[self class], [otherValueObject class]]; | 
|  * | 
|  *  @param otherValueObject The other value object to diff against. | 
|  * | 
|  */ | 
| - (NSDictionary *)differenceToObject:(id)otherValueObject; | 
|   | 
| /*! Override this method to return YES to indicate that this subclass is | 
|  *  mutable. This changes the behavior of how NSCopying protocol works | 
|  *  from returning itself to copying all properties. | 
|  * | 
|  *  The default returns NO. The JKVMutableValue subclass returns YES. | 
|  */ | 
| - (BOOL)JKV_isMutable; | 
|   | 
| /*! Override this method to return the class to instanciate when using | 
|  *  the NSCopying protocol. This is useful for when you want a mutable | 
|  *  class to return an immutable class when -[copy] is called. | 
|  * | 
|  *  For example, you would override this if you wanted MyArray class to | 
|  *  use MyMutableArray. | 
|  * | 
|  *  It's not advisable to override this unless you subclass JKVMutableValue. | 
|  * | 
|  *  @returns The immutable version of this class. The default returns the current class. | 
|  */ | 
| - (Class)JKV_immutableClass; | 
|   | 
| /*! The reverse of -[JKV_immutableClass]. Override this method to return | 
|  *  the class to instanciate when using the NSMutableCopying protocol. | 
|  *  This is useful for when you want an immutable class to return a | 
|  *  mutable class when -[mutableCopy] is called. | 
|  * | 
|  *  For example, you would override this if you wanted MyMutableArray | 
|  *  class to use MyArray. | 
|  * | 
|  *  @returns The mutable version of this class if available. The default returns the current class. | 
|  */ | 
| - (Class)JKV_mutableClass; | 
|   | 
| /*! For subclasses to override to specify which properties are used for equality and hashing. | 
|  * | 
|  *  To increase performance. Each object will call this only once and memoize its results afterwards. | 
|  */ | 
| - (NSArray *)JKV_propertyNamesForIdentity; | 
|   | 
| /*! For subclasses to override which weak properties to check for assignment and do weak encoding. | 
|  * | 
|  *  To increase performance. Each object will call this only once and memoize its results afterwards. | 
|  */ | 
| - (NSArray *)JKV_propertyNamesToAssignCopy; | 
|   | 
| @end |