// Objective-C API for talking to keywords Go package.
//   gobind -lang=objc keywords
//
// File is generated by gobind. Do not edit.

#include <Foundation/Foundation.h>
#include "seq.h"
#include "_cgo_export.h"
#include "Keywords.objc.h"

@implementation KeywordsKeywordCaller {
}

- (instancetype)initWithRef:(id)ref {
	self = [super init];
	if (self) { __ref = ref; }
	return self;
}

- (void)abstract {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Abstract(refnum);
}

- (void)assert {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Assert(refnum);
}

- (void)boolean {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Boolean(refnum);
}

- (void)break {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Break(refnum);
}

- (void)byte {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Byte(refnum);
}

- (void)case {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Case(refnum);
}

- (void)catch {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Catch(refnum);
}

- (void)char_ {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Char(refnum);
}

- (void)class {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Class(refnum);
}

- (void)const_ {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Const(refnum);
}

- (void)continue {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Continue(refnum);
}

- (void)default {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Default(refnum);
}

- (void)do {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Do(refnum);
}

- (void)double_ {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Double(refnum);
}

- (void)else {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Else(refnum);
}

- (void)enum {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Enum(refnum);
}

- (void)extends {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Extends(refnum);
}

- (void)false {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_False(refnum);
}

- (void)final {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Final(refnum);
}

- (void)finally {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Finally(refnum);
}

- (void)float_ {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Float(refnum);
}

- (void)for {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_For(refnum);
}

- (void)goto {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Goto(refnum);
}

- (void)if {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_If(refnum);
}

- (void)implements {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Implements(refnum);
}

- (void)import {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Import(refnum);
}

- (void)instanceof {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Instanceof(refnum);
}

- (void)int_ {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Int(refnum);
}

- (void)interface {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Interface(refnum);
}

- (void)long_ {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Long(refnum);
}

- (void)native {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Native(refnum);
}

- (void)new {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_New(refnum);
}

- (void)null {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Null(refnum);
}

- (void)package {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Package(refnum);
}

- (void)private {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Private(refnum);
}

- (void)protected {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Protected(refnum);
}

- (void)public {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Public(refnum);
}

- (void)return {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Return(refnum);
}

- (void)short_ {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Short(refnum);
}

- (void)static {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Static(refnum);
}

- (void)strictfp {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Strictfp(refnum);
}

- (void)super_ {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Super(refnum);
}

- (void)switch {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Switch(refnum);
}

- (void)synchronized {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Synchronized(refnum);
}

- (void)this {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_This(refnum);
}

- (void)throw {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Throw(refnum);
}

- (void)throws {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Throws(refnum);
}

- (void)transient {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Transient(refnum);
}

- (void)true {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_True(refnum);
}

- (void)try {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Try(refnum);
}

- (void)void_ {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Void(refnum);
}

- (void)volatile_ {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Volatile(refnum);
}

- (void)while {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_While(refnum);
}

@end



void KeywordsConst(NSString* id_) {
	nstring _id_ = go_seq_from_objc_string(id_);
	proxykeywords__Const(_id_);
}

void KeywordsStatic(NSString* strictfp) {
	nstring _strictfp = go_seq_from_objc_string(strictfp);
	proxykeywords__Static(_strictfp);
}

void cproxykeywords_KeywordCaller_Abstract(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o abstract];
	}
}

void cproxykeywords_KeywordCaller_Assert(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o assert];
	}
}

void cproxykeywords_KeywordCaller_Boolean(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o boolean];
	}
}

void cproxykeywords_KeywordCaller_Break(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o break];
	}
}

void cproxykeywords_KeywordCaller_Byte(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o byte];
	}
}

void cproxykeywords_KeywordCaller_Case(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o case];
	}
}

void cproxykeywords_KeywordCaller_Catch(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o catch];
	}
}

void cproxykeywords_KeywordCaller_Char(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o char_];
	}
}

void cproxykeywords_KeywordCaller_Class(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o class];
	}
}

void cproxykeywords_KeywordCaller_Const(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o const_];
	}
}

void cproxykeywords_KeywordCaller_Continue(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o continue];
	}
}

void cproxykeywords_KeywordCaller_Default(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o default];
	}
}

void cproxykeywords_KeywordCaller_Do(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o do];
	}
}

void cproxykeywords_KeywordCaller_Double(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o double_];
	}
}

void cproxykeywords_KeywordCaller_Else(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o else];
	}
}

void cproxykeywords_KeywordCaller_Enum(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o enum];
	}
}

void cproxykeywords_KeywordCaller_Extends(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o extends];
	}
}

void cproxykeywords_KeywordCaller_False(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o false];
	}
}

void cproxykeywords_KeywordCaller_Final(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o final];
	}
}

void cproxykeywords_KeywordCaller_Finally(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o finally];
	}
}

void cproxykeywords_KeywordCaller_Float(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o float_];
	}
}

void cproxykeywords_KeywordCaller_For(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o for];
	}
}

void cproxykeywords_KeywordCaller_Goto(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o goto];
	}
}

void cproxykeywords_KeywordCaller_If(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o if];
	}
}

void cproxykeywords_KeywordCaller_Implements(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o implements];
	}
}

void cproxykeywords_KeywordCaller_Import(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o import];
	}
}

void cproxykeywords_KeywordCaller_Instanceof(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o instanceof];
	}
}

void cproxykeywords_KeywordCaller_Int(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o int_];
	}
}

void cproxykeywords_KeywordCaller_Interface(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o interface];
	}
}

void cproxykeywords_KeywordCaller_Long(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o long_];
	}
}

void cproxykeywords_KeywordCaller_Native(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o native];
	}
}

void cproxykeywords_KeywordCaller_New(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o new];
	}
}

void cproxykeywords_KeywordCaller_Null(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o null];
	}
}

void cproxykeywords_KeywordCaller_Package(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o package];
	}
}

void cproxykeywords_KeywordCaller_Private(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o private];
	}
}

void cproxykeywords_KeywordCaller_Protected(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o protected];
	}
}

void cproxykeywords_KeywordCaller_Public(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o public];
	}
}

void cproxykeywords_KeywordCaller_Return(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o return];
	}
}

void cproxykeywords_KeywordCaller_Short(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o short_];
	}
}

void cproxykeywords_KeywordCaller_Static(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o static];
	}
}

void cproxykeywords_KeywordCaller_Strictfp(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o strictfp];
	}
}

void cproxykeywords_KeywordCaller_Super(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o super_];
	}
}

void cproxykeywords_KeywordCaller_Switch(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o switch];
	}
}

void cproxykeywords_KeywordCaller_Synchronized(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o synchronized];
	}
}

void cproxykeywords_KeywordCaller_This(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o this];
	}
}

void cproxykeywords_KeywordCaller_Throw(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o throw];
	}
}

void cproxykeywords_KeywordCaller_Throws(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o throws];
	}
}

void cproxykeywords_KeywordCaller_Transient(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o transient];
	}
}

void cproxykeywords_KeywordCaller_True(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o true];
	}
}

void cproxykeywords_KeywordCaller_Try(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o try];
	}
}

void cproxykeywords_KeywordCaller_Void(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o void_];
	}
}

void cproxykeywords_KeywordCaller_Volatile(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o volatile_];
	}
}

void cproxykeywords_KeywordCaller_While(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o while];
	}
}

__attribute__((constructor)) static void init() {
	init_seq();
}
