// 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 "GoKeywords.h"

@implementation GoKeywordsKeywordCaller {
}

- (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 GoKeywordsConst(NSString* id_) {
	nstring _id_ = go_seq_from_objc_string(id_);
	proxykeywords__Const(_id_);
}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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