<!--
 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.
-->

For 2011-08-17 (a test whether commiting has become possible as well):

	- incorporate all RFEs for BSF 2.4

	- possibly create a JSR-223-adapter for BSF 2.4 (there are engines for BSF 2.4 for which no JSR-223 engines exist; in addition it may buy time for deployments that have a mix of BSF 2.4 and JSR-223)


-------------------------- cut here (from 2006) ------------------------------
For 2006-09-25 the TODO list would consist at least from the following items:

        - add new BSF engines for BSF 2.4

        - create a new BSF 3.0 which complies to JSR-223 (which is part of Java 6),
          some features being

          - BSF 3.0 will be available as FOSS for earlier version of Java

          - BSF 3.0 may get an internal adapter for employing the numerous BSF 2.4
            engines transparently

          - ...


Rony G. Flatscher, 2006-09-25



------------------------------ cut here (from 2003) -----------------------------
The following TODO list stems from 2003 and has not been updated anymore and
has partially been obsoleted:

TODO list for BSF 2.3.0-1:

    use a discovery mechanism like JAXP in place of Languages.properties

    break out messages for both runtime and debugging into properties files

    work out a better procedure for obtaining language jarfiles
    Maven/Ibiblio and replacement of CVS with Subversion are possibilities

    improve doc generation and distribution

    provide/incorporate patches for Jasper 4.0.x, 4.1.x, and 5.x.

TODO list for BSF 2.4.0:

    work on improving BSF global scope, e.g.:
        public Boolean variableExists()
        public Object getVariableValue()
        public void setVariableValue()
        ...

TODO list for BSF 3.0.0:

    address debug support for multiple languages (JSR-045?)
------------------------------ cut here (from 2003) -----------------------------



