'use strict';

var slice = Array.prototype.slice,
    map = require('array-map'),
    some = require('array-some');

function decorate (callSpec, decorator) {
    var func = callSpec.func,
        thisObj = callSpec.thisObj,
        numArgsToCapture = callSpec.numArgsToCapture;

    return function decoratedAssert () {
        var context, message, args = slice.apply(arguments);

        if (!some(args, isCaptured)) {
            return func.apply(thisObj, args);
        }

        var values = map(args.slice(0, numArgsToCapture), function (arg) {
            if (isNotCaptured(arg)) {
                return arg;
            }
            if (!context) {
                context = {
                    source: arg.source,
                    args: []
                };
            }
            context.args.push({
                value: arg.powerAssertContext.value,
                events: arg.powerAssertContext.events
            });
            return arg.powerAssertContext.value;
        });

        if (numArgsToCapture === (args.length - 1)) {
            message = args[args.length - 1];
        }

        var invocation = {
            thisObj: thisObj,
            func: func,
            values: values,
            message: message
        };
        return decorator.concreteAssert(invocation, context);
    };
}

function isNotCaptured (value) {
    return !isCaptured(value);
}

function isCaptured (value) {
    return (typeof value === 'object') &&
        (value !== null) &&
        (typeof value.powerAssertContext !== 'undefined');
}

module.exports = decorate;

@@ -375,17 +375,16 @@
 ments);%0A
-%0A
         
@@ -387,17 +387,16 @@
     if (
-!
 some(arg
@@ -421,61 +421,8 @@
     
-        return func.apply(thisObj, args);%0A        %7D%0A%0A
     
@@ -500,24 +500,28 @@
             
+  
+  
 if (isNotCap
@@ -542,32 +542,36 @@
                 
+    
 return arg;%0A    
@@ -570,34 +570,42 @@
 rg;%0A            
+  
-%7D%0A
+  %7D%0A    
             if (
@@ -628,24 +628,28 @@
             
+ 
+   
 context = %7B%0A
@@ -644,24 +644,28 @@
 context = %7B%0A
+    
             
@@ -712,16 +712,20 @@
         
+    
 args: %5B%5D
@@ -733,32 +733,36 @@
                 
+   
+ 
 %7D;%0A            %7D
@@ -752,34 +752,40 @@
  %7D;%0A            
-%7D%0A
+    %7D%0A  
             cont
@@ -776,24 +776,26 @@
             
+  
 context.args
@@ -802,16 +802,20 @@
 .push(%7B%0A
+    
         
@@ -875,16 +875,20 @@
         
+ 
+   
 events: 
@@ -917,16 +917,20 @@
 .events%0A
+    
         
@@ -941,32 +941,36 @@
 %7D);%0A            
+    
 return arg.power
@@ -1002,13 +1002,21 @@
     
+   
+ 
 %7D);%0A%0A
+    
     
@@ -1073,24 +1073,28 @@
             
+    
 message = ar
@@ -1122,16 +1122,20 @@
         
+    
 %7D%0A%0A     
@@ -1133,24 +1133,28 @@
  %7D%0A%0A        
+  
+  
 var invocati
@@ -1168,24 +1168,28 @@
             
+    
 thisObj: thi
@@ -1206,16 +1206,20 @@
         
+ 
+   
 func: fu
@@ -1218,24 +1218,28 @@
 func: func,%0A
+    
             
@@ -1262,24 +1262,28 @@
             
+    
 message: mes
@@ -1287,35 +1287,43 @@
 message%0A        
-%7D;%0A
+    %7D;%0A    
         return d
@@ -1368,16 +1368,89 @@
 ntext);%0A
+        %7D else %7B%0A            return func.apply(thisObj, args);%0A        %7D%0A
     %7D;%0A%7D

refactor double-negative conditional