AS3: StringTemplate class

A simple class can many times be a powerful tool to build more complex stuff on top.

By simple a mean that has few or one concern, and takes care of an initially uninteresting task. The StringTemplate might be an example of that.

What it does is quite simple, really. If you feed in a context and later you provide an object, it will resolve the objects attributes value that are present in the template. One example such make this more obvious:

var template:String = "Hello {username}, welcome to {cityname}!";
var data:Object = {username:"Goliatone", cityname:"New York" };
var resolver:StringTemplate = new StringTemplate();
resolver.template = template;
trace( resolver.execute(data)) //Hello Goliatone, welcome to New York!

And the class would look like this:

package  com.skinnygeek.media.text {
    import com.skinnygeek.utils.ObjectUtils;    

    /**
     * <code>StringTemplate</code>.
     *
     *    @langversion ActionScript 3.0
     *    @Flash          Player 9.0.28.0
     *    @author      Emiliano Burgos
     *    @url         http://www.enjoy-mondays.com
     *  @version      1.0
     */
    public class StringTemplate {

        /** @private **/
        private var _template                    :String;

        /** @private **/
        private var _data                        :Object;            

        /**
         * <code>StringTemplate</code>
         * com.skinnygeek.media.text.StringTemplate
         */
        public function StringTemplate() {
            reset( );
        }

        public function reset( ):void {
            _data = { };
            _template = null;
        }

        /**
         *
         * @param    key
         * @param    value
         */
        public function set( key:String, value:* ):void {
            _data[key] = value//.toString();
        }

        /**
         *
         * @param    key
         */
        public function unset(key:String):void {
            delete _data[key];
        }

        /**
         *
         * @param    data
         * @return
         */
        public function  execute( data:Object = null ):String {
            if ( data ) this.data = ObjectUtils.instance.merge( this.data, data );
            return parseTemplate( _template, this.data );
        }

        /**
         *
         */
        public function get data():Object { return _data; }
        /** @private **/
        public function set data(value:Object):void {
            _data = value;
        }

        /**
         * String template holding the markers to be replaced.
         */
        public function get template():String { return _template; }
        /** @private **/
        public function set template(value:String):void {
            _template = value;
        }

        /**
        * Simple string replacement.
        * <pre>
        *     var table : Object = { name : "lorem ipsum", date : "2010/11/23" };
        *    var template: String = "{name} - {date}";
        *
        *     trace(StringTemplate.parseTemplate(template, table)); // -> lorem ipsum - 2010/11/23
        * </pre>
        *
        * @param    template String to be parsed
        * @param     data Object containing Key -> Value pairs.
        * @return     Formated string
        *
        */
        static public function parseTemplate( template:String, data:Object): String {
            function replaceFn():String {
                var prop:String = arguments[1];
                return (prop in data) ? data[prop] : '';
            }
            return template.replace(/{(\w+)}/g, replaceFn);
        }


    }
}