#*
 * $Id: tiles-jsp.tld 836180 2009-11-14 14:00:02Z apetrelli $
 *
 * 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 file was automatically generated by Apache Tiles Autotag.
 */
package ${packageName};

/**
#foreach($line in $stringTool.splitOnNewlines(${suite.documentation}))
 * $line
#end
 */
public class $stringTool.capitalizeFirstLetter(${suite.name})FMModelRepository {

#foreach($clazz in ${suite.getTemplateClasses()})
    /**
     * The "${clazz.tagName}" directive.
     */
    private ${clazz.tagClassPrefix}FMModel ${clazz.tagName};

#end
    /**
     * Constructor.
     */
    public TilesFMModelRepository() {
#foreach($clazz in ${suite.getTemplateClasses()})
        ${clazz.tagName} = new ${clazz.tagClassPrefix}FMModel(new ${clazz.name}());
#end
    }
#foreach($clazz in ${suite.getTemplateClasses()})

    /**
     * Returns the "${clazz.tagName}" directive.
     *
     * @return The "${clazz.tagName}" directive.
     */
    public ${clazz.tagClassPrefix}FMModel get$stringTool.capitalizeFirstLetter(${clazz.tagName})() {
        return ${clazz.tagName};
    }
#end
}
