// 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)bool_ {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Bool(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)nil_ {
	int32_t refnum = go_seq_go_to_refnum(self._ref);
	proxykeywords_KeywordCaller_Nil(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* _Nullable id_) {
	nstring _id_ = go_seq_from_objc_string(id_);
	proxykeywords__Const(_id_);
}

void KeywordsStatic(NSString* _Nullable 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_Bool(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o bool_];
	}
}

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_Nil(int32_t refnum) {
	@autoreleasepool {
		KeywordsKeywordCaller* o = go_seq_objc_from_refnum(refnum);
		[o nil_];
	}
}

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();
}
