@@ -347,37 +347,41 @@ Collection.prototype.findAndModify = function(query, sort, update, options, call
347347
348348/**
349349 * Various argument possibilities
350- * 1 callback
351- * 2 selector, callback,
352- * 2 callback, options // really?!
353- * 3 selector, fields, callback
354- * 3 selector, options, callback
355- * 4,selector, fields, options, callback
356- * 5 selector, fields, skip, limit, callback
357- * 6 selector, fields, skip, limit, timeout, callback
350+ * 1 callback?
351+ * 2 selector, callback? ,
352+ * 2 callback? , options // really?!
353+ * 3 selector, fields, callback?
354+ * 3 selector, options, callback?
355+ * 4,selector, fields, options, callback?
356+ * 5 selector, fields, skip, limit, callback?
357+ * 6 selector, fields, skip, limit, timeout, callback?
358358 *
359359 * Available options:
360360 * limit, sort, fields, skip, hint, explain, snapshot, timeout, tailable, batchSize
361361 */
362362Collection . prototype . find = function ( ) {
363363 var options ,
364- len = arguments . length ,
365- selector = ( len > 1 ) ? arguments [ 0 ] : { } ,
366- fields = ( len > 2 ) ? arguments [ 1 ] : undefined ,
367- callback = arguments [ len - 1 ] ;
368-
369- if ( len == 2 && typeof arguments [ 0 ] == 'function' ) {
370- selector = { } ; options = arguments [ 1 ] ; callback = arguments [ 0 ] ;
364+ args = Array . prototype . slice . call ( arguments , 0 ) ;
365+ has_callback = typeof args [ args . length - 1 ] === 'function' ,
366+ has_weird_callback = typeof args [ 0 ] === 'function' ,
367+ callback = has_callback ? args . pop ( ) : ( has_weird_callback ? args . shift ( ) : null ) ,
368+ len = args . length ,
369+ selector = ( len >= 1 ) ? args [ 0 ] : { } ,
370+ fields = ( len >= 2 ) ? args [ 1 ] : undefined ;
371+
372+ if ( len == 1 && has_weird_callback ) { // backwards compat for callback?, options case
373+ selector = { } ;
374+ options = args [ 0 ] ;
371375 }
372376
373- if ( len == 3 ) { // backwards compat for options object
377+ if ( len == 2 ) { // backwards compat for options object
374378 var test = [ 'limit' , 'sort' , 'fields' , 'skip' , 'hint' , 'explain' , 'snapshot' , 'timeout' , 'tailable' , 'batchSize' ] ,
375379 idx = 0 , l = test . length , is_option = false ;
376380 while ( ! is_option && idx < l ) if ( test [ idx ] in fields ) is_option = true ; else idx ++ ;
377381 options = is_option ? fields : { } ;
378382 if ( is_option ) fields = undefined ;
379383 }
380- if ( len == 4 ) options = arguments [ 2 ] ;
384+ if ( len == 3 ) options = args [ 2 ] ;
381385
382386 if ( options && options . fields ) {
383387 fields = { } ;
@@ -389,13 +393,19 @@ Collection.prototype.find = function() {
389393 }
390394 if ( ! options ) options = { } ;
391395
392- options . skip = len > 4 ? arguments [ 2 ] : options . skip ? options . skip : 0 ;
393- options . limit = len > 4 ? arguments [ 3 ] : options . limit ? options . limit : 0 ;
396+ options . skip = len > 3 ? args [ 2 ] : options . skip ? options . skip : 0 ;
397+ options . limit = len > 3 ? args [ 3 ] : options . limit ? options . limit : 0 ;
394398 options . hint = options . hint != null ? this . normalizeHintField ( options . hint ) : this . internalHint ;
395- options . timeout = len == 6 ? arguments [ 4 ] : options . timeout ? options . timeout : undefined ;
399+ options . timeout = len == 5 ? args [ 4 ] : options . timeout ? options . timeout : undefined ;
396400
397401 var o = options ;
398- callback ( null , new Cursor ( this . db , this , selector , fields , o . skip , o . limit , o . sort , o . hint , o . explain , o . snapshot , o . timeout , o . tailable , o . batchSize ) ) ;
402+
403+ // callback for backward compatibility
404+ if ( callback ) {
405+ callback ( null , new Cursor ( this . db , this , selector , fields , o . skip , o . limit , o . sort , o . hint , o . explain , o . snapshot , o . timeout , o . tailable , o . batchSize ) ) ;
406+ } else {
407+ return new Cursor ( this . db , this , selector , fields , o . skip , o . limit , o . sort , o . hint , o . explain , o . snapshot , o . timeout , o . tailable , o . batchSize ) ;
408+ }
399409} ;
400410
401411Collection . prototype . normalizeHintField = function ( hint ) {
0 commit comments