////////////////////////////////////////////////////////////////////////////////
//
//  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.
//
////////////////////////////////////////////////////////////////////////////////

=1= Introduction

FlexTasks is an automated build tool for Flex application
development. It is built on top of the Apache Ant project.

FlexTasks is intended for both internal and external use in the
absence of FlexTasks.

=2= Description

 - Scenario

Paul has been assigned a bug to resolve with only a few hours to
spare. He refuses to use FlexBuilder, as that would take focus away
from his Emacs window. He decides to write an ant build file to
automate the build process:

  <target name="bug">
      <mxmlc file="${bug}.mxml" 
           incremental="false"
           strict="true"
           verbose-stack-traces="true" 
           keep-generated-actionscript="true">
        
          <load-config filename="../frameworks/flex-config.xml" />
        
          <source-path path-element="../frameworks" />
          <source-path path-element="../../enterprise/frameworks" />
      </mxmlc>
  </target>

He then types into his shell (vicariously through Emacs),

$ ant bug

and within seconds the Flex application is built and ready for
inspection by Exterminator Paul.

 - Details

Users must first install FlexTasks by placing the distribution jar in
the "lib" directory of their ant install. This will allow them to use
tasks defined by FlexTasks without any special modifications to their
build files (such as including a <taskdef>).

FlexTasks exposes all of the command line options of mxmlc through the
attributes and nested elements of an <mxmlc> task. The full name and
abbreviated name of a command line option can be used interchangably
when the option is implemented as an attribute. For example,

<mxmlc file="foo.mxml" compiler.as3="true" />

and

<mxmlc file="foo.mxml" as3="true" />

are both acceptable ways to pass the -compiler.as3 option to mxmlc.

All boolean options are implemented as attributes of the <mxmlc>
element.

All options that take a single argument are also implemented as
attributes of the <mxmlc> element. The descriptions of these types of
options vary in the mxmlc documentation. If an option is documented as
taking a <string>, <filename>, <int>, or some sort of path element,
and that option is non-repeatable, then this option is set by setting
an attribute in the <mxmlc> element.

Options that are repeatable, or take more than one argument (such as
-default-size) are implemented as nested elements with attributes
corresponding to the names given to arguments in the mxmlc
documentation. For example, if one desired to pass the option
-default-size 800 600 to mxmlc,

<mxmlc file="foo.mxmlc">
    <default-size width="800" height="600" />
</mxmlc>

would accomplish this.

It is an error to include multiple nested elements corresponding to a
non-repeatable option.

There are two nested elements that can contain nested elements:
<fonts> and <metadata>. These elements encapsulate all options
starting with "compiler.fonts" and "metadata", repectively. What has
been described thus far applies to these elements as well. For
example, if one wanted to include contributors names along with a
description of the application, the following would accomplish this:

<mxmlc file="foo.mxmlc">
    <metadata description="foo app">
        <contributor name="Joe" />
        <contributor name="Mike" />
    </metadata>
</mxmlc>.

Special case: the compiler.fonts.languages.language-range option is
set by adding to <fonts> a <language-range> nested element, rather
than a <languages.language-range> element. It may be wise to change
this in the future.

For more information, see the FlexTasks page on the flexteam wiki.
