Moving this to nodejs, nodejs-dev is for core node development.

On Tue, Jul 10, 2012 at 3:52 PM, aludin <anwar.lu...@gmail.com> wrote:
> Hi,
>
> I am trying to return "wrapped objects" from a single object playing the
> role an object factory. I ve tried something like this but it does nt seem
> to work:
>
> // the ObjectWrap factory which also inherits from ObjectWrap.
>
>
> class NoomraEngine: public node::ObjectWrap {
>
>
> public:
>
> static Persistent<FunctionTemplate> s_ct;
>
> static void Initialize(Handle<Object> target);
>
> static Handle<Value> New(const Arguments& args);
>
>         static Handle<Value> CreateInstrument(const Arguments& args); //
> factory method for returning wrapped objects.
>
>
>
> NoomraEngine();
>
> virtual ~NoomraEngine();
>
> };
>
>
>
>
> Handle<Value> NoomraEngine::CreateInstrument(const Arguments& args) {
>
>     HandleScope scope;
>
>     // determine which object to create according to args.
>
>     // so for example if it's a VanillaEquityOptionWrapper:
>
>     return scope.Close(VanillaEquityOptionWrapper::New(args));
>
> }
>
>
> For example VanillaEquityOptionWrapper is declared as follows and should one
> of the possible wrapped objects returned by NoomraEngine:
>
> class VanillaEquityOptionWrapper : public node::ObjectWrap {
>
> private:
>
> //VanillaEquityOption* equityOption;
>
> public:
>
> static Persistent<FunctionTemplate> create;
>
> static void Initialize(Handle<Object> target);
>
> static Handle<Value> New(const Arguments& args);
>
> static Handle<Value> Price(const Arguments& args);   // mapped to
> priceEquity for node.
>
>
>
> VanillaEquityOptionWrapper();
>
> virtual ~VanillaEquityOptionWrapper();
>
> };
>
>
> } /* namespace noomra */
>
> #endif /* VANILLAEQUITYOPTIONWRAPPER_H_ */
>
>
> Here's the node output:
>
>> var addon = require('noomra');
> undefined
>> var engine = new addon.NoomraEngine();
> undefined
>> var equity = engine.createInstrument();
> undefined
>> equity.priceEquity();
> TypeError: Object #<NoomraEngine> has no method 'priceEquity'
>     at repl:1:8
>     at REPLServer.self.eval (repl.js:111:21)
>     at rli.on.e (repl.js:260:20)
>     at REPLServer.self.eval (repl.js:118:5)
>     at Interface.<anonymous> (repl.js:250:12)
>     at Interface.EventEmitter.emit (events.js:88:17)
>     at Interface._onLine (readline.js:183:10)
>     at Interface._line (readline.js:502:8)
>     at Interface._ttyWrite (readline.js:720:14)
>     at ReadStream.<anonymous> (readline.js:105:12)

The problem - if I read your code right - is that
VanillaEquityOptionWrapper::New(args) is not a constructor call. You
should probably call create->GetFunction()->NewInstance(argc, argv)
instead but note that NewInstance() takes a Handle<Value> array, not
an Arguments object.

I don't know what problem you're trying to solve but consider moving
more of your app logic from C++ to JS. You can set up constructors,
factories, inheritance chains and what have you from C++ bindings but
it's a) more work and b) tricky to get right. Doing it from inside a
JS shim will make your life infinitely more pleasant.

-- 
Job Board: http://jobs.nodejs.org/
Posting guidelines: 
https://github.com/joyent/node/wiki/Mailing-List-Posting-Guidelines
You received this message because you are subscribed to the Google
Groups "nodejs" group.
To post to this group, send email to nodejs@googlegroups.com
To unsubscribe from this group, send email to
nodejs+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/nodejs?hl=en?hl=en

Reply via email to