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

#ifndef __Doc_H__
#define __Doc_H__

@import Foundation;
#include "Universe.objc.h"


@class DocNoDoc;
@class DocS;
@class DocS2;
@protocol DocI;
@class DocI;

@protocol DocI <NSObject>
- (void)im;
@end

/**
 * A generic comment with <HTML>.
 */
@interface DocNoDoc : NSObject <goSeqRefInterface> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (instancetype)init;
@end

/**
 * S is a struct.
 */
@interface DocS : NSObject <goSeqRefInterface> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
/**
 * NewS is a constructor.
 */
- (instancetype)init;
/**
 * SF is a field.
 */
@property (nonatomic) NSString* sf;
/**
 * Anonymous field.
 */
@property (nonatomic) DocS2* s2;
/**
 * Multiple fields.
 */
@property (nonatomic) NSString* f1;
/**
 * Multiple fields.
 */
@property (nonatomic) NSString* f2;
/**
 * After is another method.
 */
- (void)after;
- (void)before;
@end

/**
 * S2 is a struct.
 */
@interface DocS2 : NSObject <goSeqRefInterface> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
- (instancetype)init;
@end

/**
 * C is a constant.
 */
FOUNDATION_EXPORT const BOOL DocC;

@interface Doc : NSObject
/**
 * A group of vars.
 */
+ (double) noDocVar;
+ (void) setNoDocVar:(double)v;

/**
 * A specific var.
 */
+ (NSString*) specific;
+ (void) setSpecific:(NSString*)v;

/**
 * V is a var.
 */
+ (NSString*) v;
+ (void) setV:(NSString*)v;

@end

/**
 * F is a function.
 */
FOUNDATION_EXPORT void DocF(void);

/**
 * NewS is a constructor.
 */
FOUNDATION_EXPORT DocS* DocNewS(void);

@class DocI;

/**
 * I is an interface.
 */
@interface DocI : NSObject <goSeqRefInterface, DocI> {
}
@property(strong, readonly) id _ref;

- (instancetype)initWithRef:(id)ref;
/**
 * IM is a method.
 */
- (void)im;
@end

#endif
