## 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( 'ClassTool' )
<p>
$text.demo.thisPage.insert("#doclink( 'ClassTool' true )").
</p>
<p>
$text.get('class.intro')
</p>

#set( $toolname = 'class' )
#set( $toolclass = $class.class )
#set( $toollink = $doclink )
#set( $toolDemo = 
"${esc.h}set( ${esc.d}classTool = ${esc.d}class.inspect(${esc.d}class) )
${esc.h}foreach( ${esc.d}method in ${esc.d}classTool.methods )
${esc.d}method.javadocRef
${esc.h}end"
)

#parse( 'demo.vm' )
