requires 'metaclass' => '0.81';
requires 'Method::Signatures::Simple' => '0.03';
requires 'signatures' => '0.05';
+requires 'MooseX::Role::Parameterized' => '0.13';
test_requires 'Test::Class' => '0.31';
test_requires 'Test::WWW::Mechanize::Catalyst' => '0.51';
superclasses => [$base],
( @$roles ? (roles => $roles) : ()),
);
-
+
# sources => undef, #default to qr/./
# sources => [], #default to nothing
# sources => qr//, #DWIM, treated as [qr//]
use MooseX::Types::Moose qw/ArrayRef/;
extends 'Reaction::UI::ViewPort::Field';
-with 'Reaction::UI::ViewPort::Field::Role::Mutable';
+with 'Reaction::UI::ViewPort::Field::Role::Mutable' => { value_type => 'ArrayRef' };
with 'Reaction::UI::ViewPort::Field::Role::Choices';
#MUST BE HERE, BELOW THE 'does', OR THE TRIGGER WILL NOT HAPPEN!
-has '+value' => (isa => ArrayRef);
+#has '+value' => (isa => ArrayRef);
around value => sub {
my $orig = shift;
use namespace::clean -except => [ qw(meta) ];
extends 'Reaction::UI::ViewPort::Field';
-with 'Reaction::UI::ViewPort::Field::Role::Mutable::Simple';
-
-has '+value' => (isa => Upload);
+with 'Reaction::UI::ViewPort::Field::Role::Mutable::Simple'
+ => { value_type => Upload };
override apply_our_events => sub {
my ($self, $events) = @_;
package Reaction::UI::ViewPort::Field::Role::Mutable;
-use Reaction::Role;
+use MooseX::Role::Parameterized;
use aliased 'Reaction::InterfaceModel::Action';
use aliased 'Reaction::Meta::InterfaceModel::Action::ParameterAttribute';
use MooseX::Types::Moose qw/Int Str/;
-
use namespace::clean -except => [ qw(meta) ];
+=pod
+
+15:24 mst:» I'm not sure I understand why the +foo is overwriting my after'ed clear_value
+15:24 mst:» but I would argue it shouldn't do that
+15:25 @doy:» because has '+foo' is creating an entirely new attribute
+15:25 @doy:» and just copying the meta-attribute's attributes into it
+15:25 @doy:» so it's creating a new clearer sub in the subclass
+15:27 rafl:» mst: for that case, i tend to just parameterize the role on whatever i might want to override in its attribute definitions
+
+=cut
+
+parameter value_type => (
+ predicate => 'has_value_type'
+);
+
+role {
+
+my $p = shift;
+
has model => (is => 'ro', isa => Action, required => 1);
has attribute => (is => 'ro', isa => ParameterAttribute, required => 1);
has value => (
- is => 'rw', lazy_build => 1, trigger_adopt('value'),
+ is => 'rw', lazy_build => 1, trigger => sub { shift->adopt_value },
clearer => 'clear_value',
+ $p->has_value_type? (isa => $p->value_type) : ()
);
+
has needs_sync => (is => 'rw', isa => Int, default => 0); #should be bool?
has message => (is => 'rw', isa => Str, clearer => 'clear_message');
has is_modified => ( #sould be bool?
- is => 'ro', writer => '_set_modified',
+ is => 'ro', writer => '_set_modified',
required => 1, default => 1, init_arg => undef
);
around accept_events => sub { ('value', shift->(@_)) };
+};
1;
package Reaction::UI::ViewPort::Field::Role::Mutable::Simple;
-use Reaction::Role;
+use MooseX::Role::Parameterized;
use aliased 'Reaction::UI::ViewPort::Field::Role::Mutable';
use namespace::clean -except => [ qw(meta) ];
-with Mutable;
+
+parameter value_type => (
+ predicate => 'has_value_type'
+);
+
+role {
+
+my $p = shift;
+
+with Mutable, $p->has_value_type ? { value_type => $p->value_type } : ();
has value_string => (
- is => 'rw', lazy_build => 1, trigger_adopt('value_string'),
+ is => 'rw', lazy_build => 1, trigger => sub { shift->adopt_value_string },
clearer => 'clear_value',
);
around force_events => sub { (value_string => '', shift->(@_)) };
-
+};
1;