kException

@interface kException : kObject
{
@private
  kString* s;
}

+ (kException*)new:(kString*)e, ...;

+ (void)raise:(kString*)e, ...;

- (kException*)init:(kString*)e, ...;
- (kException*)init:(kString*)e :(kArgs)args;

- (void)raise;

@end
@implementation kException

+ (kException*)new:(kString*)e, ...
{
  va_list args;
  va_start(args, e);
  kException *x = [[kException alloc] init:e :args];
  va_end(args);

  return x;
}

+ (void)raise:(kString*)e, ...
{
  va_list args;
  va_start(args, e);
  [[[kException alloc] init:e :args] raise];
  va_end(args); // Not needed!
}

- (kException*)init:(kString*)e, ...
{
  if(self = [super init])
  {
    va_list args;
    va_start(args, e);
    s = [kString new:e :args];
    va_end(args);
  }

  return self;
}

- (kException*)init:(kString*)e :(kArgs)args
{
  if(self = [super init])
    s = [kString new:e :args];

  return self;
}

- (void)raise
{
  printf("%s", [s cString]);

  @throw self;
}

@end