## 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.
#title( 'ContextTool' )
<p>
$text.demo.thisPage.insert("#doclink( 'ViewContextTool' false )").
</p>
<p>
$text.get('context.intro')
</p>

#set( $toolname = 'context' )
## all the interesting methods are actually in the superclass
## since ViewContextTool only adds request/session/app attributes
## and not any additional methods
#set( $toolclass = $context.class.superclass )
#set( $toollink = $doclink )
#set( $toolDemo = 
"${esc.h}foreach( ${esc.d}key in ${esc.d}context.keys )
  ${esc.d}key = ${esc.d}context.get(${esc.d}key)
${esc.h}end"
)

#parse( 'demo.vm' )
