Comments below. Hope this is not too late to be of help.

On Mar 12, 2008, at 4:24 AM, Pedro Melo wrote:

I'm trying to tap into the NSDistributedNotificationCenter with Perl.

The simplest script that almost works is this:

#### START
package Listener;
use strict;
use Foundation;

sub start {
 my ($class) = @_;
 my $self = bless {}, $class;

 my $center = NSDistributedNotificationCenter->defaultCenter;
$center->addObserver_selector_name_object_($self, 'updated', "org.simplicidade.guy.whatsup", undef);

sub updated {}

package main;
use strict;


#### END

I get the events but I cannot figure out how to pass a selector (the 'updated' argument in the addObserver... call above) from Perl to ObjC. I've also tried the following:

* using base as PerlObjCBridge or NSObject;
* using PerlObjCBridge::preloadSelectors('Listener');
* using a anonymous coderef;
* using a coderef to &updated.

The following messages are generated when the notification is received.

2008-03-12 10:14:11.710 perl[22003] *** -[PerlProxy updated]: selector not recognized [self = 0x3323c0] 2008-03-12 10:14:11.710 perl[22003] Exception raised during posting of notification. Ignored. exception: *** -[PerlProxy updated]: selector not recognized [self = 0x3323c0]

So the "updated" selector is recognized somehow, the then he uses a PerlProxy base class? I could not find any documentation on PerlProxy.

Any ideas on how to give a selector to objC?

Thanks in advance,
Pedro Melo

Try these steps:

# create a new Perl XSUB module
> cd /tmp
> h2xs -A -P -n Listener
> cd Listener

# add an Objective-C stub for the "updated" method to Listener.xs
> vi Listener.xs
> cat Listener.xs
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#include "ppport.h"

#ifdef Move
#undef Move
#endif Move

#import <Foundation/Foundation.h>

@interface Listener: NSObject

@implementation Listener

- (void)updated {}


MODULE = Listener               PACKAGE = Listener

# add the Listener package code to
> vi lib/
> cat lib/
package Listener;

use 5.008008;
use strict;
use warnings;

require Exporter;

our @ISA = qw(Exporter);

# Items to export into callers namespace by default. Note: do not export
# names by default without a very good reason. Use EXPORT_OK instead.
# Do not simply export all your public functions/methods/constants.

# This allows declaration       use Listener ':all';
# If you do not need this, moving things directly into @EXPORT or @EXPORT_OK
# will save memory.
our %EXPORT_TAGS = ( 'all' => [ qw(

) ] );

our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } );

our @EXPORT = qw(


our $VERSION = '0.01';

require XSLoader;
XSLoader::load('Listener', $VERSION);

# Preloaded methods go here.

use Foundation;


sub new {
   return bless {};

sub updated {
    printf "Here in updated\n";


# add "-ObjC" to INC field in Makefile.PL
> vi Makefile.PL
> cat Makefile.PL

use 5.008008;
use ExtUtils::MakeMaker;
# See lib/ExtUtils/ for details of how to influence
# the contents of the Makefile that is written.
    NAME              => 'Listener',
    VERSION_FROM      => 'lib/', # finds $VERSION
    PREREQ_PM         => {}, # e.g., Module::Name => 1.1
    ($] >= 5.005 ?     ## Add these new keywords supported since 5.005
(ABSTRACT_FROM => 'lib/', # retrieve abstract from module
       AUTHOR         => 'Doug <[EMAIL PROTECTED]>') : ()),
    LIBS              => [''], # e.g., '-lm'
    DEFINE            => '', # e.g., '-DHAVE_SOMETHING'
INC => '-I. -ObjC', # e.g., '-I. -I/usr/include/ other'
        # Un-comment this if you add C files to link with later:
    # OBJECT            => '$(O_FILES)', # link all the C files too

# build and install the module
> perl Makefile.PL INSTALLDIRS=site
> make
> make test
> sudo make install

# write the listener tool
> touch listener
> chmod +x listener
> vi listener
> cat testFoo

use strict;
use warnings;

use Listener;

my $listener = new Listener;
my $center = NSDistributedNotificationCenter->defaultCenter;
$center->addObserver_selector_name_object_( $listener, 'updated', '', undef );

# write the sender tool
> touch sender
> chmod +x sender
> vi sender
> cat sender

use strict;
use warnings;

use Foundation;

my $center = NSDistributedNotificationCenter->defaultCenter;
$center- > postNotificationName_object_userInfo_deliverImmediately_ ( '', undef, undef, 1 );

# run the listener tool in one shell
> ./listener

# run the sender tool in a different shell
> ./sender

You should see the listener tool emit:
Here in updated

- Doug

Reply via email to