Package-level function closures in ActionScript
Package-level function closures are very useful for creating generalized functionality which does not require a class (static methods) or instance of a class (instance methods).
Unlike static and instance methods package-level function closures are not associated with a class or instance of a class but rather with a package. There are no syntactical differences between package-level functions and static or instance methods.
Package-level functions are for the most part utility functions; for instance the flash.utils package contains a number of package-level functions, the most common of which are describeType(), getDefintionByName(), getTimer() and so forth.
Package-level function closures are created by defining a function directly inside the body of a package (where class and interfaces are defined), as can be seen in the following example:
package com.ericfeminella.display
{
import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.IBitmapDrawable;
import mx.graphics.ImageSnapshot;
/**
*
* Creates a snap shot of a <code>Bitmap</code> object
* from the specified <code>IBitmapDrawable</code>
* implementation.
*
* @param display object in which to create the snapshot
* @return <code>Bitmap</code> snapshot of the display object
*
*/
public function createSnapShot(target:IBitmapDrawable) : Bitmap
{
return new Bitmap(ImageSnapshot.captureBitmapData(target));
}
}
Calling a package level function is straightforward, simply import the function just as you would a class or interface and then invoke the function directly…
// import package function
import com.ericfeminella.display.createSnapShot;
// once imported the function can be invoked
createSnapShot( this );
Typically you will find that most functionality can be grouped to a Class or an instance object, however on occasion you may identify specific functionality which is common to packaged functionality as opposed to a specific object, and in these cases utilizing package-level functions is a great option.
May 9th, 2008 at 5:51 am
Excelent Eric! I love to see this details described. Keep this coming please.
May 9th, 2008 at 11:35 am
Hey Eric,
Great post. Is the Singleton Enforcer an example of this?
Kind regards,
Sean
May 13th, 2008 at 9:36 am
Hey Sean,
Are you referring to the SingletonManager?
http://code.ericfeminella.com/classes/as3/SingletonManager.as.html
Thanks,
Eric
May 14th, 2008 at 5:13 am
Pretty cool. Thanks for the information.
May 15th, 2008 at 10:02 am
does this work in flex 3? or is it just a flex 2 thing?
May 16th, 2008 at 7:39 pm
Hey Sam,
This is specific to ActionScript 3.0 so it should work in Flex 2 and 3 as well as AIR and Flash.
- Eric
May 20th, 2008 at 8:45 am
This doesn’t seem to be working for me. I am using Flex 3. I created a function as you said…and I can import it…and the Flex code hinting picks it up and everything (just like the built in functions getTimer() etc…) however after I type in a function or whatever it gives me
“Definition com.cheezeworld.com.utils:stripWhitespace could not be found.”
I don’t understand? meh…
May 22nd, 2008 at 7:25 pm
Great post, like the man sai - keep them coming.
Another great topic might be inner or package level private classes that are only available inside a package.