Welcome to as3-commons-bytecode

AS3Commons-bytecode is an open-source library supplying a ABC bytecode parsing as well as posting and bytecode based representation API for ActionScript 3.0.

It offers an emit API for creating courses at runtime, as well as a proxy API to generate vibrant runtime proxies along with an intercepting mechanism.

Either of these can be made use of as a foundation for mocking or AOP libraries, or any other kind of task that needed runtime class generation.

Being a pure actionscript library it could be made use of for any kind of Flash/Flex/AIR project.

This job made use of to be referred to as Loom as developed by Maxim Porges. (http://code.google.com/p/loom-as3/).

The collection supplies tidy, full and also easy introspection on class variables, accessors, techniques, metadata and also even more, by analyzing the bytecode returned by loaderInfo.bytes. By parsing the bytecode straight it is feasible to gain total class understanding, which means private participants and techniques, default worths for optional criteria, and so on.

Parsing results are cached so that a SWF just should be analyzed once.

This collection depends upon these various other as3commons libraries:.

  • AS3Commons-reflect.
  • AS3Commons-lang.

The library is extensively examined as well as is being utilized in the Spring Actionscript task for its class scanning system.

Welcome to as3-commons-ui

Note: The sources of this project have been moved to GitHub.

The existing Google Code SVN branch is not longer maintained and only updated to reflect new releases. You still may download the latest release from this page. A ZIP archive containing src, examples, tests, APIDoc and external libraries is available on GitHub.

GitHub: https://github.com/as3commons/as3commons-ui
Project documentation and usage examples: Developer Page AS3Commons UI

The project contains algorithms and managers for common user interface releated tasks such as layouting, focus and keyboard management, popup handling, drag and drop control and so on. All packages support native Flash display objects. Usage of UI does not require interface implementations.

The first version (0.1) includes the sole layout package.

  • Single line: HGroup, VGroup
  • Multiline: HLayout, VLayout
  • Table: Table, DynTable

Version 0.2 adds the Invalidation and LifeCycle package.

Version 0.3 comes with popup and tooltip management.

Version 0.4 is planned to include a key focus manager.

Introduction – as3-commons-eventbus

In a de-coupled environment, its not always easy to let various components communicate with each other. In order to make this task slightly easier AS3Commons offers the EventBus.

The EventBus is used as a publish/subscribe event mechanism that lets objects communicate with eachother in a loosely coupled way.

A dependency injection mechanism can be used to inject a shared EventBus instance into the necessary application components.

Multiple EventBus instances can operate independently of each other or can optionally be chained to allow for inter-application or -module communication.

EventBus listeners

There are a number of different ways to subscribe to events that are dispatched through the EventBus:

Global listeners using the IEventBusListener interface

The first is to listen to all events that are dispatched through the EventBus. This is possible through the EventBus.addListener() method. This method expects an IEventBusListener instance as an argument. The IEventBusListener interface looks like this:

public interface IEventBusListener {

 function onEvent(event:Event):void;

}

Every event dispatched by the EventBus will be passed into the onEvent method.

eventBus.addListener(listener);

Event type listeners

The second method is to only listen for events of a specific type. Use the EventBus.addEventListener() method for this task. The addEventListener() method expects two arguments, the first is a string representing the event type, and the second is a Function instance which will be invoked after every event dispatch of the specified type.

eventBus.addEventListener("myCustomEvent", listenerFunction);

Instead of a Function it is also possible to supply a proxy instead. This is what the addEventListenerProxy() method is for. Instead of a Function this expects a MethodInvoker instance. The MethodInvokerclass is part of the as3-commons-reflect project.

var methodInvoker:MethodInvoker = new MethodInvoker();
methodInvoker.target = someInstance;
methodInvoker.method = "listenerMethodName";
eventBus.addEventListenerProxy("myCustomEvent", methodInvoker);

Event class listeners

The last option is to add a listener for events of a certain class. To get this to happen use the addEventClassListener() or addEventClassListenerProxy() methods. The same arguments apply to these as for their addEventListener() and addEventListenerProxy() neighbours, except they expect a Class instance instead of a type.

eventBus.addEventClassListener(MyCustomEvent, listenerFunction);

Removing listeners

All these methods naturally have a removal counterpart: removeListener(), removeEventListener(), removeEventListenerProxy(), removeEventClassListener() and removeEventClassListenerProxy().

To clear all types of registered eventlisteners at once simply call the removeAll() method.

Adding weak listeners

Each add*() method has an extra optional argument called useWeakReference that defaults to false. Setting this to true determines that the event listener will be added using a weak reference, which will make it eligible for garbage collection if no other non-weak references exist for it anymore.

eventBus.addListener(listener, true)

Filtering events using topics

Each add*() and remove*() method has one last extra optional argument: topic:Object.

By setting this argument to a non-null value determines that the listener will only be invoked if an event associated with the same topic is dispatched.

In the simplest case a topic is just a String:

eventBus.addListener(eventBusListener, false, "myTopic");

This topic however can also be a complex object, in which case the topic can be used as a specific context.

For instance, the object could be a security token in which case a listener can only be added for a certain secure events if it has received this token instance.

EventBus dispatchers

This is the easiest part, to dispatch an event through anEventBusinvoke either the dispatchEvent() or dispatch() methods. The former expects an Event instance while the latter expects a string that indicates a certain type of Event. This event will be created by this method and subsequently dispatched. For example:

eventBus.dispatchEvent(new MyCustomEvent("myCustomEventType"));

or:

eventBus.dispatch("myCustomEventType");

Dispatching events using topics

The dispatchEvent() and dispatch() methods have an optional topic argument, like the add*() and remove*() methods. Setting this topic will associate the dispatched event with the specified topic.

eventBus.dispatchEvent(new MyCustomEvent("myCustomEventType"), "myTopic");

EventBus event interceptin

To prevent events from passing through the EventBus, or to change their properties before they do, an IEventBus implementation accepts IEventInterceptor registrations.

This process is almost the same as for event listeners: Interceptors can be added globally, for specific event types or specific classes and for specific topics.

eventBus.addInterceptor(interceptor);
eventBus.addEventInterceptor("myCustomEvent", interceptor);
eventBus.addEventClassInterceptor(MyCustomEvent, interceptor);
//And for topic specific interception:
eventBus.addInterceptor(interceptor, "myTopic");
eventBus.addEventInterceptor("myCustomEvent", interceptor, "myTopic");
eventBus.addEventClassInterceptor(MyCustomEvent, interceptor, "myTopic");

The IEventInterceptor interface is a very simple one and looks like this:

public interface IEventInterceptor extends IEventBusAware {
	function get blockEvent():Boolean;
	function set blockEvent(value:Boolean):void;
	function intercept(event:Event):void;
}

The intercept() method will be invoked for each event that passes through the EventBus and that adheres to the registration parameters of the IEventInterceptor.

To prevent the event to continue to be dispatched the blockEvent property can be set to true.

An IEventInterceptor also receives a reference to the current EventBus each time its intercept() method is invoked, this allows an implementation to block certain events and replace them with a different instance. Events could be split up into multiple events, etc.

AS3Comons-eventbus offers the AbstractEventInterceptor to be used as a general base class for event interceptors.

EventBus event listener intercepting

To log, modify or block event listeners from being added an IEventListenerInterceptor can be registered with the EventBus.

This process is almost the same as for event listeners and interceptors: Listener interceptors can be added globally, for specific event types or specific classes and for specific topics.

eventBus.addListenerInterceptor(interceptor);
eventBus.addEventListenerInterceptor("myCustomEvent", interceptor);
eventBus.addClassListenerInterceptor(MyCustomEvent, interceptor);
//And for topic specific interception:
eventBus.addListenerInterceptor(interceptor, "myTopic");
eventBus.addEventListenerInterceptor("myCustomEvent", interceptor, "myTopic");
eventBus.addClassListenerInterceptor(MyCustomEvent, interceptor, "myTopic");

To prevent the listener from being added, simply set the blockListener property to true.

An IEventListenerInterceptor also receives a reference to the current EventBus each time its interceptListener() or interceptListenerProxy() method is invoked, allowing the interceptor to examine the EventBus before deciding to allow the listener to be added or not.

AS3Comons-eventbus offers the AbstractEventListenerInterceptor to be used as a general base class for eventlistener interceptors.

Static EventBus implementation

In a select few cases it might be easier to have one static eventbus in an application, for this purpose as3-commons-eventbus offers the StaticEventBus.

The StaticEventBus has static equivalents of all the IEventBus methods, so its usage is exactly the same.

EventBus chaining

The EventBus itself is also an implementation of IEventBusListener. Therefore it is possible to chain multiple EventBus instances by adding an EventBus as a global listener to another EventBus.

In that case every event dispatched by the EventBus will be redispatched by the listening EventBus.

var eventBus1:EventBus = new EventBus();
var eventBus2:EventBus = new EventBus();
eventBus1.addListener(eventBus2, true);
eventBus1.dispatchEvent(new MyCustomEvent());
//MyCustomEvent will now also be dispatched through eventBus2...

Welcome to as3-commons-eventbus

The EventBus is utilized as a publish/subscribe event device that lets things communicate with eachother in a loosely combined way.

It offers event registration based upon occasion name, event class or for particular topics. An interception mechanism is in place to block or change incoming events.

A similar interception device is in area to obstruct occasion listeners, plus event postprocessing for executing reasoning after an event has actually been sent out to its audiences.

The collection is thoroughly examined as well as is being made use of in the Spring Actionscript task.

Welcome to as3-commons-async

AS3Commons-ASync is a pure actionscript 3 collection that aims to earn collaborating with asynchronous procedures much easier by abstracting numerous different executions encountered in the Flash setting away behind a few easy-to-understand interfaces.

This collection used to be an integral part of Spring Actionscript, but has actually given that been released as an independent API.

The collection is extensively checked as well as is being made use of in the Spring Actionscript job.

Welcome to as3-commons-logging

AS3Commons-logging is an open-source library giving an abstraction over logging framework executions. Being a pure actionscript collection it can be utilized for any kind of Flash/Flex/AIR job. Its use is advised for usage with other libraries/framework trying to be logging framework agnostic.

AS3-commons-logging

The library provides an usual interface to logger creation and also logging as well as it gives some fundamental loggers executions:

  • a default logger utilizing trace().
  • a null logger that can be made use of to disregard logging.
  • a flex logger (mx.logging.ILogger) application.

Various other implementations could be developed by users for any other logging framework.

Welcome to as3-commons-reflect

AS3Commons-reflect depends on the AS3Commons-lang library, you can download it here.

AS3Commons-reflect is an open-source library providing a reflection API for ActionScript 3.0. Being a pure actionscript library it can be used for any Flash/Flex/AIR project.

AS3-commons-reflect

The library provides clean, easy and complete introspection on class variables, accessors, methods, metadata etc. etc. by parsing the xml returned by flash.utils.describeType. Parsing results are cached so that possibly resource expensive parsing won’t occur next time for the same class.

When Flash player 10.1 or higher is installed, instead of using the native describeType method the new describeTypeJSON method is used to retrieve the type information.

This yields a significant speed improvement.

Metadata, MetadataArgument, Accessor, Constant, Variable and Parameter arguments are immutable. So, for instance, if the Bindable metadata is used on two different classes and/or members AS3Commons-reflect will return the same Metadata instance in order to preserve memory.

The library is thoroughly tested and is being intensively used for the Spring Actionscript project.