#**### params: source, target, link
#**##set( $link = $elem )
#**##set( $path = $link.Expression )
#**##set( $range = $utility.nullIfEmpty($link.getRange()) )
#**##set( $linkNegative = false )
#**##if ( $link && $link.Type )
#*   *##set( $linkNegative = $link.Type == 1 )
#**##end
#**##set( $targetNegative = false )
#**##if ($target)
#*   *##set( $targetNegative = $target.Type == 2 )
#**##end
#**##set( $negative = $linkNegative || $targetNegative )
#**##if( !$path )
#*   *##set( $role = $link.getCorrespondingRole($target) )
#*   *##set( $roleType = $role.Target.Name )
#*   *##set( $partnerRole = $role.PartnerRole )
#*   *##set( $qualified = $partnerRole.qualifier)
#*   *###set( $toOneSetter = $role.card.upperBound == 1 && !$qualified )
#*   *###set( $toOne = $toOneSetter )
#*   *##set( $toOneSetter = $token.isToOne() )
#*   *##set( $toOne = $token.hasSingleResult() )
#**##else
#*   *##set( $roleType = "Object" )
#**##end
#**##set( $targetName = $target.getObjectName() )
#**##set( $targetType = $target.InstanceOf.Name )
#**##set( $targetSet = $target.isSet() )
#**##set( $targetOptional = ($target.isOptional() && !$targetSet) )
#**##if ( $targetSet )
#*   *##set( $collectionName = $targetName )
#*   *##set( $targetName = "fujaba__TmpObject$utility.upFirstChar($targetName)" )
#**##end
#**##set( $sourceName = $source.getObjectName() )
#**##set( $sourceType = $source.InstanceOf.Name )
#**##set( $sourceSet = $source.isSet() )
#**##if ( $sourceSet )
#*   *##set( $sourceName = "fujaba__TmpObject$utility.upFirstChar($sourceName)" )
#**##end
#**##set( $object = $target )
#**##set( $ordered = $utility.isOrdered($role) )
#**##if ( ${role.InheritedCodeStyle} )#set( $style = "$lang/${role.InheritedCodeStyle.Name}:" )
#**##elseif( $path && ${source.InheritedCodeStyle} )#set( $style = "$lang/${source.InheritedCodeStyle.Name}:" )
#**##else#set( $style = "java/default:" )#end
#*   *##if ( ${partnerRole.InheritedCodeStyle} )#set( $partnerStyle = "$lang/${partnerRole.InheritedCodeStyle.Name}:" )
#*   *##else#set( $partnerStyle = "$lang/default:" )#end
#*      *##if( $range && !$qualified && (!$ordered || $toOneSetter))
#*         *##set($range="")
#*      *###else
#*         *###set( $toOne = $toOneSetter || ($range && ($ordered || $role.Card.UpperBound==1)) )
#*      *##end
#*      *##set( $toMany = !$toOne )
#*      *##parse("${style}classDiag/assoc/accessorSuffix.vm")
#*      *##set($targetRoleName = $methodSuffix)
#*      *##parse("$!{style}storyPattern/link/multiFirstLast.vm" )