#include "objCAction.h"

void performSelector0(id target, NSString* selectorName) {
    NSLog(@"performSelector0(%@, %@)", target, selectorName);
    // Ignoring return value, because ObjCAction does not allow one.
    [target performSelector:NSSelectorFromString(selectorName)];
}

void performSelectorInNewThread0(id target, NSString* selectorName) {
    NSLog(@"performSelectorInNewThread0(%@, %@)", target, selectorName);
    NSThread* thread = [[NSThread alloc] initWithBlock:^{
        performSelector0(target, selectorName);
    }];
    [thread start];
}

void performSelector1(id target, NSString* selectorName, id arg1) {
    NSLog(@"performSelector1(%@, %@, %@)", target, selectorName, arg1);
    // Ignoring return value, because ObjCAction does not allow one.
    [target performSelector:NSSelectorFromString(selectorName) withObject:arg1];
}

void performSelectorInNewThread1(id target, NSString* selectorName, id arg1) {
    NSLog(@"performSelectorInNewThread1(%@, %@, %@)", target, selectorName, arg1);
    // Use NSThread method directly just for variety.
    NSThread* thread = [[NSThread alloc] initWithTarget:target selector:NSSelectorFromString(selectorName) object:arg1];
    [thread start];
}

void performSelector2(id target, NSString* selectorName, id arg1, id arg2) {
    NSLog(@"performSelector2(%@, %@, %@, %@)", target, selectorName, arg1, arg2);
    // Ignoring return value, because ObjCAction does not allow one.
    [target performSelector:NSSelectorFromString(selectorName) withObject:arg1 withObject:arg2];
}

void performSelectorInNewThread2(id target, NSString* selectorName, id arg1, id arg2) {
    NSLog(@"performSelectorInNewThread2(%@, %@, %@, %@)", target, selectorName, arg1, arg2);
    NSThread* thread = [[NSThread alloc] initWithBlock:^{
        performSelector2(target, selectorName, arg1, arg2);
    }];
    [thread start];
}

void setProperty(id target, NSString* propertyName, id value) {
    NSLog(@"setProperty(%@, %@, %@)", target, propertyName, value);
    [target setValue:value forKey:propertyName];
}