 			};
 			watchLookup[linkableTarget] = callback;
 			getCallbackCollection(linkableTarget).addImmediateCallback(null, callback);
+		}
+		
+		public static function watchState(target:Object = null, indent:* = null):void
+		{
+			if (!target)
+			{
+				weaveTrace('Usage: watchState(target, optional_indent)');
+				return;
+			}
+			watch(target, function(object:ILinkableObject):String { return Compiler.stringify(getSessionState(object), null, indent); });
 		}
 		
 		public static function unwatch(target:Object):void

	import weave.api.core.DynamicState;
	import weave.api.core.ILinkableObject;
	import weave.api.getCallbackCollection;
	import weave.compiler.Compiler;
	import weave.compiler.StandardLib;
	

		{
			try
			{
				outerLoop: for each (var property:* in path)
				{
					if (DynamicState.isDynamicStateArray(state))
					{
						if (property is Number)
						{
							state = state[property][DynamicState.SESSION_STATE];
						}
						else
						{
							for each (var obj:Object in state)
