// 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.
 */
- (NSString*)sf;
- (void)setSF:(NSString*)v;
/**
 * Anonymous field.
 */
- (DocS2*)s2;
- (void)setS2:(DocS2*)v;
/**
 * Multiple fields.
 */
- (NSString*)f1;
- (void)setF1:(NSString*)v;
/**
 * Multiple fields.
 */
- (NSString*)f2;
- (void)setF2:(NSString*)v;
/**
 * 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
