// 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 "ref.h"
#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
