# Return new object instance from Uno

**URL:** <https://forums.fusetools.com/t/return-new-object-instance-from-uno/4415>\
**Category:** Feature Suggestions\
**Created:** [November 13, 2015, 8:10pm UTC](https://forums.fusetools.com/t/return-new-object-instance-from-uno/4415 "2015-11-13T20:10:36Z")\
**Posts on this page:** 7\
**Page:** 1

<div class="post-metadata">

**Author:** ![Bjorn-Olav\_Strand](https://yyz1.discourse-cdn.com/flex035/user_avatar/forums.fusetools.com/bjorn-olav_strand/32/583_2.png) [@Bjorn-Olav\_Strand](https://forums.fusetools.com/u/Bjorn-Olav_Strand)\
**Post date:** [November 13, 2015, 8:10pm UTC](https://forums.fusetools.com/t/return-new-object-instance-from-uno/4415/1 "2015-11-13T20:10:36Z")

</div>

I’m trying to return a NativeModule to JS like this:

```auto
public NativeModule NewLogger (Context c, object[] args) {
  return new NativeModule(
    new NativeFunction("log", (NativeCallback)Log),
  );
}

```

But there seems to be no support for this. Is this planned?

---

<div class="post-metadata">

**Author:** ![Anders\_Lassen](https://yyz1.discourse-cdn.com/flex035/user_avatar/forums.fusetools.com/anders_lassen/32/522_2.png) [@Anders\_Lassen](https://forums.fusetools.com/u/Anders_Lassen)\
**Post date:** [November 16, 2015, 10:45pm UTC](https://forums.fusetools.com/t/return-new-object-instance-from-uno/4415/2 "2015-11-16T22:45:01Z")

</div>

Not planned, but it is a good idea. Filed a ticket.

---

<div class="post-metadata">

**Author:** ![Anders\_Lassen](https://yyz1.discourse-cdn.com/flex035/user_avatar/forums.fusetools.com/anders_lassen/32/522_2.png) [@Anders\_Lassen](https://forums.fusetools.com/u/Anders_Lassen)\
**Post date:** [November 18, 2015, 2:24pm UTC](https://forums.fusetools.com/t/return-new-object-instance-from-uno/4415/3 "2015-11-18T14:24:01Z")

</div>

Upon further investigation, this is how you do it:

```auto
var module = new NativeModule(new NativeFunction("log", (NativeCallback)Log));
return module.Evaluate("Logger", c);

```

---

<div class="post-metadata">

**Author:** ![Bjorn-Olav\_Strand](https://yyz1.discourse-cdn.com/flex035/user_avatar/forums.fusetools.com/bjorn-olav_strand/32/583_2.png) [@Bjorn-Olav\_Strand](https://forums.fusetools.com/u/Bjorn-Olav_Strand)\
**Post date:** [November 18, 2015, 2:42pm UTC](https://forums.fusetools.com/t/return-new-object-instance-from-uno/4415/4 "2015-11-18T14:42:55Z")

</div>

It works!

---

<div class="post-metadata">

**Author:** ![Bjorn-Olav\_Strand](https://yyz1.discourse-cdn.com/flex035/user_avatar/forums.fusetools.com/bjorn-olav_strand/32/583_2.png) [@Bjorn-Olav\_Strand](https://forums.fusetools.com/u/Bjorn-Olav_Strand)\
**Post date:** [March 4, 2016, 5:24pm UTC](https://forums.fusetools.com/t/return-new-object-instance-from-uno/4415/5 "2016-03-04T17:24:31Z")

</div>

This functionality is now removed. How can one do it now?

---

<div class="post-metadata">

**Author:** ![Bjorn-Olav\_Strand](https://yyz1.discourse-cdn.com/flex035/user_avatar/forums.fusetools.com/bjorn-olav_strand/32/583_2.png) [@Bjorn-Olav\_Strand](https://forums.fusetools.com/u/Bjorn-Olav_Strand)\
**Post date:** [March 5, 2016, 11:17am UTC](https://forums.fusetools.com/t/return-new-object-instance-from-uno/4415/6 "2016-03-05T11:17:26Z")

</div>

This is the old Evaluate:

```auto
public object Evaluate(string id, Context c)
{
    var obj = (Scripting.Object)c.Evaluate(id, "new Object()");

    foreach (var m in _members)
        m.Create(obj, c);

    _isEvaluated = true;

    var handler = _evaluated;
    if (handler!=null)
    {
        handler(null, EventArgs.Empty);
        _evaluated = null;
    }

    return obj;
}

```

This is the new one:

```auto
public void Evaluate(Context c, Scripting.Object module)
{
    var obj = module["exports"] as Scripting.Object;

    foreach (var m in _members)
        m.Create(obj, c);

    _isEvaluated = true;

    var handler = _evaluated;
    if (handler != null)
    {
        handler(null, EventArgs.Empty);
        _evaluated = null;
    }
}

```

I tried to use the new one:

```auto
Fuse.Scripting.Object obj = c.NewObject();
module.Evaluate(c, obj);
return obj;

```

```auto
Preview detected an unhandled exception: System.AggregateException: One or more errors occurred. ---> Fuse.Scripting.ScriptException: Name: System.NullReferenceException: Object reference not set to an instance of an object
  at Fuse.Scripting.NativeMember.Create (Fuse.Scripting.Object obj, Fuse.Scripting.Context context) [0x00000] in <filename unknown>:0
  at Fuse.Scripting.NativeModule.Evaluate (Fuse.Scripting.Context c, Fuse.Scripting.Object module) [0x00000] in <filename unknown>:0
  at JSFactory.NewLogger (Fuse.Scripting.Context c, System.Object[] args) [0x00000] in <filename unknown>:0
  at Fuse.Scripting.NativeFunction+NativeFunctionClosure.Callback (System.Object[] args) [0x00000] in <filename unknown>:0
  at Fuse.Scripting.V8.Marshaller+CallbackWrapper.Call (Fuse.Scripting.V8.Simple.UniqueValueVector args) [0x00000] in <filename unknown>:0
Error message: Uncaught System.NullReferenceException: Object reference not set to an instance of an object
  at Fuse.Scripting.NativeMember.Create (Fuse.Scripting.Object obj, Fuse.Scripting.Context context) [0x00000] in <filename unknown>:0
  at Fuse.Scripting.NativeModule.Evaluate (Fuse.Scripting.Context c, Fuse.Scripting.Object module) [0x00000] in <filename unknown>:0
  at JSFactory.NewLogger (Fuse.Scripting.Context c, System.Object[] args) [0x00000] in <filename unknown>:0
  at Fuse.Scripting.NativeFunction+NativeFunctionClosure.Callback (System.Object[] args) [0x00000] in <filename unknown>:0
  at Fuse.Scripting.V8.Marshaller+CallbackWrapper.Call (Fuse.Scripting.V8.Simple.UniqueValueVector args) [0x00000] in <filename unknown>:0
File name: MainView.ux
Line number: 5
Source line: var log1 = Factory.newLogger("Hello 1");

```

I tried to copy the old Evaluate:

```auto
Logger.uno(23.21): E4040: 'Fuse.Scripting.NativeModule._members' is not accessible from 'Logger.Evaluate(string,Fuse.Scripting.Context)'
Logger.uno(24.4): E4040: 'Fuse.Scripting.NativeMember.Create(Fuse.Scripting.Object,Fuse.Scripting.Context)' is not accessible from 'Logger.Evaluate(string,Fuse.Scripting.Context)'
Logger.uno(26.3): E4040: 'Fuse.Scripting.NativeModule._isEvaluated' is not accessible from 'Logger.Evaluate(string,Fuse.Scripting.Context)'
Logger.uno(28.17): E4040: 'Fuse.Scripting.NativeModule._evaluated' is not accessible from 'Logger.Evaluate(string,Fuse.Scripting.Context)'
Logger.uno(32.4): E4040: 'Fuse.Scripting.NativeModule._evaluated' is not accessible from 'Logger.Evaluate(string,Fuse.Scripting.Context)'

```

I tried to convert it to an IModule:

```auto
Logger.uno(24.4): E4040: 'Fuse.Scripting.NativeMember.Create(Fuse.Scripting.Object,Fuse.Scripting.Context)' is not accessible from 'Logger.Evaluate(string,Fuse.Scripting.Context)'
Logger.uno(43.4): E4040: 'Fuse.Scripting.NativeMember.Create(Fuse.Scripting.Object,Fuse.Scripting.Context)' is not accessible from 'Logger.Evaluate(Fuse.Scripting.Context,Fuse.Scripting.Object)'

```

But such attempts are as usual thwarted by the strict permissions of the internal fuse library.

---

<div class="post-metadata">

**Author:** ![Bjorn-Olav\_Strand](https://yyz1.discourse-cdn.com/flex035/user_avatar/forums.fusetools.com/bjorn-olav_strand/32/583_2.png) [@Bjorn-Olav\_Strand](https://forums.fusetools.com/u/Bjorn-Olav_Strand)\
**Post date:** [March 5, 2016, 12:16pm UTC](https://forums.fusetools.com/t/return-new-object-instance-from-uno/4415/7 "2016-03-05T12:16:27Z")

</div>

This works!

```auto
var module = c.NewObject();
module["id"] = "Logger";
module["exports"] = c.NewObject();

var log = new Logger(s);
log.Evaluate(c, module);
return module["exports"];

```
