package org.libspark.events { import flash.events.Event; public class HierarchicalEvent extends Event { public function HierarchicalEvent(type:String, bubbles:Boolean = false, cancelable:Boolean = false) { super(type, bubbles, cancelable); } private var _eventPhase:uint; private var _target:Object; private var _original:HierarchicalEvent; private var _stopImmediatePropagationCalled:Boolean; private var _stopPropagationCalled:Boolean; override public function get eventPhase():uint { return _eventPhase; } internal function setEventPhase(value:uint):void { _eventPhase = value; } override public function get target():Object { return _target; } internal function setTarget(value:Object):void { _target = value; } protected function get original():HierarchicalEvent { return _original } protected function set original(value:HierarchicalEvent):void { _original = value; } internal function get stopImmediatePropagationCalled():Boolean { return _stopImmediatePropagationCalled; } internal function set stopImmediatePropagationCalled(value:Boolean):void { _stopImmediatePropagationCalled = value; } override public function stopImmediatePropagation():void { super.stopImmediatePropagation(); if (original != null) { original.stopImmediatePropagation(); } stopImmediatePropagationCalled = true; } internal function get stopPropagationCalled():Boolean { return _stopPropagationCalled; } internal function set stopPropagationCalled(value:Boolean):void { _stopPropagationCalled = value; } override public function stopPropagation():void { super.stopPropagation(); if (original != null) { original.stopPropagation(); } stopPropagationCalled = true; } protected function get newInstance():HierarchicalEvent { return new HierarchicalEvent(type, bubbles, cancelable); } protected function setProperties(from:HierarchicalEvent):void { setEventPhase(from.eventPhase); setTarget(from.target); original = from; stopImmediatePropagationCalled = from.stopImmediatePropagationCalled; stopPropagationCalled = from.stopPropagationCalled; } override public function clone():Event { var cloned:HierarchicalEvent = newInstance; cloned.setProperties(this); return cloned; } } }