JSValue *RuntimeMethod::callAsFunction(ExecState *exec, JSObject *thisObj, const List &args)
{
    if (_methodList->isEmpty())
        return jsUndefined();
    
    RuntimeObjectImp *imp = 0;

    if (thisObj->classInfo() == &KJS::RuntimeObjectImp::info) {
        imp = static_cast<RuntimeObjectImp*>(thisObj);
    } else {
        // If thisObj is the DOM object for a plugin, get the corresponding
        // runtime object from the DOM object.
        JSValue* value = thisObj->get(exec, "__apple_runtime_object");
        if (value->isObject(&KJS::RuntimeObjectImp::info))    
            imp = static_cast<RuntimeObjectImp*>(value);
    }

    if (!imp)
        return throwError(exec, TypeError);

    Instance *instance = imp->getInternalInstance();
    if (!instance) 
        return RuntimeObjectImp::throwInvalidAccessError(exec);
        
    instance->begin();
    JSValue *aValue = instance->invokeMethod(exec, *_methodList, args);
    instance->end();
    return aValue;
}
static JSValue JSC_HOST_CALL callPlugin(ExecState* exec, JSObject* function, JSValue, const ArgList& args)
{
    Instance* instance = pluginInstance(static_cast<JSHTMLElement*>(function)->impl());
    instance->begin();
    JSValue result = instance->invokeDefaultMethod(exec, args);
    instance->end();
    return result;
}
void WebMediaPlayerProxy::invokeMethod(const String& methodName)
{
    Frame* frame = element()->document()->frame();
    RootObject *root = frame->script()->bindingRootObject();
    if (!root)
        return;
    ExecState *exec = root->globalObject()->globalExec();
    Instance* instance = pluginInstance().get();
    if (!instance)
        return;

    instance->begin();
    Class *aClass = instance->getClass();
    Identifier iden(exec, methodName);
    MethodList methodList = aClass->methodsNamed(iden, instance);
    ArgList args;
    instance->invokeMethod(exec, methodList , args);
    instance->end();
}