Advertisement
Guest User

Untitled

a guest
Aug 29th, 2016
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.13 KB | None | 0 0
  1. "use strict"
  2.  
  3. const {symbols} = require("./recommended")
  4.  
  5. class Interface {
  6. constructor() {
  7. // Somewhere to keep the errors.
  8. const errors = new Set()
  9.  
  10. // Get the symbolised field with our
  11. // interface requirements in it.
  12. const required = this[symbols.INTERFACE]
  13.  
  14. // Get an object that represents our class.
  15. const class_funcs = Object.getOwnPropertyNames(Object.getPrototypeOf(this))
  16. const class_as_object = {}
  17. class_funcs.forEach(func => class_as_object[func] = this[func].length)
  18.  
  19. // Validate the consuming class.
  20. Object.keys(required).forEach(member => {
  21. if (!class_as_object.hasOwnProperty(member)) {
  22. errors.add(`Missing function "${member}", should take ${required[member]} arguments`)
  23. }
  24. else if (required[member] !== class_as_object[member]) {
  25. errors.add(`Function "${member}" should take ${required[member]} arguments not ${class_as_object[member]}`)
  26. }
  27. })
  28.  
  29. // Check for errors.
  30. if (errors.size > 0) {
  31. console.log(`${this.constructor.name} appears to be broken:`)
  32. throw Array.from(errors).join("\n")
  33. }
  34. }
  35. }
  36.  
  37. module.exports = Interface
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement