//
//  Delegate.m
//  XNI
//
//  Created by Matej Jan on 20.7.10.
//  Copyright 2010 Retronator. All rights reserved.
//

#import "Delegate.h"


@implementation Delegate

- (id) initWithTarget:(id)theTarget Method:(SEL)theMethod {
    if (self = [super init]) {
        target = theTarget;
        method = theMethod;
    }
    return self;
}

+ (Delegate*) delegateWithTarget:(id)target Method:(SEL)method {
    return [[[Delegate alloc] initWithTarget:target Method:method] autorelease];
}

- (id) invokeWithArguments: (NSArray*) args {
	switch ([args count]) {
		case 0:
			return [self invoke];
			break;
		case 1:
			return [self invokeWithArgument:[args objectAtIndex:0]];
			break;
		case 2:
			return [self invokeWithArgument:[args objectAtIndex:0] argument:[args objectAtIndex:1]];																																		   
			break;			
		default:
			// TODO: Use NSInvocation instead of performSelector.
			return nil;
			break;
	}
}

- (id) invoke {
	return [target performSelector:method];
}

- (id) invokeWithArgument:(id)arg {
    return [target performSelector:method withObject:arg];
}

- (id) invokeWithArgument:(id)arg1 argument:(id)arg2 {
    return [target performSelector:method withObject:arg1 withObject:arg2];
}

- (BOOL) isEqual:(id)object {
    if ([object isKindOfClass:[Delegate class]]) {
        Delegate *delegate = object;
        return [target isEqual:delegate->target] && method==delegate->method;
    }
    return NO;
}

-(NSString *)description{
    return  [NSString stringWithFormat:@"%@: [%@, %@]",[super description],target, NSStringFromSelector(method)];
}

- (NSUInteger) hash {
    return [target hash] ^ [NSStringFromSelector(method) hash];
}

@end