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

#ifndef __GoInterfaces_H__
#define __GoInterfaces_H__

#include <Foundation/Foundation.h>
#include "GoUniverse.h"

@protocol GoInterfacesError;
@class GoInterfacesError;
@protocol GoInterfacesI;
@class GoInterfacesI;
@protocol GoInterfacesI1;
@protocol GoInterfacesI2;
@protocol GoInterfacesI3;
@class GoInterfacesI3;
@protocol GoInterfacesLargerI;
@class GoInterfacesLargerI;
@protocol GoInterfacesSameI;
@class GoInterfacesSameI;
@protocol GoInterfacesWithParam;
@class GoInterfacesWithParam;

@protocol GoInterfacesError
- (BOOL)err:(NSError**)error;
@end

@protocol GoInterfacesI
- (int32_t)rand;
@end

@interface GoInterfacesI1 : NSObject {
}
@property(strong, readonly) id _ref;

- (id)initWithRef:(id)ref;
- (void)j;
@end

@interface GoInterfacesI2 : NSObject {
}
@property(strong, readonly) id _ref;

- (id)initWithRef:(id)ref;
- (void)g;
@end

@protocol GoInterfacesI3
- (GoInterfacesI1*)f;
@end

@protocol GoInterfacesLargerI
- (void)anotherFunc;
- (int32_t)rand;
@end

@protocol GoInterfacesSameI
- (int32_t)rand;
@end

@protocol GoInterfacesWithParam
- (void)hasParam:(BOOL)p0;
@end

FOUNDATION_EXPORT int32_t GoInterfacesAdd3(id<GoInterfacesI> r);

FOUNDATION_EXPORT BOOL GoInterfacesCallErr(id<GoInterfacesError> e, NSError** error);

FOUNDATION_EXPORT id<GoInterfacesI> GoInterfacesSeven();

@class GoInterfacesError;

@class GoInterfacesI;

@class GoInterfacesI3;

@class GoInterfacesLargerI;

@class GoInterfacesSameI;

@class GoInterfacesWithParam;

@interface GoInterfacesError : NSObject <GoInterfacesError> {
}
@property(strong, readonly) id _ref;

- (id)initWithRef:(id)ref;
- (BOOL)err:(NSError**)error;
@end

@interface GoInterfacesI : NSObject <GoInterfacesI> {
}
@property(strong, readonly) id _ref;

- (id)initWithRef:(id)ref;
- (int32_t)rand;
@end

@interface GoInterfacesI3 : NSObject <GoInterfacesI3> {
}
@property(strong, readonly) id _ref;

- (id)initWithRef:(id)ref;
- (GoInterfacesI1*)f;
@end

@interface GoInterfacesLargerI : NSObject <GoInterfacesLargerI> {
}
@property(strong, readonly) id _ref;

- (id)initWithRef:(id)ref;
- (void)anotherFunc;
- (int32_t)rand;
@end

@interface GoInterfacesSameI : NSObject <GoInterfacesSameI> {
}
@property(strong, readonly) id _ref;

- (id)initWithRef:(id)ref;
- (int32_t)rand;
@end

@interface GoInterfacesWithParam : NSObject <GoInterfacesWithParam> {
}
@property(strong, readonly) id _ref;

- (id)initWithRef:(id)ref;
- (void)hasParam:(BOOL)p0;
@end

#endif
