Index: /trunk/FACT++/src/InterpreterV8.cc
===================================================================
--- /trunk/FACT++/src/InterpreterV8.cc	(revision 14654)
+++ /trunk/FACT++/src/InterpreterV8.cc	(revision 14655)
@@ -1146,9 +1146,12 @@
 Handle<Value> InterpreterV8::FuncSubscription(const Arguments &args)
 {
-    if (args.Length()!=1)
-        return ThrowException(String::New("Number of arguments must be exactly 1."));
+    if (args.Length()!=1 && args.Length()!=2)
+        return ThrowException(String::New("Number of arguments must be one or two."));
 
     if (!args[0]->IsString())
         return ThrowException(String::New("Argument 1 must be a string."));
+
+    if (args.Length()==2 && !args[1]->IsFunction())
+        return ThrowException(String::New("Argument 2 must be a function."));
 
     const String::AsciiValue str(args[0]);
@@ -1163,9 +1166,5 @@
     }
 
-    void *ptr = JsSubscribe(*str);
-    if (ptr==0)
-        return ThrowException(String::New(("Subscription to '"+string(*str)+"' already exists.").c_str()));
-
-    HandleScope handle_scope;
+    const HandleScope handle_scope;
 
     Handle<Object> This = args.This();
@@ -1174,7 +1173,15 @@
     This->Set(String::New("name"),   String::New(*str), ReadOnly);
     This->Set(String::New("isOpen"), Boolean::New(true));
+
+    if (args.Length()==2)
+        This->Set(String::New("onchange"), args[1]);
+
+    fReverseMap[*str] = Persistent<Object>::New(This);
+
+    void *ptr = JsSubscribe(*str);
+    if (ptr==0)
+        return ThrowException(String::New(("Subscription to '"+string(*str)+"' already exists.").c_str()));
+
     This->SetInternalField(0, External::New(ptr));
-
-    fReverseMap[*str] = Persistent<Object>::New(This);
 
     return Undefined();
@@ -1621,4 +1628,26 @@
 //                                  CORE
 // ==========================================================================
+
+InterpreterV8::InterpreterV8() : fThreadId(-1)
+{
+    const string ver(V8::GetVersion());
+
+    typedef boost::char_separator<char> separator;
+    const boost::tokenizer<separator> tokenizer(ver, separator("."));
+
+    const vector<string> tok(tokenizer.begin(), tokenizer.end());
+
+    const int major = tok.size()>0 ? stol(tok[0]) : -1;
+    const int minor = tok.size()>1 ? stol(tok[1]) : -1;
+    const int build = tok.size()>2 ? stol(tok[2]) : -1;
+
+    if (major>3 || (major==3 && minor>9) || (major==3 && minor==9 && build>10))
+    {
+        const string argv = "--use_strict";
+        V8::SetFlagsFromString(argv.c_str(), argv.size());
+    }
+
+    This = this;
+}
 
 Handle<Value> InterpreterV8::Constructor(/*Handle<FunctionTemplate> T,*/ const Arguments &args)
@@ -1697,7 +1726,4 @@
 bool InterpreterV8::JsRun(const string &filename, const map<string, string> &map)
 {
-    //const string argv = "--prof";
-    //V8::SetFlagsFromString(argv.c_str(), argv.size());
-
     const Locker locker;
     fThreadId = V8::GetCurrentThreadId();
