package com.joelhooks.pipingthemachine.common.view
{
    import com.ericfeminella.collections.HashMap;
    
    import org.puremvc.as3.multicore.utilities.pipes.interfaces.IPipeFitting;
    import org.puremvc.as3.multicore.utilities.pipes.plumbing.Junction;
    import org.puremvc.as3.multicore.utilities.pipes.plumbing.JunctionMediator;
    import org.puremvc.as3.multicore.utilities.pipes.plumbing.TeeSplit;
    
    /**
     * Adds properties and methods for managing connections of a JunctionMediator
     * mostly related to managing memory with dynamically loaded and unloaded
     * modules.
     *  
     * @author joel
     */
    public class ManagedJunctionMediator extends JunctionMediator
    {
        public function ManagedJunctionMediator(name:String, junction:Junction)
        {
            super(name, junction);
        }
        
        //a pool of connections to this junction
        protected var connectionPool:HashMap = new HashMap();
        
        public function addConnectionToPool(input:IPipeFitting, output:IPipeFitting, contextId:String):void
        {
            this.connectionPool.put(contextId, {input:input,output:output});
        }
        
        public function removeConnectionFromPool(contextId:String):void
        {
            if(junction.hasPipe(contextId))
                junction.removePipe( contextId );
                
            if(connectionPool.containsKey(contextId))
            {
                var input:IPipeFitting = this.connectionPool.getValue(contextId).input;
                var output:IPipeFitting = this.connectionPool.getValue(contextId).output;
                if(output is TeeSplit)
                    TeeSplit(output).disconnectFitting(input);
                input.disconnect();
                this.connectionPool.remove(contextId);                
            }
        }        
    }
}