## Licensed to the Apache Software Foundation (ASF) under one
## or more contributor license agreements.  See the NOTICE file
## distributed with this work for additional information
## regarding copyright ownership.  The ASF licenses this file
## to you under the Apache License, Version 2.0 (the
## "License"); you may not use this file except in compliance
## with the License.  You may obtain a copy of the License at
##
##   http://www.apache.org/licenses/LICENSE-2.0
##
## Unless required by applicable law or agreed to in writing,
## software distributed under the License is distributed on an
## "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
## KIND, either express or implied.  See the License for the
## specific language governing permissions and limitations
## under the License.    
This tests the pass by name some more, seeing if
we can assign to a complete reference that
we pass in (bangstartII) or, for the truly insane
pass in a reference that a property is assumed
within (BangstartII)

Note that you wont see anything rendered, but
SetBangStart will output to stdout

#macro( bangstart $a)
  #set( $a.BangStart = 4 )
#end

#macro( bangstartII $a)
  #set( $a = 5 )
#end

#macro( bar $b )
  $b.bang()
#end

#bangstart( $provider )
#bangstartII( $provider.BangStart )
