/* This Source Code Form is subject to the terms of the Mozilla Public
 * License, v. 2.0. If a copy of the MPL was not distributed with this
 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
'use strict';

module.metadata = {
  'stability': 'unstable'
};

const privateNS = require('../../core/namespace').ns();

function getOwnerWindow(thing) {
  try {
    // check for and return associated window
    let fn = (privateNS(thing.prototype) || privateNS(thing) || {}).getOwnerWindow;

    if (fn)
      return fn.apply(fn, [thing].concat(arguments));
  }
  // stuff like numbers and strings throw errors with namespaces
  catch(e) {}
  // default
  return undefined;
}
getOwnerWindow.define = function(Type, fn) {
  privateNS(Type.prototype).getOwnerWindow = fn;
}

getOwnerWindow.implement = function(instance, fn) {
  privateNS(instance).getOwnerWindow = fn;
}

exports.getOwnerWindow = getOwnerWindow;