sample

(function($) {
    // ウィジェット定義
    $.widget('test.myWidget', {
    
        // デフォルト設定
        options: {
            content: 'hoge'
        },

        // 初期化処理として自動的に呼び出される
        _init: function() {
            this._update();
        },

        // プライベートメソッド
        _update: function() {
            var opts = this.options;
            var elm = this.element;
            elm.html(opts.content);
        },

        // パブリックメソッド
        setContent: function(str) {
            this.options.content = str;
            this._update();
        }

    });
    delegate = function(func,ctx){
    	return function(){ return func.apply(ctx,arguments); };
    };
    $.widget('forms.textField', {
        
        options: {
            fields: []
        },
        _init: function() {
        },
        validate: function(){
        	this.message = "hello;"
        	return false;
        },
        getMessage: function(){
        	return this.message;
        }
    });    
    $.widget('forms.form', {
        
        options: {
        	fields: []
        },
        _init: function() {
        	this.element.submit(delegate(this._onsubmit,this));
        },
        _onsubmit : function(){
        	this.messages = [];
        	var valid = true;
            var length = this.options.fields.length;
            for(var i = 0;i < length;i++){
            	var field = $(this.options.fields[i]);
            	if(!$(field).textField("validate")){
            		this.messages.push(field.textField("getMessage"));
            		valid = false;
            	}
            }
            if(!valid){
            	var m = "";
                for(var i = 0;i < this.messages.length;i++){
                	$("#myWidget").append(this.messages[i]);
                	m += this.messages[i];
                }
            	
            	return false;
            }
            return true;
            
        },
        // パブリックメソッド
        setContent: function(str) {
            this.options.content = str;
            this._update();
        },
        

    });
    
})(jQuery);

   // DOM構築完了後
   $(function() {
       // オプションを上書きして呼び出し
       $("#myWidget").myWidget({
           content: 'fuga',
           onUpdate: function() {
               alert('更新されました')
           }
       });
       $("#form1").form({
    	   fields: [
    	            $("#text1").textField(),
                    $("#text12").textField(),
                    $("#text13").textField(),
    	            ]
       });
       
   })