
/*
 * weinre is available under *either* the terms of the modified BSD license *or* the
 * MIT License (2008). See http://opensource.org/licenses/alphabetical for full text.
 * 
 * Copyright (c) 2011 IBM Corporation
 */

requireClass ../common/Ex
requireClass ../common/Binding
requireClass ../common/Weinre

//-----------------------------------------------------------------------------
class ExtensionRegistryImpl

//-----------------------------------------------------------------------------
init
    var extensions = []

//-----------------------------------------------------------------------------
method getExtensionsAsync
    if (extensions.length) return
    
    Weinre.WeinreClientCommands.getExtensions(Binding(this, this._cb_getExtensions))
        
//-----------------------------------------------------------------------------
method _cb_getExtensions(extensionsResult)
    extensions = extensionsResult
    this._installExtensions()
    
//-----------------------------------------------------------------------------
method _installExtensions    
    WebInspector.addExtensions(extensions)
    
    