--- /dev/null
+#ifndef NETSNMP_FACTORY_H
+#define NETSNMP_FACTORY_H
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+ typedef void * (netsnmp_factory_produce_f)(void);
+ typedef int (netsnmp_factory_produce_noalloc_f)(void *);
+
+ typedef struct netsnmp_factory_s {
+ /*
+ * a string describing the product the factory creates
+ */
+ const char *product;
+
+ /*
+ * a function to create an object in newly allcoated memory
+ */
+ netsnmp_factory_produce_f *produce;
+
+ /*
+ * a function to create an object in previously allcoated memory
+ */
+ netsnmp_factory_produce_noalloc_f *produce_noalloc;
+
+ } netsnmp_factory;
+
+ /*
+ * init factory registry
+ */
+ void netsnmp_factory_init(void);
+
+ /*
+ * register a factory type
+ */
+ int netsnmp_factory_register(netsnmp_factory *f);
+
+ /*
+ * get a factory
+ */
+ netsnmp_factory* netsnmp_factory_get(const char* product);
+
+ /*
+ * ask a factory to produce an object
+ */
+ void * netsnmp_factory_produce(const char* product);
+
+ /*
+ * ask a factory to produce an object in the provided memory
+ */
+ int netsnmp_factory_produce_noalloc(const char *product, void *memory);
+
+ /*
+ * factory return codes
+ */
+ enum {
+ FACTORY_NOERROR = 0,
+ FACTORY_EXISTS,
+ FACTORY_NOTFOUND,
+ FACTORY_NOMEMORY,
+ FACTORY_GENERR,
+ FACTORY_MAXIMUM_ERROR
+ };
+
+#ifdef __cplusplus
+};
+#endif
+
+
+#endif /* NETSNMP_FACTORY_H */