Index: wp-includes/default-widgets.php
===================================================================
--- wp-includes/default-widgets.php	(revision 10829)
+++ wp-includes/default-widgets.php	(working copy)
@@ -14,9 +14,10 @@
  */
 class WP_Widget_Pages extends WP_Widget {
 
-	function WP_Widget_Pages() {
-		$widget_ops = array('classname' => 'widget_pages', 'description' => __( "Your blog's WordPress Pages") );
-		$this->WP_Widget('pages', __('Pages'), $widget_ops);
+	function setup() {
+		$this->name = __('Pages');
+		$this->id_base = 'pages';
+		$this->widget_options = array('classname' => 'widget_pages', 'description' => __( "Your blog's WordPress Pages") );
 	}
 
 	function widget( $args, $instance ) {
@@ -90,9 +91,10 @@
  */
 class WP_Widget_Links extends WP_Widget {
 
-	function WP_Widget_Links() {
-		$widget_ops = array('description' => __( "Your blogroll" ) );
-		$this->WP_Widget('links', __('Links'), $widget_ops);
+	function setup() {
+		$this->name = __('Links');
+		$this->id_base = 'links';
+		$this->widget_options = array('description' => __( "Your blogroll" ) );
 	}
 
 	function widget( $args, $instance ) {
@@ -150,9 +152,10 @@
  */
 class WP_Widget_Search extends WP_Widget {
 
-	function WP_Widget_Search() {
-		$widget_ops = array('classname' => 'widget_search', 'description' => __( "A search form for your blog") );
-		$this->WP_Widget('search', __('Search'), $widget_ops);
+	function setup() {
+		$this->name = __('Search');
+		$this->id_base = 'search';
+		$this->widget_options = array('classname' => 'widget_search', 'description' => __( "A search form for your blog") );
 	}
 
 	function widget( $args, $instance ) {
@@ -173,9 +176,10 @@
  */
 class WP_Widget_Archives extends WP_Widget {
 
-	function WP_Widget_Archives() {
-		$widget_ops = array('classname' => 'widget_archive', 'description' => __( "A monthly archive of your blog's posts") );
-		$this->WP_Widget('archives', __('Archives'), $widget_ops);
+	function setup() {
+		$this->name = __('Archives');
+		$this->id_base = 'archives';
+		$this->widget_options = array('classname' => 'widget_archive', 'description' => __( "A monthly archive of your blog's posts") );
 	}
 
 	function widget( $args, $instance ) {
@@ -237,9 +241,10 @@
  */
 class WP_Widget_Meta extends WP_Widget {
 
-	function WP_Widget_Meta() {
-		$widget_ops = array('classname' => 'widget_meta', 'description' => __( "Log in/out, admin, feed and WordPress links") );
-		$this->WP_Widget('meta', __('Meta'), $widget_ops);
+	function setup() {
+		$this->name = __('Meta');
+		$this->id_base = 'meta';
+		$this->widget_options = array('classname' => 'widget_meta', 'description' => __( "Log in/out, admin, feed and WordPress links") );
 	}
 
 	function widget( $args, $instance ) {
@@ -284,9 +289,10 @@
  */
 class WP_Widget_Calendar extends WP_Widget {
 
-	function WP_Widget_Calendar() {
-		$widget_ops = array('classname' => 'widget_calendar', 'description' => __( "A calendar of your blog's posts") );
-		$this->WP_Widget('calendar', __('Calendar'), $widget_ops);
+	function setup() {
+		$this->name = __('Calendar');
+		$this->id_base = 'calendar';
+		$this->widget_options = array('classname' => 'widget_calendar', 'description' => __( "A calendar of your blog's posts") );
 	}
 
 	function widget( $args, $instance ) {
@@ -322,10 +328,10 @@
  */
 class WP_Widget_Text extends WP_Widget {
 
-	function WP_Widget_Text() {
-		$widget_ops = array('classname' => 'widget_text', 'description' => __('Arbitrary text or HTML'));
-		$control_ops = array('width' => 400, 'height' => 350);
-		$this->WP_Widget('text', __('Text'), $widget_ops, $control_ops);
+	function setup() {
+		$this->name = __('Text');
+		$this->id_base = 'text';
+		$this->widget_options = array('classname' => 'widget_text', 'description' => __('Arbitrary text or HTML'));
 	}
 
 	function widget( $args, $instance ) {
@@ -367,9 +373,10 @@
  */
 class WP_Widget_Categories extends WP_Widget {
 
-	function WP_Widget_Categories() {
-		$widget_ops = array( 'classname' => 'widget_categories', 'description' => __( "A list or dropdown of categories" ) );
-		$this->WP_Widget('categories', __('Categories'), $widget_ops);
+	function setup() {
+		$this->name = __('Categories');
+		$this->id_base = 'categories';
+		$this->widget_options = array( 'classname' => 'widget_categories', 'description' => __( "A list or dropdown of categories" ) );
 	}
 
 	function widget( $args, $instance ) {
Index: wp-includes/widgets.php
===================================================================
--- wp-includes/widgets.php	(revision 10829)
+++ wp-includes/widgets.php	(working copy)
@@ -34,6 +34,13 @@
 
 	// Member functions that you must over-ride.
 
+	/** Set up widget variables:
+	 * Mandatory are $id_base and $name
+	 */
+	function setup() {
+		die('function WP_Widget::setup() must be over-ridden in a sub-class.');
+	}
+
 	/** Echo the widget content.
 	 * 
 	 * Subclasses should over-ride this function to generate their widget code.
@@ -71,8 +78,8 @@
 	/**
 	 * PHP4 constructor
 	 */
-	function WP_Widget( $id_base, $name, $widget_options = array(), $control_options = array() ) {
-		$this->__construct( $id_base, $name, $widget_options, $control_options );
+	function WP_Widget() {
+		$this->__construct();
 	}
 
 	/**
@@ -84,13 +91,19 @@
 	 *	 - width
 	 *	 - height
 	 */
-	function __construct( $id_base, $name, $widget_options = array(), $control_options = array() ) {
-		$this->id_base = $id_base;
-		$this->name = $name;
-		$this->option_name = 'widget_' . $id_base;
-		$this->widget_options = wp_parse_args( $widget_options, array('classname' => $this->option_name) );
-		$this->control_options = wp_parse_args( $control_options, array('id_base' => $this->id_base) );
+	function __construct() {
+		$this->setup();
 
+		if ( empty($this->id_base) )
+			trigger_error("No id_base defined", E_USER_ERROR);
+
+		if ( empty($this->name) )
+			return trigger_error("No name defined", E_USER_ERROR);
+
+		$this->option_name = 'widget_' . $this->id_base;
+		$this->widget_options = wp_parse_args( $this->widget_options, array('classname' => $this->option_name) );
+		$this->control_options = wp_parse_args( $this->control_options, array('id_base' => $this->id_base) );
+
 		//add_action( 'widgets_init', array( &$this, '_register' ) );
 	}
 
@@ -1072,4 +1085,4 @@
  */
 function unregister_widget_control($id) {
 	return wp_unregister_widget_control($id);
-}
\ No newline at end of file
+}
