const nonActions = [
  'constructor',
  'toString',
  'getAction',
  'actions',
  'registerActions',
  '__defineGetter__',
  '__defineSetter__',
  'hasOwnProperty',
  '__lookupGetter__',
  '__lookupSetter__',
  'isPrototypeOf',
  'propertyIsEnumerable',
  'valueOf',
  '__proto__',
  'toLocaleString',
];

function funcIsAction(functionName) {
  for (let i = 0; i < nonActions.length; i += 1) {
    if (functionName === nonActions[i]) {
      return false;
    }
  }
  return true;
}

class Actions {
  constructor() {
    const actionNames = Actions.getAllActionFunctions(this.constructor.prototype);
    for (let i = 0; i < actionNames.length; i += 1) {
      const actionName = actionNames[i];
      Actions.wrapAction(this, actionName);
    }
  }

  static wrapAction(obj, actionName) {
    const originalMethod = obj[actionName];
    const constructorName = Object.getPrototypeOf(obj).constructor.name;
    const actionId = `${constructorName}.${actionName}`;

    const action = (...args) => ({
      type: actionId,
      payload: originalMethod.apply(obj, args),
    });

    action.__jiveId = actionId;
    // eslint-disable-next-line no-param-reassign
    obj[actionName] = action;
  }

  static getAllActionFunctions(obj) {
    const allObjProperties = Object.getOwnPropertyNames(obj.constructor.prototype);
    return allObjProperties.filter(name => typeof obj[name] === 'function' && funcIsAction(name));
  }
}

export default Actions;

@@ -482,283 +482,16 @@
 %0A%7D%0A%0A
-class Actions %7B%0A  constructor() %7B%0A    const actionNames = Actions.getAllActionFunctions(this.constructor.prototype);%0A    for (let i = 0; i %3C actionNames.length; i += 1) %7B%0A      const actionName = actionNames%5Bi%5D;%0A      Actions.wrapAction(this, actionName);%0A    %7D%0A  %7D%0A%0A  static
+function
  wra
@@ -513,26 +513,24 @@
 tionName) %7B%0A
-  
   const orig
@@ -559,18 +559,16 @@
 nName%5D;%0A
-  
   const 
@@ -630,18 +630,16 @@
 r.name;%0A
-  
   const 
@@ -686,18 +686,16 @@
 ame%7D%60;%0A%0A
-  
   const 
@@ -723,18 +723,16 @@
  (%7B%0A    
- 
- 
 type: ac
@@ -739,18 +739,16 @@
 tionId,%0A
-  
     payl
@@ -791,17 +791,13 @@
 ,%0A  
- 
- 
 %7D);%0A%0A
-  
   ac
@@ -822,18 +822,16 @@
 tionId;%0A
-  
   // esl
@@ -870,18 +870,16 @@
 eassign%0A
-  
   obj%5Bac
@@ -898,16 +898,273 @@
 action;%0A
+%7D%0A%0Aclass Actions %7B%0A  constructor() %7B%0A    const actionNames = Actions.getAllActionFunctions(this.constructor.prototype);%0A    for (let i = 0; i %3C actionNames.length; i += 1) %7B%0A      const actionName = actionNames%5Bi%5D;%0A      wrapAction(this, actionName);%0A    %7D%0A
   %7D%0A%0A  s

move static out of Actions