complete MooseX::Types port
matthewt [Thu, 7 Feb 2008 15:58:53 +0000 (15:58 +0000)]
20 files changed:
lib/Reaction/InterfaceModel/Action/DBIC/Result/Delete.pm
lib/Reaction/InterfaceModel/Action/DBIC/Result/Update.pm
lib/Reaction/InterfaceModel/Action/DBIC/ResultSet/Create.pm
lib/Reaction/InterfaceModel/Action/DBIC/ResultSet/DeleteAll.pm
lib/Reaction/InterfaceModel/Action/User/ChangePassword.pm
lib/Reaction/InterfaceModel/Action/User/Login.pm
lib/Reaction/InterfaceModel/Action/User/ResetPassword.pm
lib/Reaction/InterfaceModel/Action/User/SetPassword.pm
lib/Reaction/Types/Core.pm
lib/Reaction/Types/DBIC.pm
lib/Reaction/Types/DateTime.pm
lib/Reaction/Types/Email.pm
lib/Reaction/Types/File.pm
lib/Reaction/UI/ViewPort.pm
lib/Reaction/UI/ViewPort/Action.pm
lib/Reaction/UI/ViewPort/Field/DateTime.pm
lib/Reaction/UI/ViewPort/Field/File.pm
lib/Reaction/UI/ViewPort/Field/Password.pm
lib/Reaction/UI/ViewPort/Field/TimeRange.pm
lib/Reaction/UI/ViewPort/Object.pm

index 14ae6dc..4d81486 100644 (file)
@@ -4,7 +4,7 @@ use Reaction::Types::DBIC 'Row';
 use Reaction::Class;
 
 class Delete is 'Reaction::InterfaceModel::Action', which {
-  has '+target_model' => (isa => 'Row');
+  has '+target_model' => (isa => Row);
 
   sub can_apply { 1 }
 
index 34ac7f2..2a822e6 100644 (file)
@@ -8,7 +8,7 @@ class Update is 'Reaction::InterfaceModel::Action', which {
 
   does 'Reaction::InterfaceModel::Action::DBIC::Role::CheckUniques';
 
-  has '+target_model' => (isa => 'Row');
+  has '+target_model' => (isa => Row);
 
   implements BUILD => as {
     my ($self) = @_;
index 07e949b..3494f9b 100644 (file)
@@ -9,7 +9,7 @@ class Create is 'Reaction::InterfaceModel::Action', which {
 
   does 'Reaction::InterfaceModel::Action::DBIC::Role::CheckUniques';
 
-  has '+target_model' => (isa => 'ResultSet');
+  has '+target_model' => (isa => ResultSet);
 
   implements do_apply => as {
     my $self = shift;
index e6dfe3a..c26e287 100644 (file)
@@ -6,7 +6,7 @@ use Reaction::InterfaceModel::Action;
 
 class DeleteAll is 'Reaction::InterfaceModel::Action', which {
 
-  has '+target_model' => (isa => 'ResultSet');
+  has '+target_model' => (isa => ResultSet);
 
   sub can_apply { 1 }
 
index fc8ff88..6546502 100644 (file)
@@ -2,8 +2,10 @@ package Reaction::InterfaceModel::Action::User::ChangePassword;
 
 use Reaction::Class;
 
+use Reaction::Types::Core qw(Password);
+
 class ChangePassword is 'Reaction::InterfaceModel::Action::User::SetPassword', which {
-  has old_password => (isa => 'Password', is => 'rw', lazy_fail => 1);
+  has old_password => (isa => Password, is => 'rw', lazy_fail => 1);
   
   around error_for_attribute => sub {
     my $super = shift;
index 781ec0f..0bc3d97 100644 (file)
@@ -2,11 +2,12 @@ package Reaction::InterfaceModel::Action::User::Login;
 
 use Reaction::Class;
 use aliased 'Reaction::InterfaceModel::Action';
+use Reaction::Types::Core qw(SimpleStr Password);
 
 class Login, is Action, which {
 
-  has 'username' => (isa => 'SimpleStr', is => 'rw', lazy_fail => 1);
-  has 'password' => (isa => 'Password',  is => 'rw', lazy_fail => 1);
+  has 'username' => (isa => SimpleStr, is => 'rw', lazy_fail => 1);
+  has 'password' => (isa => Password,  is => 'rw', lazy_fail => 1);
 
   around error_for_attribute => sub {
     my $super = shift;
index 3ef645d..2637dc0 100644 (file)
@@ -7,12 +7,14 @@ use aliased
   'Reaction::InterfaceModel::Action::User::Role::ConfirmationCodeSupport';
 use aliased 'Reaction::InterfaceModel::Action::User::SetPassword';
 
+use Reaction::Types::Core qw(NonEmptySimpleStr);
+
 class ResetPassword is SetPassword, which {
 
   does ConfirmationCodeSupport;
 
   has confirmation_code => 
-      (isa => 'NonEmptySimpleStr', is => 'rw', lazy_fail => 1);
+      (isa => NonEmptySimpleStr, is => 'rw', lazy_fail => 1);
   
   around error_for_attribute => sub {
     my $super = shift;
index fcf922a..14a561a 100644 (file)
@@ -2,12 +2,13 @@ package Reaction::InterfaceModel::Action::User::SetPassword;
 
 use Reaction::Class;
 use Reaction::InterfaceModel::Action;
+use Reaction::Types::Core qw(Password);
 
 class SetPassword is 'Reaction::InterfaceModel::Action', which {
 
-  has new_password => (isa => 'Password', is => 'rw', lazy_fail => 1);
+  has new_password => (isa => Password, is => 'rw', lazy_fail => 1);
   has confirm_new_password => 
-      (isa => 'Password', is => 'rw', lazy_fail => 1);
+      (isa => Password, is => 'rw', lazy_fail => 1);
   
   around error_for_attribute => sub {
     my $super = shift;
index 62d508c..afd7454 100644 (file)
@@ -6,48 +6,48 @@ use MooseX::Types
 
 use MooseX::Types::Moose qw/Str Num Int/;
 
-subtype SimpleStr
-  => as Str
-  => where { (length($_) <= 255) && ($_ !~ m/\n/) }
-  => message { "Must be a single line of no more than 255 chars" };
+subtype SimpleStr,
+  as Str,
+  where { (length($_) <= 255) && ($_ !~ m/\n/) },
+  message { "Must be a single line of no more than 255 chars" };
 
-subtype NonEmptySimpleStr
-  => as SimpleStr
-  => where { length($_) > 0 }
-  => message { "Must be a non-empty single line of no more than 255 chars" };
+subtype NonEmptySimpleStr,
+  as SimpleStr,
+  where { length($_) > 0 },
+  message { "Must be a non-empty single line of no more than 255 chars" };
 
 # XXX duplicating constraint msges since moose only uses last message
 
-subtype Password
-  => as NonEmptySimpleStr
-  => where { length($_) > 3 }
-  => message { "Must be between 4 and 255 chars" };
+subtype Password,
+  as NonEmptySimpleStr,
+  where { length($_) > 3 },
+  message { "Must be between 4 and 255 chars" };
 
-subtype StrongPassword
-  => as Password
-  => where { (length($_) > 7) && (m/[^a-zA-Z]/) }
-  => message {
+subtype StrongPassword,
+  as Password,
+  where { (length($_) > 7) && (m/[^a-zA-Z]/) },
+  message {
        "Must be between 8 and 255 chars, and contain a non-alpha char" };
 
-subtype NonEmptyStr
-  => as Str
-  => where { length($_) > 0 }
-  => message { "Must not be empty" };
-
-subtype PositiveNum
-  => as Num
-  => where { $_ >= 0 }
-  => message { "Must be a positive number" };
-
-subtype PositiveInt
-  => as Int
-  => where { $_ >= 0 }
-  => message { "Must be a positive integer" };
-
-subtype SingleDigit
-  => as PositiveInt
-  => where { $_ <= 9 }
-  => message { "Must be a single digit" };
+subtype NonEmptyStr,
+  as Str,
+  where { length($_) > 0 },
+  message { "Must not be empty" };
+
+subtype PositiveNum,
+  as Num,
+  where { $_ >= 0 },
+  message { "Must be a positive number" };
+
+subtype PositiveInt,
+  as Int,
+  where { $_ >= 0 },
+  message { "Must be a positive integer" };
+
+subtype SingleDigit,
+  as PositiveInt,
+  where { $_ <= 9 },
+  message { "Must be a single digit" };
 
 1;
 
index 0dd1ff8..8f9a37d 100644 (file)
@@ -11,8 +11,8 @@ subtype 'DBIx::Class::ResultSet'
   => as 'Object'
   => where { $_->isa('DBIx::Class::ResultSet') };
 
-subtype ResultSet
-  => as 'DBIx::Class::ResultSet';
+subtype ResultSet,
+  as 'DBIx::Class::ResultSet';
 
 use DBIx::Class::Core;
 use DBIx::Class::Row;
@@ -21,8 +21,8 @@ subtype 'DBIx::Class::Row'
   => as 'Object'
   => where { $_->isa('DBIx::Class::Row') };
 
-subtype Row
-  => as 'DBIx::Class::Row';
+subtype Row,
+  as 'DBIx::Class::Row';
 
 1;
 
index 491ebe5..d6294d2 100644 (file)
@@ -6,19 +6,19 @@ use MooseX::Types
 use MooseX::Types::Moose qw/Object ArrayRef/;
 use DateTime;
 
-subtype DateTime
-  => as Object
-  => where { $_->isa('DateTime') }
-  => message { "Must be of the form YYYY-MM-DD HH:MM:SS" };
+subtype DateTime,
+  as Object,
+  where { $_->isa('DateTime') },
+  message { "Must be of the form YYYY-MM-DD HH:MM:SS" };
 
 use DateTime::SpanSet;
 
-subtype SpanSet
-  => as Object
-  => where { $_->isa('DateTime::SpanSet') };
+subtype SpanSet,
+  as Object,
+  where { $_->isa('DateTime::SpanSet') };
 
-subtype TimeRangeCollection
-  => as ArrayRef;
+subtype TimeRangeCollection,
+  as ArrayRef;
 
 1;
 
index a82d16f..01660a3 100644 (file)
@@ -6,10 +6,10 @@ use MooseX::Types
 use Reaction::Types::Core 'NonEmptySimpleStr';
 use Email::Valid;
 
-subtype EmailAddress
-  => as NonEmptySimpleStr
-  => where { Email::Valid->address($_) }
-  => message { "Must be a valid e-mail address" };
+subtype EmailAddress,
+  as NonEmptySimpleStr,
+  where { Email::Valid->address($_) },
+  message { "Must be a valid e-mail address" };
 
 1;
 
index a3b762b..065bc4c 100644 (file)
@@ -6,10 +6,10 @@ use MooseX::Types
 use MooseX::Types::Moose 'Object';
 use Catalyst::Request::Upload;
 
-subtype File
-  => as Object
-  => where { $_->isa('Catalyst::Request::Upload') }
-  => message { "Must be a file" };
+subtype File,
+  as Object,
+  where { $_->isa('Catalyst::Request::Upload') },
+  message { "Must be a file" };
 
 1;
 
index 7d24efc..4f12b55 100644 (file)
@@ -3,6 +3,8 @@ package Reaction::UI::ViewPort;
 use Reaction::Class;
 use Scalar::Util qw/blessed/;
 
+sub DEBUG_EVENTS () { $ENV{REACTION_UI_VIEWPORT_DEBUG_EVENTS} }
+
 class ViewPort which {
 
   has location => (isa => 'Str', is => 'rw', required => 1);
@@ -89,8 +91,13 @@ class ViewPort which {
     my ($self, $events) = @_;
     foreach my $event ($self->accept_events) {
       if (exists $events->{$event}) {
-        #my $name = eval{$self->name};
-        #$self->ctx->log->debug("Applying Event: $event on $name with value: ". $events->{$event});
+        if (DEBUG_EVENTS) {
+          my $name = join(' at ', ref($self), $self->location);
+          $self->ctx->log->debug(
+            "Applying Event: $event on $name with value: "
+            .$events->{$event}
+          );
+        }
         $self->$event($events->{$event});
       }
     }
index acd8c94..4b58173 100644 (file)
@@ -2,6 +2,10 @@ package Reaction::UI::ViewPort::Action;
 
 use Reaction::Class;
 
+use aliased 'Reaction::UI::ViewPort::Object';
+
+BEGIN { *DEBUG_EVENTS = \&Reaction::UI::ViewPort::DEBUG_EVENTS; }
+
 use aliased 'Reaction::UI::ViewPort::Field::Mutable::Text';
 use aliased 'Reaction::UI::ViewPort::Field::Mutable::Array';
 use aliased 'Reaction::UI::ViewPort::Field::Mutable::String';
@@ -16,7 +20,7 @@ use aliased 'Reaction::UI::ViewPort::Field::Mutable::ChooseMany';
 #use aliased 'Reaction::UI::ViewPort::Field::Mutable::File';
 #use aliased 'Reaction::UI::ViewPort::Field::Mutable::TimeRange';
 
-class Action is 'Reaction::UI::ViewPort::Object', which {
+class Action is Object, which {
   has model  => (is => 'ro', isa => 'Reaction::InterfaceModel::Action', required => 1);
   #has '+model' => (isa => 'Reaction::InterfaceModel::Action');
 
@@ -44,11 +48,26 @@ class Action is 'Reaction::UI::ViewPort::Object', which {
   implements can_apply => as {
     my ($self) = @_;
     foreach my $field ( @{ $self->fields } ) {
-      return 0 if $field->needs_sync;
+      if ($field->needs_sync) {
+        if (DEBUG_EVENTS) {
+          $self->ctx->log->debug(
+            "Failing out of can_apply on ${\ref($self)} at ${\$self->location}"
+            ." because field for ${\$field->attribute->name} needs sync"
+          );
+        }
+      }
       # if e.g. a datetime field has an invalid value that can't be re-assembled
       # into a datetime object, the action may be in a consistent state but
       # not synchronized from the fields; in this case, we must not apply
     }
+    if (DEBUG_EVENTS) {
+      my $ret = $self->model->can_apply;
+      $self->ctx->log->debug(
+        "model can_apply returned ${ret}"
+        ." on ${\ref($self)} at ${\$self->location}"
+      );
+      return $ret;
+    }
     return $self->model->can_apply;
   };
 
@@ -121,7 +140,7 @@ class Action is 'Reaction::UI::ViewPort::Object', which {
     $self->_build_simple_field(attribute => $attr, class => Boolean, %$args);
   };
 
-  implements _build_fields_for_type_SimpleStr => as {
+  implements _build_fields_for_type_Reaction_Types_Core_SimpleStr => as {
     my ($self, $attr, $args) = @_;
     $self->_build_simple_field(attribute => $attr, class => String, %$args);
   };
@@ -140,7 +159,7 @@ class Action is 'Reaction::UI::ViewPort::Object', which {
     }
   };
 
-  implements _build_fields_for_type_Password => as {
+  implements _build_fields_for_type_Reaction_Types_Core_Password => as {
     my ($self, $attr, $args) = @_;
     $self->_build_simple_field(attribute => $attr, class => Password, %$args);
   };
index e89fc47..50d26cf 100644 (file)
@@ -6,7 +6,7 @@ use Reaction::Types::DateTime;
 use aliased 'Reaction::UI::ViewPort::Field';
 
 class DateTime is Field, which {
-  has '+value' => (isa => 'DateTime');
+  has '+value' => (isa => DateTime);
 
   has value_string_default_format => (
     isa => 'Str', is => 'rw', required => 1, default => sub { "%F %H:%M:%S" }
index b3af0bc..4c97a02 100644 (file)
@@ -5,7 +5,7 @@ use Reaction::Types::File;
 
 class File is 'Reaction::UI::ViewPort::Field', which {
 
-  has '+value' => (isa => 'File', required => 0);
+  has '+value' => (isa => File, required => 0);
 
   #has '+layout' => (default => 'file');
 
index bc86341..a80e71a 100644 (file)
@@ -2,9 +2,11 @@ package Reaction::UI::ViewPort::Field::Password;
 
 use Reaction::Class;
 
+use Reaction::Types::Core qw(SimpleStr);
+
 class Password is 'Reaction::UI::ViewPort::Field::String', which {
 
-  has '+value' => (isa => 'SimpleStr');
+  has '+value' => (isa => SimpleStr);
   #has '+layout' => (default => 'password');
 
 };
index a63fdf4..ccf6e65 100644 (file)
@@ -1,14 +1,14 @@
 package Reaction::UI::ViewPort::Field::TimeRange;
 
 use Reaction::Class;
-use Reaction::Types::DateTime;
+use Reaction::Types::DateTime qw(SpanSet);
 use DateTime;
 use DateTime::SpanSet;
 use Time::ParseDate ();
 
 class TimeRange is 'Reaction::UI::ViewPort::Field', which {
 
-  has '+value' => (isa => 'SpanSet');
+  has '+value' => (isa => SpanSet);
 
   #has '+layout' => (default => 'timerange');
 
index aa372d2..8ec1250 100644 (file)
@@ -143,7 +143,7 @@ class Object is 'Reaction::UI::ViewPort', which {
   };
 
   #XXX
-  implements _build_fields_for_type_Password => as { return };
+  implements _build_fields_for_type_Reaction_Types_Core_Password => as { return };
 
   implements _build_fields_for_type_Str => as {
     my ($self, $attr, $args) = @_;
@@ -151,7 +151,7 @@ class Object is 'Reaction::UI::ViewPort', which {
     $self->_build_simple_field(attribute => $attr, class => String, %$args);
   };
 
-  implements _build_fields_for_type_SimpleStr => as {
+  implements _build_fields_for_type_Reaction_Types_Core_SimpleStr => as {
     my ($self, $attr, $args) = @_;
     $self->_build_simple_field(attribute => $attr, class => String, %$args);
   };