// 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;
/**
 * After is another method.
 */
- (void)after;
/**
 * Before is a method.
 */
- (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();

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

@class DocI;

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

- (instancetype)initWithRef:(id)ref;
- (void)im;
@end

#endif
