@@ -57,7 +57,7 @@ component {
57
57
58
58
59
59
// programmatically register new beans with the factory (add an actual CFC)
60
- public any function declareBean ( string beanName , string dottedPath , boolean isSingleton = true ) {
60
+ public any function declareBean ( string beanName , string dottedPath , boolean isSingleton = true , struct overrides = { } ) {
61
61
discoverBeans ( variables .folders );
62
62
var singleDir = ' ' ;
63
63
if ( listLen ( dottedPath , ' .' ) > 1 ) {
@@ -68,7 +68,8 @@ component {
68
68
var cfcPath = replace ( expandPath ( ' /' & replace ( dottedPath , ' .' , ' /' , ' all' ) & ' .cfc' ), chr (92 ), ' /' , ' all' );
69
69
var metadata = {
70
70
name = beanName , qualifier = singleDir , isSingleton = isSingleton ,
71
- path = cfcPath , cfc = dottedPath , metadata = cleanMetadata ( dottedPath )
71
+ path = cfcPath , cfc = dottedPath , metadata = cleanMetadata ( dottedPath ),
72
+ overrides = overrides
72
73
};
73
74
variables .beanInfo [ beanName ] = metadata ;
74
75
return this ;
@@ -485,7 +486,9 @@ component {
485
486
var injection = partialBean .injection [ name ];
486
487
for ( var property in injection .setters ) {
487
488
var args = { };
488
- if ( structKeyExists ( partialBean .injection , property ) ) {
489
+ if ( structKeyExists ( injection .overrides , property ) ) {
490
+ args [ property ] = injection .overrides [ property ];
491
+ } else if ( structKeyExists ( partialBean .injection , property ) ) {
489
492
args [ property ] = partialBean .injection [ property ].bean ;
490
493
} else if ( structKeyExists ( variables , ' parent' ) && variables .parent .containsBean ( property ) ) {
491
494
args [ property ] = variables .parent .getBean ( property );
@@ -506,6 +509,7 @@ component {
506
509
var info = variables .beanInfo [ beanName ];
507
510
if ( structKeyExists ( info , ' cfc' ) ) {
508
511
var metaBean = cachable ( beanName );
512
+ var overrides = structKeyExists ( info , ' overrides' ) ? info .overrides : { };
509
513
bean = metaBean .bean ;
510
514
if ( metaBean .newObject ) {
511
515
if ( structKeyExists ( info .metadata , ' constructor' ) ) {
@@ -515,7 +519,10 @@ component {
515
519
// handle known required arguments
516
520
if ( info .metadata .constructor [ arg ] ) {
517
521
var beanMissing = true ;
518
- if ( containsBean ( arg ) ) {
522
+ if ( structKeyExists ( overrides , arg ) ) {
523
+ args [ arg ] = overrides [ arg ];
524
+ beanMissing = false ;
525
+ } else if ( containsBean ( arg ) ) {
519
526
argBean = resolveBeanCreate ( arg , accumulator );
520
527
if ( structKeyExists ( argBean , ' bean' ) ) {
521
528
args [ arg ] = argBean .bean ;
@@ -525,14 +532,18 @@ component {
525
532
if ( beanMissing ) {
526
533
throw ' bean not found: #arg #; while resolving constructor arguments for #beanName #' ;
527
534
}
528
- } else if ( containsBean ( arg ) ) {
529
- // optional but present
530
- argBean = resolveBeanCreate ( arg , accumulator );
531
- if ( structKeyExists ( argBean , ' bean' ) ) {
532
- args [ arg ] = argBean .bean ;
533
- }
534
535
} else {
535
- // optional but not present
536
+ if ( structKeyExists ( overrides , arg ) ) {
537
+ args [ arg ] = overrides [ arg ];
538
+ } else if ( containsBean ( arg ) ) {
539
+ // optional but present
540
+ argBean = resolveBeanCreate ( arg , accumulator );
541
+ if ( structKeyExists ( argBean , ' bean' ) ) {
542
+ args [ arg ] = argBean .bean ;
543
+ }
544
+ } else {
545
+ // optional but not present
546
+ }
536
547
}
537
548
}
538
549
var __ioc_newBean = evaluate ( ' bean.init( argumentCollection = args )' );
@@ -552,11 +563,16 @@ component {
552
563
}
553
564
var setterMeta = {
554
565
setters = variables .settersInfo [ beanName ].setters ,
555
- bean = bean
566
+ bean = bean ,
567
+ overrides = overrides
556
568
};
557
569
accumulator .injection [ beanName ] = setterMeta ;
558
570
for ( var property in setterMeta .setters ) {
559
- resolveBeanCreate ( property , accumulator );
571
+ if ( structKeyExists ( overrides , property ) ) {
572
+ // skip resolution because we'll inject override
573
+ } else {
574
+ resolveBeanCreate ( property , accumulator );
575
+ }
560
576
}
561
577
}
562
578
accumulator .bean = bean ;
@@ -608,7 +624,7 @@ component {
608
624
throw ' singletonPattern and transientPattern are mutually exclusive' ;
609
625
}
610
626
611
- variables .config .version = ' 0.4.10 ' ;
627
+ variables .config .version = ' 0.5.0 ' ;
612
628
}
613
629
614
630
0 commit comments