
use lib './lib';

package Alarm;
use base Class::Observable;

sub new { bless {} , $_[0] }

package Alarm::Noisy;
BEGIN  { @ISA = 'Alarm' }

package Guard;

my $NAME;
BEGIN { $NAME = "a" };

sub new { my $class = shift;
          my $name = shift || $NAME++;
          bless {NAME => $name++ } , $class }

sub update { my $s = shift;
             my $n = ref($s) ? "'$s->{NAME}'" : "class";
             print "Guard $n sees (@_)\n";
           }

package main;

my $g1 = Guard->new("Fred");
my $g2 = Guard->new("James");
my $a1 = Alarm::Noisy->new;
Alarm->add_observer($g1);
$a1->notify_observers("I like pie!");
