// 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 {
}

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