python-on-a-chip online compiler

Dependencies:   mbed TSI

/media/uploads/va009039/p14p-f446re.png

more info: python-on-a-chip

Files at this revision

API Documentation at this revision

Comitter:
va009039
Date:
Tue Mar 12 11:40:41 2013 +0000
Parent:
1:28afb064a41c
Child:
3:559c4bd38111
Commit message:
add NativeClassInterface, update mbed.py

Changed in this revision

platform/mbed/NativeClassInterface.cpp Show annotated file Show diff for this revision Revisions of this file
platform/mbed/NativeClassInterface.h Show annotated file Show diff for this revision Revisions of this file
platform/mbed/main_img.cpp Show annotated file Show diff for this revision Revisions of this file
platform/mbed/main_nat.cpp Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/platform/mbed/NativeClassInterface.cpp	Tue Mar 12 11:40:41 2013 +0000
@@ -0,0 +1,145 @@
+// NativeClassInterface.cpp 2013/3/12
+#include "mbed.h"
+#define __DEBUG__ 1
+#include "pm.h"
+#include "NativeClassInterface.h"
+
+#undef __FILE_ID__
+#define __FILE_ID__ 0x71
+
+template<>
+int NativeClassInterface::argv<int>(int n)
+{
+    pPmObj_t pn = NATIVE_GET_LOCAL(n);
+    if (OBJ_GET_TYPE(pn) == OBJ_TYPE_STR) {
+        return ((pPmString_t)pn)->val[0];
+    }
+    return ((pPmInt_t)pn)->val;
+}
+
+template<>
+bool NativeClassInterface::argv<bool>(int n)
+{
+    pPmObj_t pn = NATIVE_GET_LOCAL(n);
+    return ((pPmInt_t)pn)->val;
+}
+
+template<>
+float NativeClassInterface::argv<float>(int n)
+{
+    pPmObj_t pn = NATIVE_GET_LOCAL(n);
+    return ((pPmFloat_t)pn)->val;
+}
+
+template<>
+char NativeClassInterface::argv<char>(int n)
+{
+    pPmObj_t pn = NATIVE_GET_LOCAL(n);
+    return ((pPmString_t)pn)->val[0];
+}
+
+template<>
+char* NativeClassInterface::argv<char*>(int n)
+{
+    pPmObj_t pn = NATIVE_GET_LOCAL(n);
+    return reinterpret_cast<char*>(((pPmString_t)pn)->val);
+}
+
+template<>
+const char* NativeClassInterface::argv<const char*>(int n)
+{
+    pPmObj_t pn = NATIVE_GET_LOCAL(n);
+    return reinterpret_cast<const char*>(((pPmString_t)pn)->val);
+}
+
+template<>
+uint16_t NativeClassInterface::argv<uint16_t>(int n)
+{
+    pPmObj_t pn = NATIVE_GET_LOCAL(n);
+    return ((pPmInt_t)pn)->val;
+}
+
+template<>
+PinName NativeClassInterface::argv<PinName>(int n)
+{
+    /* PinName lookup table.  Converts pin number to PinName. */
+    const PinName pinNumToName[] = {
+        NC, LED1, LED2, LED3, LED4, p5, p6, p7, p8, p9,
+        p10, p11, p12, p13, p14, p15, p16, p17, p18, p19,
+        p20, p21, p22, p23, p24, p25, p26, p27, p28, p29,
+        p30
+    };
+
+    pPmObj_t pn = NATIVE_GET_LOCAL(n);
+    return pinNumToName[((pPmInt_t)pn)->val];
+}
+
+
+template<>
+PmReturn_t NativeClassInterface::set_return_value<int>(PmType_t ret_type, int value)
+{
+    pPmObj_t pn;
+    PmReturn_t retval;
+    if (ret_type == OBJ_TYPE_STR) {
+        retval = string_newFromChar((uint8_t)value, &pn);
+    } else {
+        retval = int_new(value, &pn);
+    }
+    NATIVE_SET_TOS(pn);
+    return retval;
+}
+
+template<>
+PmReturn_t NativeClassInterface::set_return_value<uint16_t>(PmType_t ret_type, uint16_t value)
+{
+    pPmObj_t pn;
+    PmReturn_t retval = int_new(value, &pn);
+    NATIVE_SET_TOS(pn);
+    return retval;
+}
+
+template<>
+PmReturn_t NativeClassInterface::set_return_value<float>(PmType_t ret_type, float value)
+{
+    pPmObj_t pn;
+    PmReturn_t retval = float_new(value, &pn);
+    NATIVE_SET_TOS(pn);
+    return retval;
+}
+
+template<typename R>
+PmReturn_t NativeClassInterface::set_return_value(PmType_t ret_type, R value)
+{
+    pPmObj_t pn;
+    PmReturn_t retval;
+    switch(ret_type) {
+       case OBJ_TYPE_INT:
+            retval = int_new(value, &pn);
+            break;
+        case OBJ_TYPE_FLT:
+            retval = float_new(value, &pn);
+            break;
+    }
+    NATIVE_SET_TOS(pn);
+    return retval;
+}
+
+PmReturn_t NativeClassInterface::check_argv_type(int arg_n, ...)
+{
+    PmReturn_t retval = PM_RET_OK;
+    if (NATIVE_GET_NUM_ARGS() != (arg_n+1)) {
+        PM_RAISE(retval, PM_RET_EX_TYPE);
+        return retval;
+    }
+    va_list vl;
+    va_start(vl, arg_n);
+    for(int n = 1; n <= arg_n; n++) {
+        pPmObj_t pn = NATIVE_GET_LOCAL(n);
+        int ty = va_arg(vl, int);
+        if (OBJ_GET_TYPE(pn) != ty) {
+            PM_RAISE(retval, PM_RET_EX_TYPE);
+            return retval;
+        }
+    }
+    return retval;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/platform/mbed/NativeClassInterface.h	Tue Mar 12 11:40:41 2013 +0000
@@ -0,0 +1,155 @@
+// NativeClassInterface.h 2013/3/12
+#pragma once
+#include <stdarg.h>
+class NativeClassInterface {
+public:
+    template<class T>
+    PmReturn_t init()
+    {
+        PmReturn_t retval = check_argv_type(0);
+        PM_RETURN_IF_ERROR(retval);
+        T* obj = new T();
+        return _save_obj<T>(obj);
+    }
+
+    template<class T, typename A1>
+    PmReturn_t init(PmType_t a1_type)
+    {
+        PmReturn_t retval = check_argv_type(1, a1_type);
+        PM_RETURN_IF_ERROR(retval);
+        T* obj = new T(argv<A1>(1));
+        return _save_obj<T>(obj);
+    }
+
+    template<class T, typename A1, typename A2>
+    PmReturn_t init(PmType_t a1_type, PmType_t a2_type)
+    {
+        PmReturn_t retval = check_argv_type(2, a1_type, a2_type);
+        PM_RETURN_IF_ERROR(retval);
+        T* obj = new T(argv<A1>(1), argv<A2>(2));
+        return _save_obj<T>(obj);
+    }
+
+    template<class T, typename A1, typename A2, typename A3>
+    PmReturn_t init(PmType_t a1_type, PmType_t a2_type, PmType_t a3_type)
+    {
+        PmReturn_t retval = check_argv_type(3, a1_type, a2_type, a3_type);
+        PM_RETURN_IF_ERROR(retval);
+        T* obj = new T(argv<A1>(1), argv<A2>(2), argv<A3>(3));
+        return _save_obj<T>(obj);
+    }
+
+    template<class T, void(T::*member)()>
+    PmReturn_t method(PmType_t ret_type)
+    {
+        PmReturn_t retval = check_argv_type(0);
+        PM_RETURN_IF_ERROR(retval);
+        T* obj;
+        retval = _load_obj<T>(&obj);
+        PM_RETURN_IF_ERROR(retval);
+        (obj->*member)();
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+    }
+
+    template<class T, typename A1, void(T::*member)(A1)>
+    PmReturn_t method(PmType_t ret_type, PmType_t a1_type)
+    {
+        PmReturn_t retval = check_argv_type(1, a1_type);
+        PM_RETURN_IF_ERROR(retval);
+        T* obj;
+        retval = _load_obj<T>(&obj);
+        PM_RETURN_IF_ERROR(retval);
+        (obj->*member)(argv<A1>(1));
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+    }
+
+    template<class T, typename A1, typename A2, void(T::*member)(A1,A2)>
+    PmReturn_t method(PmType_t ret_type, PmType_t a1_type, PmType_t a2_type)
+    {
+        PmReturn_t retval = check_argv_type(2, a1_type, a2_type);
+        PM_RETURN_IF_ERROR(retval);
+        T* obj;
+        retval = _load_obj<T>(&obj);
+        PM_RETURN_IF_ERROR(retval);
+        (obj->*member)(argv<A1>(1), argv<A2>(2));
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+    }
+
+    template<typename R, class T, R(T::*member)()>
+    PmReturn_t method(PmType_t ret_type)
+    {
+        PmReturn_t retval = check_argv_type(0);
+        PM_RETURN_IF_ERROR(retval);
+        T* obj;
+        retval = _load_obj<T>(&obj);
+        PM_RETURN_IF_ERROR(retval);
+        R value = (obj->*member)();
+        return set_return_value<R>(ret_type, value);
+    }
+
+    template<typename R, class T, typename A1, R(T::*member)(A1)>
+    PmReturn_t method(PmType_t ret_type, PmType_t a1_type)
+    {
+        PmReturn_t retval = check_argv_type(1, a1_type);
+        PM_RETURN_IF_ERROR(retval);
+        T* obj;
+        retval = _load_obj<T>(&obj);
+        PM_RETURN_IF_ERROR(retval);
+        R value = (obj->*member)(argv<A1>(1));
+        return set_return_value<R>(ret_type, value);
+    }
+
+    template<typename R, class T, typename A1, typename A2, typename A3, typename A4, R(T::*member)(A1, A2, A3, A4)>
+    PmReturn_t method(PmType_t ret_type, PmType_t a1_type, PmType_t a2_type, PmType_t a3_type, PmType_t a4_type)
+    {
+        PmReturn_t retval = check_argv_type(4, a1_type, a2_type, a3_type, a4_type);
+        PM_RETURN_IF_ERROR(retval);
+        T* obj;
+        retval = _load_obj<T>(&obj);
+        PM_RETURN_IF_ERROR(retval);
+        R value = (obj->*member)(argv<A1>(1), argv<A2>(2), argv<A3>(3), argv<A4>(4));
+        return set_return_value<R>(ret_type, value);
+    }
+
+    PmReturn_t check_argv_type(int arg_n, ...);
+    
+    template<class T>
+    PmReturn_t _save_obj(T* obj)
+    {
+        PmReturn_t retval = PM_RET_OK;
+        pPmObj_t pself = NATIVE_GET_LOCAL(0);
+        pPmObj_t pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
+        pPmObj_t pn;
+        retval = int_new((uint32_t)obj, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        uint8_t objid;
+        heap_gcPushTempRoot(pn, &objid);
+        retval = dict_setItem(pattrs, PM_NONE, pn);
+        heap_gcPopTempRoot(objid);
+        PM_RETURN_IF_ERROR(retval);
+        NATIVE_SET_TOS(PM_NONE);
+        return retval;
+    }
+
+    template<class T>
+    PmReturn_t _load_obj(T** obj)
+    {
+        PmReturn_t retval = PM_RET_OK;
+        pPmObj_t pself = NATIVE_GET_LOCAL(0);
+        pPmObj_t pattrs = reinterpret_cast<pPmObj_t>(((pPmInstance_t)pself)->cli_attrs);
+        pPmObj_t pn;
+        retval = dict_getItem(pattrs, PM_NONE, &pn);
+        PM_RETURN_IF_ERROR(retval);
+        *obj = reinterpret_cast<T*>(((pPmInt_t)pn)->val);
+        return retval;
+    }
+
+    template<typename R>
+    PmReturn_t set_return_value(PmType_t ret_type, R value);
+
+    template<typename A>
+    A argv(int n);
+};
--- a/platform/mbed/main_img.cpp	Sun Mar 10 10:13:36 2013 +0000
+++ b/platform/mbed/main_img.cpp	Tue Mar 12 11:40:41 2013 +0000
@@ -6,9 +6,9 @@
  *    mbed.py
  *    img-list-terminator
  * by pmImgCreator.py on
- * Sun Mar 10 18:24:12 2013.
+ * Tue Mar 12 20:23:40 2013.
  * 
- * Byte count: 2106
+ * Byte count: 2504
  * 
  * Selected memspace type: RAM
  * 
@@ -26,272 +26,322 @@
 
 
 /* main.py */
-    0x0A, 0x1D, 0x01, 0x00, 0x40, 0x05, 0x00, 0x00, 
-    0x0D, 0x00, 0x04, 0x0A, 0x03, 0x04, 0x00, 0x6D, 
-    0x62, 0x65, 0x64, 0x03, 0x03, 0x00, 0x73, 0x79, 
-    0x73, 0x03, 0x04, 0x00, 0x4C, 0x45, 0x44, 0x31, 
-    0x03, 0x0A, 0x00, 0x44, 0x69, 0x67, 0x69, 0x74, 
-    0x61, 0x6C, 0x4F, 0x75, 0x74, 0x03, 0x05, 0x00, 
-    0x6D, 0x79, 0x6C, 0x65, 0x64, 0x03, 0x05, 0x00, 
-    0x77, 0x72, 0x69, 0x74, 0x65, 0x03, 0x04, 0x00, 
-    0x77, 0x61, 0x69, 0x74, 0x03, 0x03, 0x00, 0x69, 
+    0x0A, 0x5D, 0x00, 0x00, 0x40, 0x03, 0x00, 0x00, 
+    0x0D, 0x00, 0x04, 0x03, 0x03, 0x03, 0x00, 0x69, 
     0x70, 0x6D, 0x03, 0x07, 0x00, 0x67, 0x6C, 0x6F, 
     0x62, 0x61, 0x6C, 0x73, 0x03, 0x04, 0x00, 0x6D, 
-    0x61, 0x69, 0x6E, 0x03, 0x14, 0x00, 0x0C, 0x01, 
-    0x0C, 0x01, 0x06, 0x01, 0x0F, 0x01, 0x03, 0x01, 
-    0x0D, 0x01, 0x0D, 0x01, 0x0D, 0x01, 0x10, 0x02, 
-    0x0C, 0x01, 0x03, 0x08, 0x00, 0x6D, 0x61, 0x69, 
-    0x6E, 0x2E, 0x70, 0x79, 0x00, 0x04, 0x05, 0x01, 
-    0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, 0x01, 0x00, 
-    0x00, 0x00, 0x01, 0xC8, 0x00, 0x00, 0x00, 0x01, 
-    0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x64, 0x00, 
-    0x00, 0x64, 0x01, 0x00, 0x6B, 0x00, 0x00, 0x5A, 
-    0x00, 0x00, 0x64, 0x00, 0x00, 0x64, 0x01, 0x00, 
-    0x6B, 0x01, 0x00, 0x5A, 0x01, 0x00, 0x64, 0x02, 
-    0x00, 0x5A, 0x02, 0x00, 0x65, 0x00, 0x00, 0x69, 
-    0x03, 0x00, 0x65, 0x02, 0x00, 0x83, 0x01, 0x00, 
-    0x5A, 0x04, 0x00, 0x78, 0x37, 0x00, 0x65, 0x04, 
-    0x00, 0x69, 0x05, 0x00, 0x64, 0x02, 0x00, 0x83, 
-    0x01, 0x00, 0x01, 0x65, 0x01, 0x00, 0x69, 0x06, 
-    0x00, 0x64, 0x03, 0x00, 0x83, 0x01, 0x00, 0x01, 
-    0x65, 0x04, 0x00, 0x69, 0x05, 0x00, 0x64, 0x04, 
-    0x00, 0x83, 0x01, 0x00, 0x01, 0x65, 0x01, 0x00, 
-    0x69, 0x06, 0x00, 0x64, 0x03, 0x00, 0x83, 0x01, 
-    0x00, 0x01, 0x71, 0x30, 0x00, 0x64, 0x00, 0x00, 
-    0x64, 0x01, 0x00, 0x6B, 0x07, 0x00, 0x5A, 0x07, 
-    0x00, 0x65, 0x07, 0x00, 0x69, 0x07, 0x00, 0x65, 
-    0x08, 0x00, 0x83, 0x00, 0x00, 0x83, 0x01, 0x00, 
+    0x61, 0x69, 0x6E, 0x03, 0x02, 0x00, 0x0C, 0x01, 
+    0x03, 0x08, 0x00, 0x6D, 0x61, 0x69, 0x6E, 0x2E, 
+    0x70, 0x79, 0x00, 0x04, 0x02, 0x01, 0xFF, 0xFF, 
+    0xFF, 0xFF, 0x00, 0x04, 0x00, 0x64, 0x00, 0x00, 
+    0x64, 0x01, 0x00, 0x6B, 0x00, 0x00, 0x5A, 0x00, 
+    0x00, 0x65, 0x00, 0x00, 0x69, 0x00, 0x00, 0x65, 
+    0x01, 0x00, 0x83, 0x00, 0x00, 0x83, 0x01, 0x00, 
     0x01, 0x64, 0x01, 0x00, 0x53, 
 
 /* mbed.py */
-    0x0A, 0x1C, 0x07, 0x00, 0x40, 0x03, 0x00, 0x00, 
-    0x18, 0x00, 0x04, 0x0B, 0x03, 0x07, 0x00, 0x5F, 
+    0x0A, 0x6A, 0x09, 0x00, 0x40, 0x03, 0x00, 0x00, 
+    0x11, 0x00, 0x04, 0x0D, 0x03, 0x07, 0x00, 0x5F, 
     0x5F, 0x64, 0x6F, 0x63, 0x5F, 0x5F, 0x03, 0x06, 
     0x00, 0x6F, 0x62, 0x6A, 0x65, 0x63, 0x74, 0x03, 
     0x0A, 0x00, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 
     0x6C, 0x4F, 0x75, 0x74, 0x03, 0x09, 0x00, 0x44, 
     0x69, 0x67, 0x69, 0x74, 0x61, 0x6C, 0x49, 0x6E, 
-    0x03, 0x08, 0x00, 0x41, 0x6E, 0x61, 0x6C, 0x6F, 
-    0x67, 0x49, 0x6E, 0x03, 0x09, 0x00, 0x41, 0x6E, 
-    0x61, 0x6C, 0x6F, 0x67, 0x4F, 0x75, 0x74, 0x03, 
-    0x06, 0x00, 0x50, 0x77, 0x6D, 0x4F, 0x75, 0x74, 
-    0x03, 0x06, 0x00, 0x53, 0x65, 0x72, 0x69, 0x61, 
-    0x6C, 0x03, 0x03, 0x00, 0x53, 0x50, 0x49, 0x03, 
-    0x03, 0x00, 0x49, 0x32, 0x43, 0x03, 0x04, 0x00, 
-    0x6D, 0x62, 0x65, 0x64, 0x03, 0x12, 0x00, 0x06, 
-    0x02, 0x16, 0x73, 0x16, 0x4B, 0x16, 0x6F, 0x16, 
-    0xAB, 0x16, 0xFF, 0x00, 0x54, 0x16, 0xA3, 0x16, 
-    0xB7, 0x03, 0x08, 0x00, 0x6D, 0x62, 0x65, 0x64, 
-    0x2E, 0x70, 0x79, 0x00, 0x04, 0x12, 0x00, 0x03, 
-    0x0A, 0x00, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 
-    0x6C, 0x4F, 0x75, 0x74, 0x0A, 0x92, 0x00, 0x00, 
-    0x42, 0x01, 0x00, 0x00, 0x1A, 0x00, 0x04, 0x06, 
+    0x03, 0x0C, 0x00, 0x44, 0x69, 0x67, 0x69, 0x74, 
+    0x61, 0x6C, 0x49, 0x6E, 0x4F, 0x75, 0x74, 0x03, 
+    0x08, 0x00, 0x41, 0x6E, 0x61, 0x6C, 0x6F, 0x67, 
+    0x49, 0x6E, 0x03, 0x09, 0x00, 0x41, 0x6E, 0x61, 
+    0x6C, 0x6F, 0x67, 0x4F, 0x75, 0x74, 0x03, 0x06, 
+    0x00, 0x50, 0x77, 0x6D, 0x4F, 0x75, 0x74, 0x03, 
+    0x06, 0x00, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6C, 
+    0x03, 0x03, 0x00, 0x53, 0x50, 0x49, 0x03, 0x03, 
+    0x00, 0x49, 0x32, 0x43, 0x03, 0x05, 0x00, 0x54, 
+    0x69, 0x6D, 0x65, 0x72, 0x03, 0x04, 0x00, 0x6D, 
+    0x62, 0x65, 0x64, 0x03, 0x14, 0x00, 0x06, 0x02, 
+    0x16, 0x16, 0x16, 0x0F, 0x16, 0x24, 0x16, 0x17, 
+    0x16, 0x1D, 0x16, 0x40, 0x16, 0x3E, 0x16, 0x1D, 
+    0x16, 0x1F, 0x03, 0x08, 0x00, 0x6D, 0x62, 0x65, 
+    0x64, 0x2E, 0x70, 0x79, 0x00, 0x04, 0x16, 0x00, 
+    0x03, 0x0A, 0x00, 0x44, 0x69, 0x67, 0x69, 0x74, 
+    0x61, 0x6C, 0x4F, 0x75, 0x74, 0x0A, 0x92, 0x00, 
+    0x00, 0x42, 0x01, 0x00, 0x00, 0x13, 0x00, 0x04, 
+    0x06, 0x03, 0x08, 0x00, 0x5F, 0x5F, 0x6E, 0x61, 
+    0x6D, 0x65, 0x5F, 0x5F, 0x03, 0x0A, 0x00, 0x5F, 
+    0x5F, 0x6D, 0x6F, 0x64, 0x75, 0x6C, 0x65, 0x5F, 
+    0x5F, 0x03, 0x08, 0x00, 0x5F, 0x5F, 0x69, 0x6E, 
+    0x69, 0x74, 0x5F, 0x5F, 0x03, 0x05, 0x00, 0x77, 
+    0x72, 0x69, 0x74, 0x65, 0x03, 0x04, 0x00, 0x72, 
+    0x65, 0x61, 0x64, 0x03, 0x0A, 0x00, 0x44, 0x69, 
+    0x67, 0x69, 0x74, 0x61, 0x6C, 0x4F, 0x75, 0x74, 
+    0x03, 0x06, 0x00, 0x06, 0x01, 0x09, 0x07, 0x09, 
+    0x07, 0x03, 0x08, 0x00, 0x6D, 0x62, 0x65, 0x64, 
+    0x2E, 0x70, 0x79, 0x00, 0x04, 0x03, 0x0B, 0x02, 
+    0xFF, 0xFF, 0x0B, 0x02, 0xFE, 0xFF, 0x0B, 0x01, 
+    0xFD, 0xFF, 0x04, 0x00, 0x65, 0x00, 0x00, 0x5A, 
+    0x01, 0x00, 0x64, 0x00, 0x00, 0x84, 0x00, 0x00, 
+    0x5A, 0x02, 0x00, 0x64, 0x01, 0x00, 0x84, 0x00, 
+    0x00, 0x5A, 0x03, 0x00, 0x64, 0x02, 0x00, 0x84, 
+    0x00, 0x00, 0x5A, 0x04, 0x00, 0x52, 0x53, 0x03, 
+    0x09, 0x00, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 
+    0x6C, 0x49, 0x6E, 0x0A, 0x7A, 0x00, 0x00, 0x42, 
+    0x01, 0x00, 0x00, 0x29, 0x00, 0x04, 0x05, 0x03, 
+    0x08, 0x00, 0x5F, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 
+    0x5F, 0x5F, 0x03, 0x0A, 0x00, 0x5F, 0x5F, 0x6D, 
+    0x6F, 0x64, 0x75, 0x6C, 0x65, 0x5F, 0x5F, 0x03, 
+    0x08, 0x00, 0x5F, 0x5F, 0x69, 0x6E, 0x69, 0x74, 
+    0x5F, 0x5F, 0x03, 0x04, 0x00, 0x72, 0x65, 0x61, 
+    0x64, 0x03, 0x09, 0x00, 0x44, 0x69, 0x67, 0x69, 
+    0x74, 0x61, 0x6C, 0x49, 0x6E, 0x03, 0x04, 0x00, 
+    0x06, 0x01, 0x09, 0x07, 0x03, 0x08, 0x00, 0x6D, 
+    0x62, 0x65, 0x64, 0x2E, 0x70, 0x79, 0x00, 0x04, 
+    0x02, 0x0B, 0x02, 0xFC, 0xFF, 0x0B, 0x01, 0xFB, 
+    0xFF, 0x04, 0x00, 0x65, 0x00, 0x00, 0x5A, 0x01, 
+    0x00, 0x64, 0x00, 0x00, 0x84, 0x00, 0x00, 0x5A, 
+    0x02, 0x00, 0x64, 0x01, 0x00, 0x84, 0x00, 0x00, 
+    0x5A, 0x03, 0x00, 0x52, 0x53, 0x03, 0x0C, 0x00, 
+    0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6C, 0x49, 
+    0x6E, 0x4F, 0x75, 0x74, 0x0A, 0xC3, 0x00, 0x00, 
+    0x42, 0x01, 0x00, 0x00, 0x38, 0x00, 0x04, 0x08, 
     0x03, 0x08, 0x00, 0x5F, 0x5F, 0x6E, 0x61, 0x6D, 
     0x65, 0x5F, 0x5F, 0x03, 0x0A, 0x00, 0x5F, 0x5F, 
     0x6D, 0x6F, 0x64, 0x75, 0x6C, 0x65, 0x5F, 0x5F, 
     0x03, 0x08, 0x00, 0x5F, 0x5F, 0x69, 0x6E, 0x69, 
-    0x74, 0x5F, 0x5F, 0x03, 0x05, 0x00, 0x77, 0x72, 
-    0x69, 0x74, 0x65, 0x03, 0x04, 0x00, 0x72, 0x65, 
-    0x61, 0x64, 0x03, 0x0A, 0x00, 0x44, 0x69, 0x67, 
-    0x69, 0x74, 0x61, 0x6C, 0x4F, 0x75, 0x74, 0x03, 
-    0x06, 0x00, 0x06, 0x01, 0x09, 0x2A, 0x09, 0x27, 
-    0x03, 0x08, 0x00, 0x6D, 0x62, 0x65, 0x64, 0x2E, 
-    0x70, 0x79, 0x00, 0x04, 0x03, 0x0B, 0x02, 0xFF, 
-    0xFF, 0x0B, 0x02, 0xFE, 0xFF, 0x0B, 0x01, 0xFD, 
-    0xFF, 0x04, 0x00, 0x65, 0x00, 0x00, 0x5A, 0x01, 
-    0x00, 0x64, 0x00, 0x00, 0x84, 0x00, 0x00, 0x5A, 
-    0x02, 0x00, 0x64, 0x01, 0x00, 0x84, 0x00, 0x00, 
-    0x5A, 0x03, 0x00, 0x64, 0x02, 0x00, 0x84, 0x00, 
-    0x00, 0x5A, 0x04, 0x00, 0x52, 0x53, 0x03, 0x09, 
-    0x00, 0x44, 0x69, 0x67, 0x69, 0x74, 0x61, 0x6C, 
-    0x49, 0x6E, 0x0A, 0x7A, 0x00, 0x00, 0x42, 0x01, 
-    0x00, 0x00, 0x8D, 0x00, 0x04, 0x05, 0x03, 0x08, 
+    0x74, 0x5F, 0x5F, 0x03, 0x04, 0x00, 0x72, 0x65, 
+    0x61, 0x64, 0x03, 0x05, 0x00, 0x77, 0x72, 0x69, 
+    0x74, 0x65, 0x03, 0x05, 0x00, 0x69, 0x6E, 0x70, 
+    0x75, 0x74, 0x03, 0x06, 0x00, 0x6F, 0x75, 0x74, 
+    0x70, 0x75, 0x74, 0x03, 0x0C, 0x00, 0x44, 0x69, 
+    0x67, 0x69, 0x74, 0x61, 0x6C, 0x49, 0x6E, 0x4F, 
+    0x75, 0x74, 0x03, 0x0A, 0x00, 0x06, 0x01, 0x09, 
+    0x07, 0x09, 0x07, 0x09, 0x07, 0x09, 0x07, 0x03, 
+    0x08, 0x00, 0x6D, 0x62, 0x65, 0x64, 0x2E, 0x70, 
+    0x79, 0x00, 0x04, 0x05, 0x0B, 0x02, 0xFA, 0xFF, 
+    0x0B, 0x01, 0xF9, 0xFF, 0x0B, 0x02, 0xF8, 0xFF, 
+    0x0B, 0x01, 0xF7, 0xFF, 0x0B, 0x01, 0xF6, 0xFF, 
+    0x04, 0x00, 0x65, 0x00, 0x00, 0x5A, 0x01, 0x00, 
+    0x64, 0x00, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x02, 
+    0x00, 0x64, 0x01, 0x00, 0x84, 0x00, 0x00, 0x5A, 
+    0x03, 0x00, 0x64, 0x02, 0x00, 0x84, 0x00, 0x00, 
+    0x5A, 0x04, 0x00, 0x64, 0x03, 0x00, 0x84, 0x00, 
+    0x00, 0x5A, 0x05, 0x00, 0x64, 0x04, 0x00, 0x84, 
+    0x00, 0x00, 0x5A, 0x06, 0x00, 0x52, 0x53, 0x03, 
+    0x08, 0x00, 0x41, 0x6E, 0x61, 0x6C, 0x6F, 0x67, 
+    0x49, 0x6E, 0x0A, 0x93, 0x00, 0x00, 0x42, 0x01, 
+    0x00, 0x00, 0x5C, 0x00, 0x04, 0x06, 0x03, 0x08, 
     0x00, 0x5F, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 
     0x5F, 0x03, 0x0A, 0x00, 0x5F, 0x5F, 0x6D, 0x6F, 
     0x64, 0x75, 0x6C, 0x65, 0x5F, 0x5F, 0x03, 0x08, 
     0x00, 0x5F, 0x5F, 0x69, 0x6E, 0x69, 0x74, 0x5F, 
-    0x5F, 0x03, 0x04, 0x00, 0x72, 0x65, 0x61, 0x64, 
-    0x03, 0x09, 0x00, 0x44, 0x69, 0x67, 0x69, 0x74, 
-    0x61, 0x6C, 0x49, 0x6E, 0x03, 0x04, 0x00, 0x06, 
-    0x01, 0x09, 0x2A, 0x03, 0x08, 0x00, 0x6D, 0x62, 
-    0x65, 0x64, 0x2E, 0x70, 0x79, 0x00, 0x04, 0x02, 
-    0x0B, 0x02, 0xFC, 0xFF, 0x0B, 0x01, 0xFB, 0xFF, 
+    0x5F, 0x03, 0x08, 0x00, 0x72, 0x65, 0x61, 0x64, 
+    0x5F, 0x75, 0x31, 0x36, 0x03, 0x04, 0x00, 0x72, 
+    0x65, 0x61, 0x64, 0x03, 0x08, 0x00, 0x41, 0x6E, 
+    0x61, 0x6C, 0x6F, 0x67, 0x49, 0x6E, 0x03, 0x06, 
+    0x00, 0x06, 0x02, 0x09, 0x07, 0x09, 0x07, 0x03, 
+    0x08, 0x00, 0x6D, 0x62, 0x65, 0x64, 0x2E, 0x70, 
+    0x79, 0x00, 0x04, 0x03, 0x0B, 0x02, 0xF5, 0xFF, 
+    0x0B, 0x01, 0xF4, 0xFF, 0x0B, 0x01, 0xF3, 0xFF, 
     0x04, 0x00, 0x65, 0x00, 0x00, 0x5A, 0x01, 0x00, 
     0x64, 0x00, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x02, 
     0x00, 0x64, 0x01, 0x00, 0x84, 0x00, 0x00, 0x5A, 
-    0x03, 0x00, 0x52, 0x53, 0x03, 0x08, 0x00, 0x41, 
-    0x6E, 0x61, 0x6C, 0x6F, 0x67, 0x49, 0x6E, 0x0A, 
-    0x93, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0xD8, 
-    0x00, 0x04, 0x06, 0x03, 0x08, 0x00, 0x5F, 0x5F, 
-    0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x5F, 0x03, 0x0A, 
-    0x00, 0x5F, 0x5F, 0x6D, 0x6F, 0x64, 0x75, 0x6C, 
-    0x65, 0x5F, 0x5F, 0x03, 0x08, 0x00, 0x5F, 0x5F, 
-    0x69, 0x6E, 0x69, 0x74, 0x5F, 0x5F, 0x03, 0x08, 
-    0x00, 0x72, 0x65, 0x61, 0x64, 0x5F, 0x75, 0x31, 
-    0x36, 0x03, 0x04, 0x00, 0x72, 0x65, 0x61, 0x64, 
-    0x03, 0x08, 0x00, 0x41, 0x6E, 0x61, 0x6C, 0x6F, 
-    0x67, 0x49, 0x6E, 0x03, 0x06, 0x00, 0x06, 0x02, 
-    0x09, 0x2B, 0x09, 0x21, 0x03, 0x08, 0x00, 0x6D, 
-    0x62, 0x65, 0x64, 0x2E, 0x70, 0x79, 0x00, 0x04, 
-    0x03, 0x0B, 0x02, 0xFA, 0xFF, 0x0B, 0x01, 0xF9, 
-    0xFF, 0x0B, 0x01, 0xF8, 0xFF, 0x04, 0x00, 0x65, 
-    0x00, 0x00, 0x5A, 0x01, 0x00, 0x64, 0x00, 0x00, 
-    0x84, 0x00, 0x00, 0x5A, 0x02, 0x00, 0x64, 0x01, 
-    0x00, 0x84, 0x00, 0x00, 0x5A, 0x03, 0x00, 0x64, 
-    0x02, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x04, 0x00, 
-    0x52, 0x53, 0x03, 0x09, 0x00, 0x41, 0x6E, 0x61, 
-    0x6C, 0x6F, 0x67, 0x4F, 0x75, 0x74, 0x0A, 0xAC, 
-    0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x47, 0x01, 
-    0x04, 0x07, 0x03, 0x08, 0x00, 0x5F, 0x5F, 0x6E, 
-    0x61, 0x6D, 0x65, 0x5F, 0x5F, 0x03, 0x0A, 0x00, 
-    0x5F, 0x5F, 0x6D, 0x6F, 0x64, 0x75, 0x6C, 0x65, 
-    0x5F, 0x5F, 0x03, 0x08, 0x00, 0x5F, 0x5F, 0x69, 
-    0x6E, 0x69, 0x74, 0x5F, 0x5F, 0x03, 0x09, 0x00, 
-    0x77, 0x72, 0x69, 0x74, 0x65, 0x5F, 0x75, 0x31, 
-    0x36, 0x03, 0x05, 0x00, 0x77, 0x72, 0x69, 0x74, 
-    0x65, 0x03, 0x04, 0x00, 0x72, 0x65, 0x61, 0x64, 
-    0x03, 0x09, 0x00, 0x41, 0x6E, 0x61, 0x6C, 0x6F, 
-    0x67, 0x4F, 0x75, 0x74, 0x03, 0x08, 0x00, 0x06, 
-    0x02, 0x09, 0x2C, 0x09, 0x28, 0x09, 0x32, 0x03, 
-    0x08, 0x00, 0x6D, 0x62, 0x65, 0x64, 0x2E, 0x70, 
-    0x79, 0x00, 0x04, 0x04, 0x0B, 0x02, 0xF7, 0xFF, 
-    0x0B, 0x02, 0xF6, 0xFF, 0x0B, 0x02, 0xF5, 0xFF, 
-    0x0B, 0x01, 0xF4, 0xFF, 0x04, 0x00, 0x65, 0x00, 
-    0x00, 0x5A, 0x01, 0x00, 0x64, 0x00, 0x00, 0x84, 
-    0x00, 0x00, 0x5A, 0x02, 0x00, 0x64, 0x01, 0x00, 
-    0x84, 0x00, 0x00, 0x5A, 0x03, 0x00, 0x64, 0x02, 
-    0x00, 0x84, 0x00, 0x00, 0x5A, 0x04, 0x00, 0x64, 
-    0x03, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x05, 0x00, 
-    0x52, 0x53, 0x03, 0x06, 0x00, 0x50, 0x77, 0x6D, 
-    0x4F, 0x75, 0x74, 0x0A, 0x36, 0x01, 0x00, 0x42, 
-    0x01, 0x00, 0x00, 0xF2, 0x01, 0x04, 0x0C, 0x03, 
-    0x08, 0x00, 0x5F, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 
-    0x5F, 0x5F, 0x03, 0x0A, 0x00, 0x5F, 0x5F, 0x6D, 
-    0x6F, 0x64, 0x75, 0x6C, 0x65, 0x5F, 0x5F, 0x03, 
-    0x08, 0x00, 0x5F, 0x5F, 0x69, 0x6E, 0x69, 0x74, 
-    0x5F, 0x5F, 0x03, 0x05, 0x00, 0x77, 0x72, 0x69, 
-    0x74, 0x65, 0x03, 0x04, 0x00, 0x72, 0x65, 0x61, 
-    0x64, 0x03, 0x06, 0x00, 0x70, 0x65, 0x72, 0x69, 
-    0x6F, 0x64, 0x03, 0x09, 0x00, 0x70, 0x65, 0x72, 
-    0x69, 0x6F, 0x64, 0x5F, 0x6D, 0x73, 0x03, 0x09, 
-    0x00, 0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x5F, 
-    0x75, 0x73, 0x03, 0x0A, 0x00, 0x70, 0x75, 0x6C, 
-    0x73, 0x65, 0x77, 0x69, 0x64, 0x74, 0x68, 0x03, 
-    0x0D, 0x00, 0x70, 0x75, 0x73, 0x6C, 0x65, 0x77, 
-    0x69, 0x64, 0x74, 0x68, 0x5F, 0x6D, 0x73, 0x03, 
-    0x0D, 0x00, 0x70, 0x75, 0x6C, 0x73, 0x65, 0x77, 
-    0x69, 0x64, 0x74, 0x68, 0x5F, 0x75, 0x73, 0x03, 
-    0x06, 0x00, 0x50, 0x77, 0x6D, 0x4F, 0x75, 0x74, 
-    0x03, 0x12, 0x00, 0x06, 0x01, 0x09, 0x2A, 0x09, 
-    0x23, 0x09, 0x21, 0x09, 0x22, 0x09, 0x27, 0x09, 
-    0x27, 0x09, 0x25, 0x09, 0x28, 0x03, 0x08, 0x00, 
-    0x6D, 0x62, 0x65, 0x64, 0x2E, 0x70, 0x79, 0x00, 
-    0x04, 0x09, 0x0B, 0x02, 0xF3, 0xFF, 0x0B, 0x02, 
-    0xF2, 0xFF, 0x0B, 0x01, 0xF1, 0xFF, 0x0B, 0x02, 
-    0xF0, 0xFF, 0x0B, 0x02, 0xEF, 0xFF, 0x0B, 0x02, 
-    0xEE, 0xFF, 0x0B, 0x02, 0xED, 0xFF, 0x0B, 0x02, 
-    0xEC, 0xFF, 0x0B, 0x02, 0xEB, 0xFF, 0x04, 0x00, 
-    0x65, 0x00, 0x00, 0x5A, 0x01, 0x00, 0x64, 0x00, 
-    0x00, 0x84, 0x00, 0x00, 0x5A, 0x02, 0x00, 0x64, 
-    0x01, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x03, 0x00, 
-    0x64, 0x02, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x04, 
-    0x00, 0x64, 0x03, 0x00, 0x84, 0x00, 0x00, 0x5A, 
-    0x05, 0x00, 0x64, 0x04, 0x00, 0x84, 0x00, 0x00, 
-    0x5A, 0x06, 0x00, 0x64, 0x05, 0x00, 0x84, 0x00, 
-    0x00, 0x5A, 0x07, 0x00, 0x64, 0x06, 0x00, 0x84, 
-    0x00, 0x00, 0x5A, 0x08, 0x00, 0x64, 0x07, 0x00, 
-    0x84, 0x00, 0x00, 0x5A, 0x09, 0x00, 0x64, 0x08, 
-    0x00, 0x84, 0x00, 0x00, 0x5A, 0x0A, 0x00, 0x52, 
-    0x53, 0x03, 0x06, 0x00, 0x53, 0x65, 0x72, 0x69, 
-    0x61, 0x6C, 0x0A, 0xA3, 0x00, 0x00, 0x42, 0x01, 
-    0x00, 0x00, 0x45, 0x03, 0x04, 0x07, 0x03, 0x08, 
-    0x00, 0x5F, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 
-    0x5F, 0x03, 0x0A, 0x00, 0x5F, 0x5F, 0x6D, 0x6F, 
-    0x64, 0x75, 0x6C, 0x65, 0x5F, 0x5F, 0x03, 0x08, 
-    0x00, 0x5F, 0x5F, 0x69, 0x6E, 0x69, 0x74, 0x5F, 
-    0x5F, 0x03, 0x04, 0x00, 0x70, 0x75, 0x74, 0x63, 
-    0x03, 0x04, 0x00, 0x70, 0x75, 0x74, 0x73, 0x03, 
-    0x04, 0x00, 0x67, 0x65, 0x74, 0x63, 0x03, 0x06, 
-    0x00, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6C, 0x03, 
-    0x08, 0x00, 0x06, 0x02, 0x09, 0x30, 0x09, 0x28, 
-    0x09, 0x28, 0x03, 0x08, 0x00, 0x6D, 0x62, 0x65, 
+    0x03, 0x00, 0x64, 0x02, 0x00, 0x84, 0x00, 0x00, 
+    0x5A, 0x04, 0x00, 0x52, 0x53, 0x03, 0x09, 0x00, 
+    0x41, 0x6E, 0x61, 0x6C, 0x6F, 0x67, 0x4F, 0x75, 
+    0x74, 0x0A, 0xAC, 0x00, 0x00, 0x42, 0x01, 0x00, 
+    0x00, 0x73, 0x00, 0x04, 0x07, 0x03, 0x08, 0x00, 
+    0x5F, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x5F, 
+    0x03, 0x0A, 0x00, 0x5F, 0x5F, 0x6D, 0x6F, 0x64, 
+    0x75, 0x6C, 0x65, 0x5F, 0x5F, 0x03, 0x08, 0x00, 
+    0x5F, 0x5F, 0x69, 0x6E, 0x69, 0x74, 0x5F, 0x5F, 
+    0x03, 0x09, 0x00, 0x77, 0x72, 0x69, 0x74, 0x65, 
+    0x5F, 0x75, 0x31, 0x36, 0x03, 0x05, 0x00, 0x77, 
+    0x72, 0x69, 0x74, 0x65, 0x03, 0x04, 0x00, 0x72, 
+    0x65, 0x61, 0x64, 0x03, 0x09, 0x00, 0x41, 0x6E, 
+    0x61, 0x6C, 0x6F, 0x67, 0x4F, 0x75, 0x74, 0x03, 
+    0x08, 0x00, 0x06, 0x01, 0x09, 0x07, 0x09, 0x07, 
+    0x09, 0x07, 0x03, 0x08, 0x00, 0x6D, 0x62, 0x65, 
     0x64, 0x2E, 0x70, 0x79, 0x00, 0x04, 0x04, 0x0B, 
-    0x03, 0xEA, 0xFF, 0x0B, 0x02, 0xE9, 0xFF, 0x0B, 
-    0x02, 0xE8, 0xFF, 0x0B, 0x01, 0xE7, 0xFF, 0x04, 
+    0x02, 0xF2, 0xFF, 0x0B, 0x02, 0xF1, 0xFF, 0x0B, 
+    0x02, 0xF0, 0xFF, 0x0B, 0x01, 0xEF, 0xFF, 0x04, 
     0x00, 0x65, 0x00, 0x00, 0x5A, 0x01, 0x00, 0x64, 
     0x00, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x02, 0x00, 
     0x64, 0x01, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x03, 
     0x00, 0x64, 0x02, 0x00, 0x84, 0x00, 0x00, 0x5A, 
     0x04, 0x00, 0x64, 0x03, 0x00, 0x84, 0x00, 0x00, 
-    0x5A, 0x05, 0x00, 0x52, 0x53, 0x03, 0x03, 0x00, 
-    0x53, 0x50, 0x49, 0x0A, 0xB0, 0x00, 0x00, 0x42, 
-    0x02, 0x00, 0x00, 0xE8, 0x03, 0x04, 0x07, 0x03, 
-    0x08, 0x00, 0x5F, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 
-    0x5F, 0x5F, 0x03, 0x0A, 0x00, 0x5F, 0x5F, 0x6D, 
-    0x6F, 0x64, 0x75, 0x6C, 0x65, 0x5F, 0x5F, 0x03, 
-    0x08, 0x00, 0x5F, 0x5F, 0x69, 0x6E, 0x69, 0x74, 
-    0x5F, 0x5F, 0x03, 0x06, 0x00, 0x66, 0x6F, 0x72, 
-    0x6D, 0x61, 0x74, 0x03, 0x09, 0x00, 0x66, 0x72, 
-    0x65, 0x71, 0x75, 0x65, 0x6E, 0x63, 0x79, 0x03, 
-    0x05, 0x00, 0x77, 0x72, 0x69, 0x74, 0x65, 0x03, 
-    0x03, 0x00, 0x53, 0x50, 0x49, 0x03, 0x08, 0x00, 
-    0x06, 0x02, 0x09, 0x34, 0x0C, 0x30, 0x09, 0x28, 
+    0x5A, 0x05, 0x00, 0x52, 0x53, 0x03, 0x06, 0x00, 
+    0x50, 0x77, 0x6D, 0x4F, 0x75, 0x74, 0x0A, 0x36, 
+    0x01, 0x00, 0x42, 0x01, 0x00, 0x00, 0x90, 0x00, 
+    0x04, 0x0C, 0x03, 0x08, 0x00, 0x5F, 0x5F, 0x6E, 
+    0x61, 0x6D, 0x65, 0x5F, 0x5F, 0x03, 0x0A, 0x00, 
+    0x5F, 0x5F, 0x6D, 0x6F, 0x64, 0x75, 0x6C, 0x65, 
+    0x5F, 0x5F, 0x03, 0x08, 0x00, 0x5F, 0x5F, 0x69, 
+    0x6E, 0x69, 0x74, 0x5F, 0x5F, 0x03, 0x05, 0x00, 
+    0x77, 0x72, 0x69, 0x74, 0x65, 0x03, 0x04, 0x00, 
+    0x72, 0x65, 0x61, 0x64, 0x03, 0x06, 0x00, 0x70, 
+    0x65, 0x72, 0x69, 0x6F, 0x64, 0x03, 0x09, 0x00, 
+    0x70, 0x65, 0x72, 0x69, 0x6F, 0x64, 0x5F, 0x6D, 
+    0x73, 0x03, 0x09, 0x00, 0x70, 0x65, 0x72, 0x69, 
+    0x6F, 0x64, 0x5F, 0x75, 0x73, 0x03, 0x0A, 0x00, 
+    0x70, 0x75, 0x6C, 0x73, 0x65, 0x77, 0x69, 0x64, 
+    0x74, 0x68, 0x03, 0x0D, 0x00, 0x70, 0x75, 0x6C, 
+    0x73, 0x65, 0x77, 0x69, 0x64, 0x74, 0x68, 0x5F, 
+    0x6D, 0x73, 0x03, 0x0D, 0x00, 0x70, 0x75, 0x6C, 
+    0x73, 0x65, 0x77, 0x69, 0x64, 0x74, 0x68, 0x5F, 
+    0x75, 0x73, 0x03, 0x06, 0x00, 0x50, 0x77, 0x6D, 
+    0x4F, 0x75, 0x74, 0x03, 0x12, 0x00, 0x06, 0x01, 
+    0x09, 0x07, 0x09, 0x07, 0x09, 0x07, 0x09, 0x07, 
+    0x09, 0x07, 0x09, 0x07, 0x09, 0x07, 0x09, 0x07, 
     0x03, 0x08, 0x00, 0x6D, 0x62, 0x65, 0x64, 0x2E, 
-    0x70, 0x79, 0x00, 0x04, 0x05, 0x0B, 0x04, 0xE6, 
-    0xFF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x03, 
-    0xE5, 0xFF, 0x0B, 0x02, 0xE4, 0xFF, 0x0B, 0x02, 
-    0xE3, 0xFF, 0x04, 0x00, 0x65, 0x00, 0x00, 0x5A, 
-    0x01, 0x00, 0x64, 0x00, 0x00, 0x84, 0x00, 0x00, 
-    0x5A, 0x02, 0x00, 0x64, 0x01, 0x00, 0x64, 0x02, 
-    0x00, 0x84, 0x01, 0x00, 0x5A, 0x03, 0x00, 0x64, 
-    0x03, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x04, 0x00, 
-    0x64, 0x04, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x05, 
-    0x00, 0x52, 0x53, 0x03, 0x03, 0x00, 0x49, 0x32, 
-    0x43, 0x0A, 0xA6, 0x00, 0x00, 0x42, 0x01, 0x00, 
-    0x00, 0x9F, 0x04, 0x04, 0x07, 0x03, 0x08, 0x00, 
-    0x5F, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x5F, 
-    0x03, 0x0A, 0x00, 0x5F, 0x5F, 0x6D, 0x6F, 0x64, 
-    0x75, 0x6C, 0x65, 0x5F, 0x5F, 0x03, 0x08, 0x00, 
-    0x5F, 0x5F, 0x69, 0x6E, 0x69, 0x74, 0x5F, 0x5F, 
-    0x03, 0x09, 0x00, 0x66, 0x72, 0x65, 0x71, 0x75, 
-    0x65, 0x6E, 0x63, 0x79, 0x03, 0x04, 0x00, 0x72, 
-    0x65, 0x61, 0x64, 0x03, 0x05, 0x00, 0x77, 0x72, 
-    0x69, 0x74, 0x65, 0x03, 0x03, 0x00, 0x49, 0x32, 
-    0x43, 0x03, 0x08, 0x00, 0x06, 0x02, 0x09, 0x30, 
-    0x09, 0x28, 0x09, 0x30, 0x03, 0x08, 0x00, 0x6D, 
-    0x62, 0x65, 0x64, 0x2E, 0x70, 0x79, 0x00, 0x04, 
-    0x04, 0x0B, 0x03, 0xE2, 0xFF, 0x0B, 0x02, 0xE1, 
-    0xFF, 0x0B, 0x04, 0xE0, 0xFF, 0x0B, 0x04, 0xDF, 
+    0x70, 0x79, 0x00, 0x04, 0x09, 0x0B, 0x02, 0xEE, 
+    0xFF, 0x0B, 0x02, 0xED, 0xFF, 0x0B, 0x01, 0xEC, 
+    0xFF, 0x0B, 0x02, 0xEB, 0xFF, 0x0B, 0x02, 0xEA, 
+    0xFF, 0x0B, 0x02, 0xE9, 0xFF, 0x0B, 0x02, 0xE8, 
+    0xFF, 0x0B, 0x02, 0xE7, 0xFF, 0x0B, 0x02, 0xE6, 
     0xFF, 0x04, 0x00, 0x65, 0x00, 0x00, 0x5A, 0x01, 
     0x00, 0x64, 0x00, 0x00, 0x84, 0x00, 0x00, 0x5A, 
     0x02, 0x00, 0x64, 0x01, 0x00, 0x84, 0x00, 0x00, 
     0x5A, 0x03, 0x00, 0x64, 0x02, 0x00, 0x84, 0x00, 
     0x00, 0x5A, 0x04, 0x00, 0x64, 0x03, 0x00, 0x84, 
-    0x00, 0x00, 0x5A, 0x05, 0x00, 0x52, 0x53, 0x00, 
-    0x04, 0x00, 0x64, 0x00, 0x00, 0x5A, 0x00, 0x00, 
-    0x64, 0x01, 0x00, 0x65, 0x01, 0x00, 0x66, 0x01, 
-    0x00, 0x64, 0x02, 0x00, 0x84, 0x00, 0x00, 0x83, 
-    0x00, 0x00, 0x59, 0x5A, 0x02, 0x00, 0x64, 0x03, 
+    0x00, 0x00, 0x5A, 0x05, 0x00, 0x64, 0x04, 0x00, 
+    0x84, 0x00, 0x00, 0x5A, 0x06, 0x00, 0x64, 0x05, 
+    0x00, 0x84, 0x00, 0x00, 0x5A, 0x07, 0x00, 0x64, 
+    0x06, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x08, 0x00, 
+    0x64, 0x07, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x09, 
+    0x00, 0x64, 0x08, 0x00, 0x84, 0x00, 0x00, 0x5A, 
+    0x0A, 0x00, 0x52, 0x53, 0x03, 0x06, 0x00, 0x53, 
+    0x65, 0x72, 0x69, 0x61, 0x6C, 0x0A, 0xEE, 0x00, 
+    0x00, 0x42, 0x01, 0x00, 0x00, 0xD0, 0x00, 0x04, 
+    0x0A, 0x03, 0x08, 0x00, 0x5F, 0x5F, 0x6E, 0x61, 
+    0x6D, 0x65, 0x5F, 0x5F, 0x03, 0x0A, 0x00, 0x5F, 
+    0x5F, 0x6D, 0x6F, 0x64, 0x75, 0x6C, 0x65, 0x5F, 
+    0x5F, 0x03, 0x08, 0x00, 0x5F, 0x5F, 0x69, 0x6E, 
+    0x69, 0x74, 0x5F, 0x5F, 0x03, 0x04, 0x00, 0x62, 
+    0x61, 0x75, 0x64, 0x03, 0x08, 0x00, 0x72, 0x65, 
+    0x61, 0x64, 0x61, 0x62, 0x6C, 0x65, 0x03, 0x09, 
+    0x00, 0x77, 0x72, 0x69, 0x74, 0x65, 0x61, 0x62, 
+    0x6C, 0x65, 0x03, 0x04, 0x00, 0x70, 0x75, 0x74, 
+    0x63, 0x03, 0x04, 0x00, 0x70, 0x75, 0x74, 0x73, 
+    0x03, 0x04, 0x00, 0x67, 0x65, 0x74, 0x63, 0x03, 
+    0x06, 0x00, 0x53, 0x65, 0x72, 0x69, 0x61, 0x6C, 
+    0x03, 0x0E, 0x00, 0x06, 0x01, 0x09, 0x07, 0x09, 
+    0x07, 0x09, 0x07, 0x09, 0x07, 0x09, 0x0B, 0x09, 
+    0x0B, 0x03, 0x08, 0x00, 0x6D, 0x62, 0x65, 0x64, 
+    0x2E, 0x70, 0x79, 0x00, 0x04, 0x07, 0x0B, 0x03, 
+    0xE5, 0xFF, 0x0B, 0x02, 0xE4, 0xFF, 0x0B, 0x01, 
+    0xE3, 0xFF, 0x0B, 0x01, 0xE2, 0xFF, 0x0B, 0x02, 
+    0xE1, 0xFF, 0x0B, 0x02, 0xE0, 0xFF, 0x0B, 0x01, 
+    0xDF, 0xFF, 0x04, 0x00, 0x65, 0x00, 0x00, 0x5A, 
+    0x01, 0x00, 0x64, 0x00, 0x00, 0x84, 0x00, 0x00, 
+    0x5A, 0x02, 0x00, 0x64, 0x01, 0x00, 0x84, 0x00, 
+    0x00, 0x5A, 0x03, 0x00, 0x64, 0x02, 0x00, 0x84, 
+    0x00, 0x00, 0x5A, 0x04, 0x00, 0x64, 0x03, 0x00, 
+    0x84, 0x00, 0x00, 0x5A, 0x05, 0x00, 0x64, 0x04, 
+    0x00, 0x84, 0x00, 0x00, 0x5A, 0x06, 0x00, 0x64, 
+    0x05, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x07, 0x00, 
+    0x64, 0x06, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x08, 
+    0x00, 0x52, 0x53, 0x03, 0x03, 0x00, 0x53, 0x50, 
+    0x49, 0x0A, 0xA8, 0x00, 0x00, 0x42, 0x01, 0x00, 
+    0x00, 0x0E, 0x01, 0x04, 0x07, 0x03, 0x08, 0x00, 
+    0x5F, 0x5F, 0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x5F, 
+    0x03, 0x0A, 0x00, 0x5F, 0x5F, 0x6D, 0x6F, 0x64, 
+    0x75, 0x6C, 0x65, 0x5F, 0x5F, 0x03, 0x08, 0x00, 
+    0x5F, 0x5F, 0x69, 0x6E, 0x69, 0x74, 0x5F, 0x5F, 
+    0x03, 0x06, 0x00, 0x66, 0x6F, 0x72, 0x6D, 0x61, 
+    0x74, 0x03, 0x09, 0x00, 0x66, 0x72, 0x65, 0x71, 
+    0x75, 0x65, 0x6E, 0x63, 0x79, 0x03, 0x05, 0x00, 
+    0x77, 0x72, 0x69, 0x74, 0x65, 0x03, 0x03, 0x00, 
+    0x53, 0x50, 0x49, 0x03, 0x08, 0x00, 0x06, 0x01, 
+    0x09, 0x07, 0x09, 0x07, 0x09, 0x07, 0x03, 0x08, 
+    0x00, 0x6D, 0x62, 0x65, 0x64, 0x2E, 0x70, 0x79, 
+    0x00, 0x04, 0x04, 0x0B, 0x04, 0xDE, 0xFF, 0x0B, 
+    0x03, 0xDD, 0xFF, 0x0B, 0x02, 0xDC, 0xFF, 0x0B, 
+    0x02, 0xDB, 0xFF, 0x04, 0x00, 0x65, 0x00, 0x00, 
+    0x5A, 0x01, 0x00, 0x64, 0x00, 0x00, 0x84, 0x00, 
+    0x00, 0x5A, 0x02, 0x00, 0x64, 0x01, 0x00, 0x84, 
+    0x00, 0x00, 0x5A, 0x03, 0x00, 0x64, 0x02, 0x00, 
+    0x84, 0x00, 0x00, 0x5A, 0x04, 0x00, 0x64, 0x03, 
+    0x00, 0x84, 0x00, 0x00, 0x5A, 0x05, 0x00, 0x52, 
+    0x53, 0x03, 0x03, 0x00, 0x49, 0x32, 0x43, 0x0A, 
+    0xA6, 0x00, 0x00, 0x42, 0x01, 0x00, 0x00, 0x2B, 
+    0x01, 0x04, 0x07, 0x03, 0x08, 0x00, 0x5F, 0x5F, 
+    0x6E, 0x61, 0x6D, 0x65, 0x5F, 0x5F, 0x03, 0x0A, 
+    0x00, 0x5F, 0x5F, 0x6D, 0x6F, 0x64, 0x75, 0x6C, 
+    0x65, 0x5F, 0x5F, 0x03, 0x08, 0x00, 0x5F, 0x5F, 
+    0x69, 0x6E, 0x69, 0x74, 0x5F, 0x5F, 0x03, 0x09, 
+    0x00, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6E, 
+    0x63, 0x79, 0x03, 0x04, 0x00, 0x72, 0x65, 0x61, 
+    0x64, 0x03, 0x05, 0x00, 0x77, 0x72, 0x69, 0x74, 
+    0x65, 0x03, 0x03, 0x00, 0x49, 0x32, 0x43, 0x03, 
+    0x08, 0x00, 0x06, 0x01, 0x09, 0x07, 0x09, 0x07, 
+    0x09, 0x08, 0x03, 0x08, 0x00, 0x6D, 0x62, 0x65, 
+    0x64, 0x2E, 0x70, 0x79, 0x00, 0x04, 0x04, 0x0B, 
+    0x03, 0xDA, 0xFF, 0x0B, 0x02, 0xD9, 0xFF, 0x0B, 
+    0x04, 0xD8, 0xFF, 0x0B, 0x04, 0xD7, 0xFF, 0x04, 
+    0x00, 0x65, 0x00, 0x00, 0x5A, 0x01, 0x00, 0x64, 
+    0x00, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x02, 0x00, 
+    0x64, 0x01, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x03, 
+    0x00, 0x64, 0x02, 0x00, 0x84, 0x00, 0x00, 0x5A, 
+    0x04, 0x00, 0x64, 0x03, 0x00, 0x84, 0x00, 0x00, 
+    0x5A, 0x05, 0x00, 0x52, 0x53, 0x03, 0x05, 0x00, 
+    0x54, 0x69, 0x6D, 0x65, 0x72, 0x0A, 0xEC, 0x00, 
+    0x00, 0x42, 0x01, 0x00, 0x00, 0x4A, 0x01, 0x04, 
+    0x0A, 0x03, 0x08, 0x00, 0x5F, 0x5F, 0x6E, 0x61, 
+    0x6D, 0x65, 0x5F, 0x5F, 0x03, 0x0A, 0x00, 0x5F, 
+    0x5F, 0x6D, 0x6F, 0x64, 0x75, 0x6C, 0x65, 0x5F, 
+    0x5F, 0x03, 0x08, 0x00, 0x5F, 0x5F, 0x69, 0x6E, 
+    0x69, 0x74, 0x5F, 0x5F, 0x03, 0x05, 0x00, 0x73, 
+    0x74, 0x61, 0x72, 0x74, 0x03, 0x04, 0x00, 0x73, 
+    0x74, 0x6F, 0x70, 0x03, 0x05, 0x00, 0x72, 0x65, 
+    0x73, 0x65, 0x74, 0x03, 0x04, 0x00, 0x72, 0x65, 
+    0x61, 0x64, 0x03, 0x07, 0x00, 0x72, 0x65, 0x61, 
+    0x64, 0x5F, 0x6D, 0x73, 0x03, 0x07, 0x00, 0x72, 
+    0x65, 0x61, 0x64, 0x5F, 0x75, 0x73, 0x03, 0x05, 
+    0x00, 0x54, 0x69, 0x6D, 0x65, 0x72, 0x03, 0x0E, 
+    0x00, 0x06, 0x01, 0x09, 0x07, 0x09, 0x07, 0x09, 
+    0x07, 0x09, 0x07, 0x09, 0x07, 0x09, 0x07, 0x03, 
+    0x08, 0x00, 0x6D, 0x62, 0x65, 0x64, 0x2E, 0x70, 
+    0x79, 0x00, 0x04, 0x07, 0x0B, 0x01, 0xD6, 0xFF, 
+    0x0B, 0x01, 0xD5, 0xFF, 0x0B, 0x01, 0xD4, 0xFF, 
+    0x0B, 0x01, 0xD3, 0xFF, 0x0B, 0x01, 0xD2, 0xFF, 
+    0x0B, 0x01, 0xD1, 0xFF, 0x0B, 0x01, 0xD0, 0xFF, 
+    0x04, 0x00, 0x65, 0x00, 0x00, 0x5A, 0x01, 0x00, 
+    0x64, 0x00, 0x00, 0x84, 0x00, 0x00, 0x5A, 0x02, 
+    0x00, 0x64, 0x01, 0x00, 0x84, 0x00, 0x00, 0x5A, 
+    0x03, 0x00, 0x64, 0x02, 0x00, 0x84, 0x00, 0x00, 
+    0x5A, 0x04, 0x00, 0x64, 0x03, 0x00, 0x84, 0x00, 
+    0x00, 0x5A, 0x05, 0x00, 0x64, 0x04, 0x00, 0x84, 
+    0x00, 0x00, 0x5A, 0x06, 0x00, 0x64, 0x05, 0x00, 
+    0x84, 0x00, 0x00, 0x5A, 0x07, 0x00, 0x64, 0x06, 
+    0x00, 0x84, 0x00, 0x00, 0x5A, 0x08, 0x00, 0x52, 
+    0x53, 0x00, 0x04, 0x00, 0x64, 0x00, 0x00, 0x5A, 
+    0x00, 0x00, 0x64, 0x01, 0x00, 0x65, 0x01, 0x00, 
+    0x66, 0x01, 0x00, 0x64, 0x02, 0x00, 0x84, 0x00, 
+    0x00, 0x83, 0x00, 0x00, 0x59, 0x5A, 0x02, 0x00, 
+    0x64, 0x03, 0x00, 0x65, 0x01, 0x00, 0x66, 0x01, 
+    0x00, 0x64, 0x04, 0x00, 0x84, 0x00, 0x00, 0x83, 
+    0x00, 0x00, 0x59, 0x5A, 0x03, 0x00, 0x64, 0x05, 
     0x00, 0x65, 0x01, 0x00, 0x66, 0x01, 0x00, 0x64, 
-    0x04, 0x00, 0x84, 0x00, 0x00, 0x83, 0x00, 0x00, 
-    0x59, 0x5A, 0x03, 0x00, 0x64, 0x05, 0x00, 0x65, 
-    0x01, 0x00, 0x66, 0x01, 0x00, 0x64, 0x06, 0x00, 
+    0x06, 0x00, 0x84, 0x00, 0x00, 0x83, 0x00, 0x00, 
+    0x59, 0x5A, 0x04, 0x00, 0x64, 0x07, 0x00, 0x65, 
+    0x01, 0x00, 0x66, 0x01, 0x00, 0x64, 0x08, 0x00, 
     0x84, 0x00, 0x00, 0x83, 0x00, 0x00, 0x59, 0x5A, 
-    0x04, 0x00, 0x64, 0x07, 0x00, 0x65, 0x01, 0x00, 
-    0x66, 0x01, 0x00, 0x64, 0x08, 0x00, 0x84, 0x00, 
-    0x00, 0x83, 0x00, 0x00, 0x59, 0x5A, 0x05, 0x00, 
-    0x64, 0x09, 0x00, 0x65, 0x01, 0x00, 0x66, 0x01, 
-    0x00, 0x64, 0x0A, 0x00, 0x84, 0x00, 0x00, 0x83, 
-    0x00, 0x00, 0x59, 0x5A, 0x06, 0x00, 0x64, 0x0B, 
+    0x05, 0x00, 0x64, 0x09, 0x00, 0x65, 0x01, 0x00, 
+    0x66, 0x01, 0x00, 0x64, 0x0A, 0x00, 0x84, 0x00, 
+    0x00, 0x83, 0x00, 0x00, 0x59, 0x5A, 0x06, 0x00, 
+    0x64, 0x0B, 0x00, 0x65, 0x01, 0x00, 0x66, 0x01, 
+    0x00, 0x64, 0x0C, 0x00, 0x84, 0x00, 0x00, 0x83, 
+    0x00, 0x00, 0x59, 0x5A, 0x07, 0x00, 0x64, 0x0D, 
     0x00, 0x65, 0x01, 0x00, 0x66, 0x01, 0x00, 0x64, 
-    0x0C, 0x00, 0x84, 0x00, 0x00, 0x83, 0x00, 0x00, 
-    0x59, 0x5A, 0x07, 0x00, 0x64, 0x0D, 0x00, 0x65, 
-    0x01, 0x00, 0x66, 0x01, 0x00, 0x64, 0x0E, 0x00, 
+    0x0E, 0x00, 0x84, 0x00, 0x00, 0x83, 0x00, 0x00, 
+    0x59, 0x5A, 0x08, 0x00, 0x64, 0x0F, 0x00, 0x65, 
+    0x01, 0x00, 0x66, 0x01, 0x00, 0x64, 0x10, 0x00, 
     0x84, 0x00, 0x00, 0x83, 0x00, 0x00, 0x59, 0x5A, 
-    0x08, 0x00, 0x64, 0x0F, 0x00, 0x65, 0x01, 0x00, 
-    0x66, 0x01, 0x00, 0x64, 0x10, 0x00, 0x84, 0x00, 
-    0x00, 0x83, 0x00, 0x00, 0x59, 0x5A, 0x09, 0x00, 
-    0x64, 0x11, 0x00, 0x53, 
+    0x09, 0x00, 0x64, 0x11, 0x00, 0x65, 0x01, 0x00, 
+    0x66, 0x01, 0x00, 0x64, 0x12, 0x00, 0x84, 0x00, 
+    0x00, 0x83, 0x00, 0x00, 0x59, 0x5A, 0x0A, 0x00, 
+    0x64, 0x13, 0x00, 0x65, 0x01, 0x00, 0x66, 0x01, 
+    0x00, 0x64, 0x14, 0x00, 0x84, 0x00, 0x00, 0x83, 
+    0x00, 0x00, 0x59, 0x5A, 0x0B, 0x00, 0x64, 0x15, 
+    0x00, 0x53, 
 
 /* img-list-terminator */
     0xFF, 
--- a/platform/mbed/main_nat.cpp	Sun Mar 10 10:13:36 2013 +0000
+++ b/platform/mbed/main_nat.cpp	Tue Mar 12 11:40:41 2013 +0000
@@ -4,7 +4,7 @@
  * PyMite usr native function file
  *
  * automatically created by pmImgCreator.py
- * on Sun Mar 10 18:24:12 2013
+ * on Tue Mar 12 20:23:40 2013
  *
  * DO NOT EDIT THIS FILE.
  * ANY CHANGES WILL BE LOST.
@@ -17,14 +17,7 @@
 
 /* From: mbed.py */
 #include "mbed.h"
-
-/* PinName lookup table.  Converts pin number to PinName. */
-static PinName const pinNumToName[] = {
-    NC, LED1, LED2, LED3, LED4, p5, p6, p7, p8, p9,
-    p10, p11, p12, p13, p14, p15, p16, p17, p18, p19,
-    p20, p21, p22, p23, p24, p25, p26, p27, p28, p29,
-    p30
-};
+#include "NativeClassInterface.h"
 
 PmReturn_t
 nat_placeholder_func(pPmFrame_t *ppframe)
@@ -45,43 +38,8 @@
 nat_01_mbed___init__(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        DigitalOut *dout;
-        uint8_t objid;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Instantiate the C++ object */
-        dout = new DigitalOut(pinNumToName[((pPmInt_t)pn)->val]);
-
-        /* Save the pointer to adc as an inaccessible attribute */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = int_new((uint32_t)dout, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        heap_gcPushTempRoot(pn, &objid);
-        retval = dict_setItem(pattrs, PM_NONE, pn);
-        heap_gcPopTempRoot(objid);
-        PM_RETURN_IF_ERROR(retval);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.init<DigitalOut,PinName>(OBJ_TYPE_INT);
         
 }
 
@@ -89,40 +47,8 @@
 nat_02_mbed_write(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        DigitalOut *dout;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        dout = (DigitalOut *)((pPmInt_t)pn)->val;
-
-        /* Write value to DAC */
-        pn = NATIVE_GET_LOCAL(1);
-        dout->write(((pPmInt_t)pn)->val);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<DigitalOut,int,&DigitalOut::write>(OBJ_TYPE_NON, OBJ_TYPE_INT);
         
 }
 
@@ -130,33 +56,8 @@
 nat_03_mbed_read(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        DigitalOut *dout;
-        int32_t n;
-
-        /* If wrong number of args, throw type exception */
-        if (NATIVE_GET_NUM_ARGS() != 1)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        dout = (DigitalOut *)((pPmInt_t)pn)->val;
-
-        /* Return input value on the stack */
-        n = dout->read();
-        retval = int_new(n, &pn);
-        NATIVE_SET_TOS(pn);
-
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<int,DigitalOut,&DigitalOut::read>(OBJ_TYPE_INT);
         
 }
 
@@ -164,43 +65,8 @@
 nat_04_mbed___init__(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        DigitalIn *din;
-        uint8_t objid;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Instantiate the C++ object */
-        din = new DigitalIn(pinNumToName[((pPmInt_t)pn)->val]);
-
-        /* Save the pointer to adc as an inaccessible attribute */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = int_new((uint32_t)din, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        heap_gcPushTempRoot(pn, &objid);
-        retval = dict_setItem(pattrs, PM_NONE, pn);
-        heap_gcPopTempRoot(objid);
-        PM_RETURN_IF_ERROR(retval);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.init<DigitalIn,PinName>(OBJ_TYPE_INT);
         
 }
 
@@ -208,33 +74,8 @@
 nat_05_mbed_read(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        DigitalIn *din;
-        int32_t n;
-
-        /* If wrong number of args, throw type exception */
-        if (NATIVE_GET_NUM_ARGS() != 1)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        din = (DigitalIn *)((pPmInt_t)pn)->val;
-
-        /* Return input value on the stack */
-        n = din->read();
-        retval = int_new(n, &pn);
-        NATIVE_SET_TOS(pn);
-
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<int,DigitalIn,&DigitalIn::read>(OBJ_TYPE_INT);
         
 }
 
@@ -242,1170 +83,400 @@
 nat_06_mbed___init__(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        AnalogIn *adc;
-        uint8_t objid;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
+        NativeClassInterface nci;
+        return nci.init<DigitalInOut,PinName>(OBJ_TYPE_INT);
+        
+}
 
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Instantiate the C++ object */
-        adc = new AnalogIn(pinNumToName[((pPmInt_t)pn)->val]);
+PmReturn_t
+nat_07_mbed_read(pPmFrame_t *ppframe)
+{
 
-        /* Save the pointer to adc as an inaccessible attribute */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = int_new((uint32_t)adc, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        heap_gcPushTempRoot(pn, &objid);
-        retval = dict_setItem(pattrs, PM_NONE, pn);
-        heap_gcPopTempRoot(objid);
-        PM_RETURN_IF_ERROR(retval);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<int,DigitalInOut,&DigitalInOut::read>(OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_07_mbed_read_u16(pPmFrame_t *ppframe)
+nat_08_mbed_write(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        AnalogIn *adc;
-        int32_t n;
-
-        /* If wrong number of args, throw type exception */
-        if (NATIVE_GET_NUM_ARGS() != 1)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        adc = (AnalogIn *)((pPmInt_t)pn)->val;
-
-        /* Return input value on the stack */
-        n = adc->read_u16();
-        retval = int_new(n, &pn);
-        NATIVE_SET_TOS(pn);
-
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<DigitalInOut,int,&DigitalInOut::write>(OBJ_TYPE_NON, OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_08_mbed_read(pPmFrame_t *ppframe)
+nat_09_mbed_input(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        AnalogIn *adc;
-        float n;
+        NativeClassInterface nci;
+        return nci.method<DigitalInOut,&DigitalInOut::input>(OBJ_TYPE_NON);
+        
+}
 
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 1)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
+PmReturn_t
+nat_10_mbed_output(pPmFrame_t *ppframe)
+{
 
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        adc = (AnalogIn *)((pPmInt_t)pn)->val;
-
-        /* Return input value on the stack */
-        n = adc->read();
-        retval = float_new(n, &pn);
-        NATIVE_SET_TOS(pn);
-
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<DigitalInOut,&DigitalInOut::output>(OBJ_TYPE_NON);
         
 }
 
 PmReturn_t
-nat_09_mbed___init__(pPmFrame_t *ppframe)
+nat_11_mbed___init__(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        AnalogOut *dac;
-        uint8_t objid;
-
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
+        NativeClassInterface nci;
+        return nci.init<AnalogIn,PinName>(OBJ_TYPE_INT);
+        
+}
 
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Instantiate the object */
-        dac = new AnalogOut(pinNumToName[((pPmInt_t)pn)->val]);
+PmReturn_t
+nat_12_mbed_read_u16(pPmFrame_t *ppframe)
+{
 
-        /* Save the pointer to adc as an inaccessible attribute */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = int_new((uint32_t)dac, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        heap_gcPushTempRoot(pn, &objid);
-        retval = dict_setItem(pattrs, PM_NONE, pn);
-        heap_gcPopTempRoot(objid);
-        PM_RETURN_IF_ERROR(retval);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<uint16_t,AnalogIn,&AnalogIn::read_u16>(OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_10_mbed_write_u16(pPmFrame_t *ppframe)
+nat_13_mbed_read(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        AnalogOut *dac;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        dac = (AnalogOut *)((pPmInt_t)pn)->val;
-
-        /* Write value to DAC */
-        pn = NATIVE_GET_LOCAL(1);
-        dac->write_u16(((pPmInt_t)pn)->val);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<float,AnalogIn,&AnalogIn::read>(OBJ_TYPE_FLT);
         
 }
 
 PmReturn_t
-nat_11_mbed_write(pPmFrame_t *ppframe)
+nat_14_mbed___init__(pPmFrame_t *ppframe)
+{
+
+        NativeClassInterface nci;
+        return nci.init<AnalogOut,PinName>(OBJ_TYPE_INT);
+        
+}
+
+PmReturn_t
+nat_15_mbed_write_u16(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        AnalogOut *dac;
-        float n;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
+        NativeClassInterface nci;
+        return nci.method<AnalogOut,uint16_t,&AnalogOut::write_u16>(OBJ_TYPE_NON, OBJ_TYPE_INT);
+        
+}
 
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_FLT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        dac = (AnalogOut *)((pPmInt_t)pn)->val;
+PmReturn_t
+nat_16_mbed_write(pPmFrame_t *ppframe)
+{
 
-        /* Saturate and write value to DAC */
-        pn = NATIVE_GET_LOCAL(1);
-        n = ((pPmFloat_t)pn)->val;
-        if (n < 0.0)
-        {
-            n = 0.0;
-        }
-        else if (n > 1.0)
-        {
-            n = 1.0;
-        }
-        dac->write(n);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<AnalogOut,float,&AnalogOut::write>(OBJ_TYPE_NON, OBJ_TYPE_FLT);
         
 }
 
 PmReturn_t
-nat_12_mbed_read(pPmFrame_t *ppframe)
+nat_17_mbed_read(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        AnalogOut *dac;
-        float n;
+        NativeClassInterface nci;
+        return nci.method<float,AnalogOut,&AnalogOut::read>(OBJ_TYPE_FLT);
+        
+}
 
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 1)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
+PmReturn_t
+nat_18_mbed___init__(pPmFrame_t *ppframe)
+{
 
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        dac = (AnalogOut *)((pPmInt_t)pn)->val;
-
-        /* Return output value on the stack */
-        n = dac->read();
-        retval = float_new(n, &pn);
-        NATIVE_SET_TOS(pn);
-
-        return retval;
+        NativeClassInterface nci;
+        return nci.init<PwmOut,PinName>(OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_13_mbed___init__(pPmFrame_t *ppframe)
+nat_19_mbed_write(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        PwmOut *pwm;
-        uint8_t objid;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Instantiate the C++ object */
-        pwm = new PwmOut(pinNumToName[((pPmInt_t)pn)->val]);
-
-        /* Save the pointer to pwm as an inaccessible attribute */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = int_new((uint32_t)pwm, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        heap_gcPushTempRoot(pn, &objid);
-        retval = dict_setItem(pattrs, PM_NONE, pn);
-        heap_gcPopTempRoot(objid);
-        PM_RETURN_IF_ERROR(retval);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<PwmOut,float,&PwmOut::write>(OBJ_TYPE_NON, OBJ_TYPE_FLT);
         
 }
 
 PmReturn_t
-nat_14_mbed_write(pPmFrame_t *ppframe)
+nat_20_mbed_read(pPmFrame_t *ppframe)
 {
 
-        PmReturn_t retval = PM_RET_OK;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pPmObj_t pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        pPmObj_t pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_FLT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Get the the C++ instance */
-        pPmObj_t pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        PwmOut* pwm = (PwmOut *)((pPmInt_t)pn)->val;
-
-        pn = NATIVE_GET_LOCAL(1);
-        float n = ((pPmFloat_t)pn)->val;
-        pwm->write(n);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<float,PwmOut,&PwmOut::read>(OBJ_TYPE_FLT);
         
 }
 
 PmReturn_t
-nat_15_mbed_read(pPmFrame_t *ppframe)
+nat_21_mbed_period(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        DigitalOut *dout;
-        int32_t n;
-
-        /* If wrong number of args, throw type exception */
-        if (NATIVE_GET_NUM_ARGS() != 1)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        dout = (DigitalOut *)((pPmInt_t)pn)->val;
-
-        /* Return input value on the stack */
-        n = dout->read();
-        retval = int_new(n, &pn);
-        NATIVE_SET_TOS(pn);
-
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<PwmOut,float,&PwmOut::period>(OBJ_TYPE_NON, OBJ_TYPE_FLT);
         
 }
 
 PmReturn_t
-nat_16_mbed_period(pPmFrame_t *ppframe)
+nat_22_mbed_period_ms(pPmFrame_t *ppframe)
 {
 
-        PmReturn_t retval = PM_RET_OK;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pPmObj_t pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        pPmObj_t pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_FLT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Get the the C++ instance */
-        pPmObj_t pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        PwmOut* pwm = (PwmOut *)((pPmInt_t)pn)->val;
-
-        pn = NATIVE_GET_LOCAL(1);
-        pwm->period(((pPmFloat_t)pn)->val);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<PwmOut,int,&PwmOut::period_ms>(OBJ_TYPE_NON, OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_17_mbed_period_ms(pPmFrame_t *ppframe)
+nat_23_mbed_period_us(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        PwmOut *pwm;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        pwm = (PwmOut *)((pPmInt_t)pn)->val;
-
-        pn = NATIVE_GET_LOCAL(1);
-        pwm->period_ms(((pPmInt_t)pn)->val);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<PwmOut,int,&PwmOut::period_us>(OBJ_TYPE_NON, OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_18_mbed_period_us(pPmFrame_t *ppframe)
+nat_24_mbed_pulsewidth(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        PwmOut *pwm;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        pwm = (PwmOut *)((pPmInt_t)pn)->val;
-
-        pn = NATIVE_GET_LOCAL(1);
-        pwm->period_us(((pPmInt_t)pn)->val);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<PwmOut,float,&PwmOut::pulsewidth>(OBJ_TYPE_NON, OBJ_TYPE_FLT);
         
 }
 
 PmReturn_t
-nat_19_mbed_pulsewidth(pPmFrame_t *ppframe)
+nat_25_mbed_pulsewidth_ms(pPmFrame_t *ppframe)
+{
+
+        NativeClassInterface nci;
+        return nci.method<PwmOut,int,&PwmOut::pulsewidth_ms>(OBJ_TYPE_NON, OBJ_TYPE_INT);
+        
+}
+
+PmReturn_t
+nat_26_mbed_pulsewidth_us(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
+        NativeClassInterface nci;
+        return nci.method<PwmOut,int,&PwmOut::pulsewidth_us>(OBJ_TYPE_NON, OBJ_TYPE_INT);
+        
+}
 
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_FLT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
+PmReturn_t
+nat_27_mbed___init__(pPmFrame_t *ppframe)
+{
 
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        PwmOut* pwm = (PwmOut *)((pPmInt_t)pn)->val;
-
-        pn = NATIVE_GET_LOCAL(1);
-        pwm->pulsewidth(((pPmFloat_t)pn)->val);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.init<Serial,PinName,PinName>(OBJ_TYPE_INT, OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_20_mbed_puslewidth_ms(pPmFrame_t *ppframe)
+nat_28_mbed_baud(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        PwmOut *pwm;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
+        NativeClassInterface nci;
+        return nci.method<Serial,int,&Serial::baud>(OBJ_TYPE_NON, OBJ_TYPE_INT);
+        
+}
 
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
+PmReturn_t
+nat_29_mbed_readable(pPmFrame_t *ppframe)
+{
 
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        pwm = (PwmOut *)((pPmInt_t)pn)->val;
-
-        /* Write value to DAC */
-        pn = NATIVE_GET_LOCAL(1);
-        pwm->pulsewidth_ms(((pPmInt_t)pn)->val);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<int,Serial,&Serial::readable>(OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_21_mbed_pulsewidth_us(pPmFrame_t *ppframe)
+nat_30_mbed_writeable(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        PwmOut *pwm;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        pwm = (PwmOut *)((pPmInt_t)pn)->val;
-
-        pn = NATIVE_GET_LOCAL(1);
-        pwm->pulsewidth_us(((pPmInt_t)pn)->val);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<int,Serial,&Serial::writeable>(OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_22_mbed___init__(pPmFrame_t *ppframe)
+nat_31_mbed_putc(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t ptx;
-        pPmObj_t prx;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        Serial *ser;
-        uint8_t objid;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 3)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        ptx = NATIVE_GET_LOCAL(1);
-        prx = NATIVE_GET_LOCAL(2);
-        if ((OBJ_GET_TYPE(ptx) != OBJ_TYPE_INT)
-            || (OBJ_GET_TYPE(prx) != OBJ_TYPE_INT))
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Instantiate the C++ object */
-        ser = new Serial(pinNumToName[((pPmInt_t)ptx)->val],
-                         pinNumToName[((pPmInt_t)prx)->val]);
-
-        /* Save the pointer to ser as an inaccessible attribute */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = int_new((uint32_t)ser, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        heap_gcPushTempRoot(pn, &objid);
-        retval = dict_setItem(pattrs, PM_NONE, pn);
-        heap_gcPopTempRoot(objid);
-        PM_RETURN_IF_ERROR(retval);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        Serial* obj;
+        nci._load_obj<Serial>(&obj);
+        int r = obj->putc(nci.argv<int>(1));
+        return nci.set_return_value<int>(OBJ_TYPE_INT, r);
+        //return nci.method<int,Serial,int,&Serial::putc>(OBJ_TYPE_INT, OBJ_TYPE_STR);
         
 }
 
 PmReturn_t
-nat_23_mbed_putc(pPmFrame_t *ppframe)
+nat_32_mbed_puts(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        Serial *ser;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_STR)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        ser = (Serial *)((pPmInt_t)pn)->val;
-
-        /* Write value to DAC */
-        pn = NATIVE_GET_LOCAL(1);
-        ser->putc(((pPmString_t)pn)->val[0]);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
-        
-}
-
-PmReturn_t
-nat_24_mbed_puts(pPmFrame_t *ppframe)
-{
-
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        Serial *ser;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        pn = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pn) != OBJ_TYPE_STR)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        ser = (Serial *)((pPmInt_t)pn)->val;
-
-        /* Write value to DAC */
-        pn = NATIVE_GET_LOCAL(1);
-        ser->puts((const char *)((pPmString_t)pn)->val);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        Serial* obj;
+        nci._load_obj<Serial>(&obj);
+        int r = obj->puts(nci.argv<const char*>(1));
+        return nci.set_return_value<int>(OBJ_TYPE_INT, r);
+        //return nci.method<int,Serial,char*,&Serial::puts>(OBJ_TYPE_INT, OBJ_TYPE_STR);
         
 }
 
 PmReturn_t
-nat_25_mbed_getc(pPmFrame_t *ppframe)
+nat_33_mbed_getc(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        Serial *ser;
-        int32_t n;
-
-        /* If wrong number of args, throw type exception */
-        if (NATIVE_GET_NUM_ARGS() != 1)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        ser = (Serial *)((pPmInt_t)pn)->val;
-
-        /* Return char (as string) on the stack */
-        n = ser->getc();
-        retval = string_newFromChar((uint8_t)n, &pn);
-        NATIVE_SET_TOS(pn);
-
-        return retval;
+        NativeClassInterface nci;
+        Serial* obj;
+        nci._load_obj<Serial>(&obj);
+        int r = obj->getc();
+        return nci.set_return_value<int>(OBJ_TYPE_STR, r);
+        //return nci.method<int,Serial,&Serial::getc>(OBJ_TYPE_STR);
         
 }
 
 PmReturn_t
-nat_26_mbed___init__(pPmFrame_t *ppframe)
+nat_34_mbed___init__(pPmFrame_t *ppframe)
+{
+
+        NativeClassInterface nci;
+        return nci.init<SPI,PinName,PinName,PinName>(OBJ_TYPE_INT, OBJ_TYPE_INT, OBJ_TYPE_INT);
+        
+}
+
+PmReturn_t
+nat_35_mbed_format(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pmosi;
-        pPmObj_t pmiso;
-        pPmObj_t psclk;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        SPI *spi;
-        uint8_t objid;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 4)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
+        NativeClassInterface nci;
+        return nci.method<SPI,int,int,&SPI::format>(OBJ_TYPE_NON, OBJ_TYPE_INT, OBJ_TYPE_INT);
+        
+}
 
-        /* Raise TypeError if arg is not the right type */
-        pmosi = NATIVE_GET_LOCAL(1);
-        pmiso = NATIVE_GET_LOCAL(2);
-        psclk = NATIVE_GET_LOCAL(3);
-        if ((OBJ_GET_TYPE(pmosi) != OBJ_TYPE_INT)
-            || (OBJ_GET_TYPE(pmiso) != OBJ_TYPE_INT)
-            || (OBJ_GET_TYPE(psclk) != OBJ_TYPE_INT))
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
+PmReturn_t
+nat_36_mbed_frequency(pPmFrame_t *ppframe)
+{
 
-        /* Instantiate the C++ object */
-        spi = new SPI(pinNumToName[((pPmInt_t)pmosi)->val],
-                      pinNumToName[((pPmInt_t)pmiso)->val],
-                      pinNumToName[((pPmInt_t)psclk)->val]);
-
-        /* Save the pointer to ser as an inaccessible attribute */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = int_new((uint32_t)spi, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        heap_gcPushTempRoot(pn, &objid);
-        retval = dict_setItem(pattrs, PM_NONE, pn);
-        heap_gcPopTempRoot(objid);
-        PM_RETURN_IF_ERROR(retval);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<SPI,int,&SPI::frequency>(OBJ_TYPE_NON, OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_27_mbed_format(pPmFrame_t *ppframe)
+nat_37_mbed_write(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pbits;
-        pPmObj_t pmode;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        SPI *spi;
-
-        /* Raise TypeError if wrong number of args */
-        if ((NATIVE_GET_NUM_ARGS() < 2) || (NATIVE_GET_NUM_ARGS() > 3))
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
+        NativeClassInterface nci;
+        return nci.method<int,SPI,int,&SPI::write>(OBJ_TYPE_INT, OBJ_TYPE_INT);
+        
+}
 
-        /* Raise TypeError if arg is not the right type */
-        pbits = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pbits) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
+PmReturn_t
+nat_38_mbed___init__(pPmFrame_t *ppframe)
+{
 
-        /* Get the mode arg if it exists */
-        pmode = PM_ZERO;
-        if (NATIVE_GET_NUM_ARGS() == 3)
-        {
-            pmode = NATIVE_GET_LOCAL(3);
-        }
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        spi = (SPI *)((pPmInt_t)pn)->val;
-
-        /* Set format args */
-        spi->format(((pPmInt_t)pbits)->val, ((pPmInt_t)pmode)->val);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.init<I2C,PinName,PinName>(OBJ_TYPE_INT, OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_28_mbed_frequency(pPmFrame_t *ppframe)
+nat_39_mbed_frequency(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t phz;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        SPI *spi;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        phz = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(phz) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        spi = (SPI *)((pPmInt_t)pn)->val;
-
-        /* Set frequency */
-        spi->frequency(((pPmInt_t)phz)->val);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<I2C,int,&I2C::frequency>(OBJ_TYPE_NON, OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_29_mbed_write(pPmFrame_t *ppframe)
+nat_40_mbed_read(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t pv;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        SPI *spi;
-        int32_t r;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
+        NativeClassInterface nci;
+        return nci.method<int,I2C,int,char*,int,bool,&I2C::read>(OBJ_TYPE_INT, 
+        OBJ_TYPE_INT, OBJ_TYPE_STR, OBJ_TYPE_INT, OBJ_TYPE_INT);
+        
+}
 
-        /* Raise TypeError if arg is not the right type */
-        pv = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(pv) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
+PmReturn_t
+nat_41_mbed_write(pPmFrame_t *ppframe)
+{
 
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        spi = (SPI *)((pPmInt_t)pn)->val;
-
-        /* Write the value and return the response */
-        r = spi->write(((pPmInt_t)pv)->val);
-        retval = int_new(r, &pn);
-        NATIVE_SET_TOS(pn);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<int,I2C,int,const char*,int,bool,&I2C::write>(OBJ_TYPE_INT, 
+        OBJ_TYPE_INT, OBJ_TYPE_STR, OBJ_TYPE_INT, OBJ_TYPE_INT);
         
 }
 
 PmReturn_t
-nat_30_mbed___init__(pPmFrame_t *ppframe)
+nat_42_mbed___init__(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t psda;
-        pPmObj_t pscl;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        I2C *i2c;
-        uint8_t objid;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 3)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        psda = NATIVE_GET_LOCAL(1);
-        pscl = NATIVE_GET_LOCAL(2);
-        if ((OBJ_GET_TYPE(psda) != OBJ_TYPE_INT)
-            || (OBJ_GET_TYPE(pscl) != OBJ_TYPE_INT))
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Instantiate the C++ object */
-        i2c = new I2C(pinNumToName[((pPmInt_t)psda)->val],
-                      pinNumToName[((pPmInt_t)pscl)->val]);
-
-        /* Save the pointer to ser as an inaccessible attribute */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = int_new((uint32_t)i2c, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        heap_gcPushTempRoot(pn, &objid);
-        retval = dict_setItem(pattrs, PM_NONE, pn);
-        heap_gcPopTempRoot(objid);
-        PM_RETURN_IF_ERROR(retval);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.init<Timer>();
         
 }
 
 PmReturn_t
-nat_31_mbed_frequency(pPmFrame_t *ppframe)
+nat_43_mbed_start(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t phz;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        I2C *i2c;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 2)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
+        NativeClassInterface nci;
+        return nci.method<Timer,&Timer::start>(OBJ_TYPE_NON);
+        
+}
 
-        /* Raise TypeError if arg is not the right type */
-        phz = NATIVE_GET_LOCAL(1);
-        if (OBJ_GET_TYPE(phz) != OBJ_TYPE_INT)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
+PmReturn_t
+nat_44_mbed_stop(pPmFrame_t *ppframe)
+{
 
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        i2c = (I2C *)((pPmInt_t)pn)->val;
-
-        /* Set frequency */
-        i2c->frequency(((pPmInt_t)phz)->val);
-
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<Timer,&Timer::stop>(OBJ_TYPE_NON);
         
 }
 
 PmReturn_t
-nat_32_mbed_read(pPmFrame_t *ppframe)
+nat_45_mbed_reset(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t paddr;
-        pPmObj_t pdata;
-        pPmObj_t plen;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        I2C *i2c;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 4)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
-
-        /* Raise TypeError if arg is not the right type */
-        paddr = NATIVE_GET_LOCAL(1);
-        pdata = NATIVE_GET_LOCAL(2);
-        plen = NATIVE_GET_LOCAL(3);
-        if ((OBJ_GET_TYPE(paddr) != OBJ_TYPE_INT)
-            || (OBJ_GET_TYPE(pdata) != OBJ_TYPE_STR)
-            || (OBJ_GET_TYPE(plen) != OBJ_TYPE_INT))
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        i2c = (I2C *)((pPmInt_t)pn)->val;
-
-        /* Read the bytes into the string */
-        /* WARNING: Changing the bytes of a string object is BAD. */
-        i2c->read(((pPmInt_t)paddr)->val,
-                  (char *)((pPmString_t)pdata)->val,
-                  ((pPmInt_t)plen)->val);
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<Timer,&Timer::reset>(OBJ_TYPE_NON);
         
 }
 
 PmReturn_t
-nat_33_mbed_write(pPmFrame_t *ppframe)
+nat_46_mbed_read(pPmFrame_t *ppframe)
+{
+
+        NativeClassInterface nci;
+        return nci.method<float,Timer,&Timer::read>(OBJ_TYPE_FLT);
+        
+}
+
+PmReturn_t
+nat_47_mbed_read_ms(pPmFrame_t *ppframe)
 {
 
-        pPmObj_t pself;
-        pPmObj_t pn;
-        pPmObj_t paddr;
-        pPmObj_t pdata;
-        pPmObj_t plen;
-        pPmObj_t pattrs;
-        PmReturn_t retval = PM_RET_OK;
-        I2C *i2c;
-
-        /* Raise TypeError if wrong number of args */
-        if (NATIVE_GET_NUM_ARGS() != 4)
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
-        pself = NATIVE_GET_LOCAL(0);
+        NativeClassInterface nci;
+        return nci.method<int,Timer,&Timer::read_ms>(OBJ_TYPE_INT);
+        
+}
 
-        /* Raise TypeError if arg is not the right type */
-        paddr = NATIVE_GET_LOCAL(1);
-        pdata = NATIVE_GET_LOCAL(2);
-        plen = NATIVE_GET_LOCAL(3);
-        if ((OBJ_GET_TYPE(paddr) != OBJ_TYPE_INT)
-            || (OBJ_GET_TYPE(pdata) != OBJ_TYPE_STR)
-            || (OBJ_GET_TYPE(plen) != OBJ_TYPE_INT))
-        {
-            PM_RAISE(retval, PM_RET_EX_TYPE);
-            return retval;
-        }
+PmReturn_t
+nat_48_mbed_read_us(pPmFrame_t *ppframe)
+{
 
-        /* Get the the C++ instance */
-        pattrs = (pPmObj_t)((pPmInstance_t)pself)->cli_attrs;
-        retval = dict_getItem(pattrs, PM_NONE, &pn);
-        PM_RETURN_IF_ERROR(retval);
-        i2c = (I2C *)((pPmInt_t)pn)->val;
-
-        /* Write the value and return the response */
-        i2c->write(((pPmInt_t)paddr)->val,
-                   (char *)((pPmString_t)pdata)->val,
-                   ((pPmInt_t)plen)->val);
-        NATIVE_SET_TOS(PM_NONE);
-        return retval;
+        NativeClassInterface nci;
+        return nci.method<int,Timer,&Timer::read_us>(OBJ_TYPE_INT);
         
 }
 
@@ -1419,31 +490,46 @@
     nat_04_mbed___init__,
     nat_05_mbed_read,
     nat_06_mbed___init__,
-    nat_07_mbed_read_u16,
-    nat_08_mbed_read,
-    nat_09_mbed___init__,
-    nat_10_mbed_write_u16,
-    nat_11_mbed_write,
-    nat_12_mbed_read,
-    nat_13_mbed___init__,
-    nat_14_mbed_write,
-    nat_15_mbed_read,
-    nat_16_mbed_period,
-    nat_17_mbed_period_ms,
-    nat_18_mbed_period_us,
-    nat_19_mbed_pulsewidth,
-    nat_20_mbed_puslewidth_ms,
-    nat_21_mbed_pulsewidth_us,
-    nat_22_mbed___init__,
-    nat_23_mbed_putc,
-    nat_24_mbed_puts,
-    nat_25_mbed_getc,
-    nat_26_mbed___init__,
-    nat_27_mbed_format,
-    nat_28_mbed_frequency,
-    nat_29_mbed_write,
-    nat_30_mbed___init__,
-    nat_31_mbed_frequency,
-    nat_32_mbed_read,
-    nat_33_mbed_write,
+    nat_07_mbed_read,
+    nat_08_mbed_write,
+    nat_09_mbed_input,
+    nat_10_mbed_output,
+    nat_11_mbed___init__,
+    nat_12_mbed_read_u16,
+    nat_13_mbed_read,
+    nat_14_mbed___init__,
+    nat_15_mbed_write_u16,
+    nat_16_mbed_write,
+    nat_17_mbed_read,
+    nat_18_mbed___init__,
+    nat_19_mbed_write,
+    nat_20_mbed_read,
+    nat_21_mbed_period,
+    nat_22_mbed_period_ms,
+    nat_23_mbed_period_us,
+    nat_24_mbed_pulsewidth,
+    nat_25_mbed_pulsewidth_ms,
+    nat_26_mbed_pulsewidth_us,
+    nat_27_mbed___init__,
+    nat_28_mbed_baud,
+    nat_29_mbed_readable,
+    nat_30_mbed_writeable,
+    nat_31_mbed_putc,
+    nat_32_mbed_puts,
+    nat_33_mbed_getc,
+    nat_34_mbed___init__,
+    nat_35_mbed_format,
+    nat_36_mbed_frequency,
+    nat_37_mbed_write,
+    nat_38_mbed___init__,
+    nat_39_mbed_frequency,
+    nat_40_mbed_read,
+    nat_41_mbed_write,
+    nat_42_mbed___init__,
+    nat_43_mbed_start,
+    nat_44_mbed_stop,
+    nat_45_mbed_reset,
+    nat_46_mbed_read,
+    nat_47_mbed_read_ms,
+    nat_48_mbed_read_us,
 };