1 package Reaction::UI::WidgetClass;
3 use Reaction::ClassExporter;
5 use Reaction::UI::Widget;
8 use aliased 'Reaction::UI::WidgetClass::_OVER';
12 use namespace::clean -except => [ qw(meta) ];
15 # for local() for fragment wrap
16 our ($next_call, $fragment_args, $current_widget, $do_render, $new_args);
18 after 'do_import' => sub {
19 my ($self, $package) = @_;
20 Devel::Declare->install_declarator(
21 $package, 'fragment', DECLARE_NAME,
24 WidgetClass->handle_fragment(@_);
29 after 'setup_and_cleanup' => sub {
30 my ($self, $package) = @_;
33 delete ${"${package}::"}{'fragment'};
35 #Devel::Declare->teardown_for($package);
37 override exports_for_package => sub {
38 my ($self, $package) = @_;
41 my ($collection) = @_;
42 confess "too many args, should be: over \$collection" if @_ > 1;
43 _OVER->new(collection => $collection);
46 my ($name, $over) = @_;
48 my $sig = "should be: render 'name' or render 'name' => over \$coll";
49 if (!defined $name) { confess "name undefined: $sig"; }
50 if (ref $name) { confess "name not string: $sig"; }
51 if (defined $over && !(blessed($over) && $over->isa(_OVER))) {
52 confess "invalid args after name, $sig";
54 $do_render->($package, $current_widget, $name, $over);
57 my ($name, $value) = @_;
59 my $sig = "should be: arg 'name' => \$value";
60 if (@_ < 2) { confess "Not enough arguments, $sig"; }
61 if (!defined $name) { confess "name undefined, $sig"; }
62 if (ref $name) { confess "name is not a string, $sig"; }
64 $new_args->{$name} = $value;
67 confess "args passed, should be just call_next; or call_next();"
69 $next_call->(@$fragment_args);
73 $_{viewport}->event_id_for($name);
77 my $vp = $_{viewport};
78 my %args = map{ $vp->event_id_for($_) => $events->{$_} } keys %$events;
79 $vp->ctx->req->uri_with(\%args);
83 return join(' ', map {
84 my $text = $attrs->{$_};
96 override default_base => sub { ('Reaction::UI::Widget') };
98 my ($self, $name, $proto, $code) = @_;
99 #warn ($self, $name, $code);
100 return ("_fragment_${name}" => $self->wrap_as_fragment($code));
102 sub wrap_as_fragment {
103 my ($self, $code) = @_;
106 if (ref $_[0] eq 'CODE') { # inside 'around' modifier
109 local $fragment_args = \@_;
111 # $self->$method($do_render, \%_, $new_args)
112 local $current_widget = $_[0];
113 local $do_render = $_[1];
114 local *_ = \%{$_[2]};
115 local $_ = $_[2]->{_};
116 local $new_args = $_[3];
121 __PACKAGE__->meta->make_immutable;
128 Reaction::UI::WidgetClass
134 See L<Reaction::Class> for authors.
138 See L<Reaction::Class> for the license.