<?php
    namespace ReduxCore\ReduxFramework;
    if ( ! defined( 'ABSPATH' ) ) {
    exit;
}
    /**
     * Redux Framework Instance Container Class
     * Automatically captures and stores all instances
     * of ReduxFramework at instantiation.
     *
     * @package     Redux_Framework
     * @subpackage  Core
     */
    class ReduxFrameworkInstances {

        /**
         * ReduxFrameworkInstances
         *
         * @var object
         */
        private static $instance;

        /**
         * ReduxFramework instances
         *
         * @var array
         */
        private static $instances;

        /**
         * Get Instance
         * Get ReduxFrameworkInstances instance
         * OR an instance of ReduxFramework by [opt_name]
         *
         * @param  string $opt_name the defined opt_name
         *
         * @return object                class instance
         */
        public static function get_instance( $opt_name = false ) {

            if ( is_null( self::$instance ) ) {
                self::$instance = new self();
            }

            if ( $opt_name && ! empty( self::$instances[ $opt_name ] ) ) {
                return self::$instances[ $opt_name ];
            }

            return self::$instance;
        }

        /**
         * Get all instantiated ReduxFramework instances (so far)
         *
         * @return [type] [description]
         */
        public static function get_all_instances() {
            return self::$instances;
        }

        private function __construct() {

            add_action( 'redux/construct', array( $this, 'capture' ), 5, 1 );
        }

        function capture( $ReduxFramework ) {
            $this->store( $ReduxFramework );
        }

        private function store( $ReduxFramework ) {
            if ( $ReduxFramework instanceof ReduxFramework ) {
                $key                     = $ReduxFramework->args['opt_name'];
                self::$instances[ $key ] = $ReduxFramework;
            }
        }
    }
