--- deliantra/server/ext/widget.ext 2007/12/28 12:44:45 1.22 +++ deliantra/server/ext/widget.ext 2007/12/29 21:07:23 1.23 @@ -19,12 +19,12 @@ on_connect => sub { my ($ns) = @_; - Scalar::Util::weaken (my $weakns = $ns); - $ns->{id} = "a"; $ns->{json_coder}->filter_json_single_key_object ("\fw" => sub { - $weakns->{widget}{$_[0]} + $ns->{widget}{$_[0]} }); + + cf::weaken $ns; }, ); @@ -201,6 +201,8 @@ _w => {}, }, "ext::widget::set"; + cf::weaken $ws->{ns}; + $ws->msg (ws_n => $id); $ws @@ -261,8 +263,9 @@ my $proxy = $self->alloc; - Scalar::Util::weaken ($self->{_w}{$proxy->{id}} = $proxy); - Scalar::Util::weaken ($proxy->{ws} = $self); + cf::weaken + +($self->{_w}{$proxy->{id}} = $proxy), + +($proxy->{ws} = $self); for my $ev (grep /^on_/, keys %args) { $args{$ev} = $proxy->{"_$ev"} = $proxy->cb ($args{$ev}); @@ -290,8 +293,9 @@ $self->{delete $args->{alias} or $name} = $proxy; - Scalar::Util::weaken ($self->{_w}{$proxy->{id}} = $proxy); - Scalar::Util::weaken ($proxy->{ws} = $self); + cf::weaken + +($self->{_w}{$proxy->{id}} = $proxy), + +($proxy->{ws} = $self); for my $ev (grep /^on_/, keys %$args) { $args->{$ev} = $proxy->{"_$ev"} = $proxy->cb ($args->{$ev}); @@ -352,46 +356,6 @@ package ext::widget::proxy; -sub DESTROY { - my ($self) = @_; - - delete $self->{ns}{widget}{$self->{id}}; - - if (my $ws = $self->{ws}) { - $self->msg (w_c => 0, "destroy"); - delete $ws->{_w}{$self->{id}}; - } -} - -sub cb { - my ($self, $cb) = @_; - - my $proxy = bless { - ns => $self->{ns}, - id => $self->{ns}->alloc_wid, - }, "ext::widget::callback"; - - Scalar::Util::weaken $proxy->{ns}; - - $self->{ns}{widget_cb}{$proxy->{id}} = $cb; - - $proxy -} - -sub oneshot_cb { - my ($self, $cb) = @_; - - if ("CODE" eq ref $cb) { - my $ocb = $cb; - $cb = $self->cb (sub { - undef $cb; - &$ocb - }); - } - - $cb -} - sub msg { my ($self, $type, @arg) = @_; @@ -438,6 +402,46 @@ () } +sub DESTROY { + my ($self) = @_; + + delete $self->{ns}{widget}{$self->{id}}; + + if (my $ws = $self->{ws}) { + $self->msg (w_c => 0, "destroy"); + delete $ws->{_w}{$self->{id}}; + } +} + +sub cb { + my ($self, $cb) = @_; + + my $proxy = bless { + ns => $self->{ns}, + id => $self->{ns}->alloc_wid, + }, "ext::widget::callback"; + + cf::weaken $proxy->{ns}; + + $self->{ns}{widget_cb}{$proxy->{id}} = $cb; + + $proxy +} + +sub oneshot_cb { + my ($self, $cb) = @_; + + if ("CODE" eq ref $cb) { + my $ocb = $cb; + $cb = cb $self, sub { + undef $cb; + &$ocb + }; + } + + $cb +} + sub set { my ($self, @kv) = @_;