text: //
  //  RACSubscriptingAssignmentTrampoline.h
  //  ReactiveObjC
  //
  //  Created by Josh Abernathy on 9/24/12.
  //  Copyright (c) 2012 GitHub, Inc. All rights reserved.
  //
  
  #import <Foundation/Foundation.h>
  #import "EXTKeyPathCoding.h"
  
  @class RACSignal<__covariant ValueType>;
  
  NS_ASSUME_NONNULL_BEGIN
  
  /// Assigns a signal to an object property, automatically setting the given key
  /// path on every `next`. When the signal completes, the binding is automatically
  /// disposed of.
  ///
  /// There are two different versions of this macro:
  ///
  ///  - RAC(TARGET, KEYPATH, NILVALUE) will bind the `KEYPATH` of `TARGET` to the
  ///    given signal. If the signal ever sends a `nil` value, the property will be
  ///    set to `NILVALUE` instead. `NILVALUE` may itself be `nil` for object
  ///    properties, but an NSValue should be used for primitive properties, to
  ///    avoid an exception if `nil` is sent (which might occur if an intermediate
  ///    object is set to `nil`).
  ///  - RAC(TARGET, KEYPATH) is the same as the above, but `NILVALUE` defaults to
  ///    `nil`.
  ///
  /// See -[RACSignal setKeyPath:onObject:nilValue:] for more information about the
  /// binding's semantics.
  ///
  /// Examples
  ///
  ///  RAC(self, objectProperty) = objectSignal;
  ///  RAC(self, stringProperty, @"foobar") = stringSignal;
  ///  RAC(self, integerProperty, @42) = integerSignal;
  ///
  /// WARNING: Under certain conditions, use of this macro can be thread-unsafe.
  ///          See the documentation of -setKeyPath:onObject:nilValue:.
  #define RAC(TARGET, ...) \
      rac_metamacro_if_eq(1, rac_metamacro_argcount(__VA_ARGS__)) \
          (RAC_(TARGET, __VA_ARGS__, nil)) \
          (RAC_(TARGET, __VA_ARGS__))
  
  /// Do not use this directly. Use the RAC macro above.
  #define RAC_(TARGET, KEYPATH, NILVALUE) \
      [[RACSubscriptingAssignmentTrampoline alloc] initWithTarget:(TARGET) nilValue:(NILVALUE)][@rac_keypath(TARGET, KEYPATH)]
  
  @interface RACSubscriptingAssignmentTrampoline : NSObject
  
  - (nullable instancetype)initWithTarget:(nullable id)target nilValue:(nullable id)nilValue;
  - (void)setObject:(RACSignal *)signal forKeyedSubscript:(NSString *)keyPath;
  
  @end
  
  NS_ASSUME_NONNULL_END
  