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

package mx.core
{

/**
 *  A deferred instance factory that uses a generator function
 *  to create an instance of the required object.
 *  An application uses the <code>getInstance()</code> method to
 *  create an instance of an object when it is first needed and get
 *  a reference to the object thereafter.
 *
 *  @see DeferredInstanceFromClass
 *  
 *  @langversion 3.0
 *  @playerversion Flash 9
 *  @playerversion AIR 1.1
 *  @productversion Flex 3
 */
public class DeferredInstanceFromFunction implements ITransientDeferredInstance
{
    include "../core/Version.as";

    //--------------------------------------------------------------------------
    //
    //  Constructor
    //
    //--------------------------------------------------------------------------

    /**
     *  Constructor.
     *
     *  @param generator A function that creates and returns an instance
     *  of the required object.
     *
     *  @param destructor An optional function used to cleanup outstanding
     *  references when <code>reset()</code> is called.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public function DeferredInstanceFromFunction(generator:Function,
        destructor:Function = null )
    {
        super();

        this.generator = generator;
        this.destructor = destructor;
    }

    //--------------------------------------------------------------------------
    //
    //  Variables
    //
    //--------------------------------------------------------------------------

    /**
     *  @private
     *  The generator function.
     */
    private var generator:Function;

    /**
     *  @private
     *  The generated value.
     */
    private var instance:Object = null;

    /**
     *  @private
     *  An optional function used to cleanup outstanding
     *  references when reset() is invoked
     */
    private var destructor:Function;

    //--------------------------------------------------------------------------
    //
    //  Methods
    //
    //--------------------------------------------------------------------------

    /**
     *  Returns a reference to an instance of the desired object.
     *  If no instance of the required object exists, calls the function
     *  specified in this class' <code>generator</code> constructor parameter.
     * 
     *  @return An instance of the object.
     *  
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 3
     */
    public function getInstance():Object
    {
        if (!instance)
            instance = generator();

        return instance;
    }
    
    /**
     *  Resets the state of our factory to the initial, uninitialized state.
     *  The reference to our cached instance is cleared.
     * 
     *  @langversion 3.0
     *  @playerversion Flash 9
     *  @playerversion AIR 1.1
     *  @productversion Flex 4
     */
    public function reset():void
    {
        instance = null;
        
        if (destructor != null)
            destructor();
    }

}

}
