index.js 636 B

123456789101112131415161718192021222324252627282930313233343536
  1. 'use strict';
  2. module.exports = function (fn) {
  3. return function (id) {
  4. var mod;
  5. return function () {
  6. if (!arguments.length) {
  7. mod = lazy(mod, fn, id);
  8. return mod;
  9. }
  10. var ret = {};
  11. [].forEach.call(arguments, function (prop) {
  12. Object.defineProperty(ret, prop, {
  13. get: function () {
  14. mod = lazy(mod, fn, id);
  15. if (typeof mod[prop] === 'function') {
  16. return function () {
  17. return mod[prop].apply(mod, arguments);
  18. };
  19. }
  20. return mod[prop];
  21. }
  22. });
  23. });
  24. return ret;
  25. };
  26. };
  27. function lazy(mod, fn, id) {
  28. return mod !== undefined ? mod : fn(id);
  29. }
  30. };