/*
	Copyright (c) 2004-2009, The Dojo Foundation All Rights Reserved.
	Available via Academic Free License >= 2.1 OR the modified BSD license.
	see: http://dojotoolkit.org/license for details
*/


if(!dojo._hasResource["dojox.drawing.util.oo"]){
dojo._hasResource["dojox.drawing.util.oo"]=true;
dojo.provide("dojox.drawing.util.oo");
dojox.drawing.util.oo={declare:function(){
var f,o,_1=0,a=arguments;
if(a.length<2){
console.error("gfx.oo.declare; not enough arguments");
}
if(a.length==2){
f=a[0];
o=a[1];
}else{
a=Array.prototype.slice.call(arguments);
o=a.pop();
f=a.pop();
_1=1;
}
for(var n in o){
f.prototype[n]=o[n];
}
if(_1){
a.unshift(f);
f=this.extend.apply(this,a);
}
return f;
},extend:function(){
var a=arguments,_2=a[0];
if(a.length<2){
console.error("gfx.oo.extend; not enough arguments");
}
var f=function(){
for(var i=1;i<a.length;i++){
a[i].prototype.constructor.apply(this,arguments);
}
_2.prototype.constructor.apply(this,arguments);
};
for(var i=1;i<a.length;i++){
for(var n in a[i].prototype){
f.prototype[n]=a[i].prototype[n];
}
}
for(var n in _2.prototype){
f.prototype[n]=_2.prototype[n];
}
return f;
}};
}
