<?php

class When_Inside_Widgets_And_Sidebars 
{
	public $active_sidebar;
	public $active_widget;

	protected $_sidebars;
	protected $_sidebars_orig;
	protected $_widget_callbacks;

	public function __construct()
	{
		add_action( 'dynamic_sidebar', array(&$this, 'event_dynamic_sidebar' ) );
		add_filter( 'sidebars_widgets', array(&$this, 'filter_sidebars_widgets' ) );
	}

	public function event_dynamic_sidebar( $widget )
	{
		$this->active_widget = $widget['id'];
		foreach( (array) $this->_sidebars as $sidebar_id => $sidebar ) {
			if ( in_array( $widget['id'], $sidebar ) ) {
				$this->active_sidebar = $sidebar_id;
				if ( count( $this->_sidebars[ $sidebar_id ] ) == count( $this->_sidebars_orig[ $sidebar_id ] ) ) {
					var_dump( sprintf( 'Starting sidebar %s!', $sidebar_id ) );
				}
				unset( $this->_sidebars[ $sidebar_id ][ array_search( $widget['id'], $this->_sidebars[ $sidebar_id ] ) ] );
				break;
			}
		}
		var_dump( sprintf( 'Starting widget %s!', $widget['id'] ) );
	}

	public function filter_sidebars_widgets( $sidebars )
	{
		global $wp_registered_widgets;

		$this->_sidebars_orig = $this->_sidebars = $sidebars;
		foreach( (array) $wp_registered_widgets as $widget ) {
			if ( isset( $widget['id'] ) && isset( $widget['callback'] ) ) {
				$this->_widget_callbacks[ $widget['id'] ] = $widget['callback'];	
				$wp_registered_widgets[ $widget['id'] ]['callback'] = array(&$this, 'callable_wrapper');
			}
		}
		return $sidebars;
	}

	public function callable_wrapper()
	{
		if ( is_callable( $this->_widget_callbacks[ $this->active_widget ] ) ) {
			$params = func_get_args();
			call_user_func_array( $this->_widget_callbacks[ $this->active_widget ], $params ); 
			var_dump( sprintf( 'Ending widget %s!', $this->active_widget ) );

			if ( empty( $this->_sidebars[ $this->active_sidebar ] ) && ! empty( $this->_sidebars_orig[ $this->active_sidebar ] ) ) {
				var_dump( sprintf( 'Ending sidebar %s!', $this->active_sidebar ) );
				$this->active_sidebar = null;
			}
			$this->active_widget = null;
		}
	}
}

$GLOBALS['inside_widgets_sidebars'] = new When_Inside_Widgets_And_Sidebars; 
