code: function unpointcut(clazz, opts, advisor, iClass, iInstance, bindTo) {
      var constructor, re, keys, fn, c;
  
      function doRestore(collection, advisor) {
        var c, key, iConstructor, iStatic, fn;
  
        for (c in collection) {
          key          = c/1 == c ? collection[c] : c;
          iConstructor = (key === "constructor");
          iStatic      = iClass && clazz[key];
  
          if (key === "constructor" && iClass) {
            constructor = restore(iClass, advisor);;
          } else {
            if (clazz[key]) {
              clazz[key] = restore(clazz[key], advisor);
            }
            if (bindTo[key]) {
              bindTo[key] = restore(bindTo[key], advisor);
            }
          }
        }
      }
  
      if (opts === "remove") {
        if ( !advisor) {                                                         // type 1: "remove"
          constructor = iClass && (clazz === clazz[WRAPPER]) && clazz[ORIGIN];
          for (var name in bindTo) {
            bindTo[name] = restore(bindTo[name]) || bindTo[name];
          }
          for (var name in clazz) {
            clazz[name] = restore(clazz[name]) || clazz[name];
          }
        } else {                                                                 // type 2: "remove", advisor
          doRestore(advisor, advisor);
        }
      } else if ((re = /^remove /.exec(opts)) !== null) {                        // type 3: "remove contructor foo"
        keys = opts.replace(re, "").split(" ");
        doRestore(keys);
      } else {
        throw "Invalid params";
      }
      return constructor || clazz;
    }
docs: Do unpointcut: Remove pointcuts from subject.
  Execute from public pointcut api:
  - poincut(subject, "remove");
  - poincut(subject, "remove constructor foo bar");
  - poincut(subject, "remove", advisor);