On Mon, May 19, 2008 at 1:33 PM, Peter Duniho <[EMAIL PROTECTED]> wrote:

Well, I'm still waiting for someone to show me how that flexibility is used.


I'll take that challenge. :-)

The flexibility of the Objective-C language & runtime allow me to intercept
messages sent in either direction, and route them through a "bridge"
function that translates them to a foreign language. In this case, the
language is Perl, but I don't intend to brag here - as I understand it, the
Ruby and Python bridges have similar capabilities.

Because Perl is dynamic, I can create a "default" method that intercepts any
unknown messages. This Perl method passes the class and method names as
string arguments, and that's exactly what the runtime functions take. Once
I've queried the runtime to find the correct Class and Sel structures to
use, and a description of arguments and return types, the rest is a SMOP -
using libffi to build a stack frame and make the call to the message
dispatch function.

A similar process happens in reverse. Perl classes can be registered with
the Objective-C runtime. The IMP (implementation function) for any method
that's implemented in Perl is the same - a single dispatch method I've
written that examines the "self" and "_sel" arguments, and dispatches the
call to the appropriate Perl method.

Because both Perl and Objective-C are dynamic, I wrote a single "bridge"
function for each direction, and that's all I needed to write to support
calling any method on any class, whether it's known at compile time or not.

That's the easy stuff. :-)

You can also create an Objective-C subclass of a Perl super class. You'll
need to create a header with an @interface for the Perl class, and you'll
get a warning when compiling it because there's no @implementation available
at compile time. But, if your subclass is defined in a bundle and loaded
dynamically after the Perl superclass has been compiled and registered with
the runtime, the runtime sorts out the inheritance correctly when the
subclass is loaded - because the superclass is registered dynamically, by
name.

As I understand it, the Python bridge (and maybe others) has an "injector"
feature that allows you to inject a Python interpreter and command console
into any Cocoa app, while the app is running, whether the app was built with
them not. Since everything is dynamic, you can look around and manipulate
objects and properties by name. In essence, you can add a plugin interface
to an app - whether it wants one or not. :-)

Note that I'm not trying to say these kinds of things *can't* be done in C++
or Java. I'm just saying that, to support things like the ability to refer
to random (possibly unknown) methods and properties, by name, would require
a lot more work to implement in C++ or Java.

sherm--

-- 
Cocoa programming in Perl: http://camelbones.sourceforge.net
_______________________________________________

Cocoa-dev mailing list (Cocoa-dev@lists.apple.com)

Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com

Help/Unsubscribe/Update your Subscription:
http://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com

This email sent to [EMAIL PROTECTED]

Reply via email to