Syccess - Easy Validation Handler


version 0.104


  use Syccess;

  my $syccess = Syccess->new(
    fields => [
      foo => [ required => 1, length => 4, label => 'PIN Code' ],
      bar => [ required => { message => 'You have 5 seconds to comply.' } ],
      # if no label is given its made out of the name so 'Bar' in this case
      baz => [ length => { min => 2, max => 4 }, label => 'Ramba Zamba' ],

  my $result = $syccess->validate( foo => 1, bar => 1 );
  if ($result->success) {
    print "Yeah!\n";

  my $failed = $syccess->validate();
  unless ($failed->success) {
    for my $message (@{$failed->errors}) {
      print $message->message."\n";

  my $traitsful_syccess = Syccess->new(
    result_traits => [qw( MyApp::Syccess::ResultRole )],
    error_traits => [qw( MyApp::Syccess::ErrorRole )],
    field_traits => [qw( MyApp::Syccess::FieldRole )],
    fields => [
      # ...


Syccess is developed for SyContent.

Syccess is a simple validation layer, which allows to check a hash of values against a validation definition and give back success or allow to see the error messages of the failure. Syccess is not made for caring about anything else, so for a higher level library you integrate Syccess and not try to extend it. Syccess is not made for giving extra attributes to the fields, the validator should be the key topic here, and it is very easy to make own validators specific for your environment, see Syccess::Validator and Syccess::ValidatorSimple, but you should be aware that most requirements should be covered with Syccess::Validator::Code and Syccess::Validator::Call, as both allow you to use simple validation methods you already may have in your model. This way you don't end up making Syccess specific procedures, that might be harder to maintain.

The complete concept of Syccess is read only, which means, a call to "validate" will produce a Syccess::Result which contains the resulting information, while the Syccess object stays unchanged. A Syccess object contains a Syccess::Field object for every field of your "fields" definition. On this field you have an object for every validator. Be aware that the validators are given as ArrayRef and you can use the same validator several times.

BEHAVIOUR INFO: The validators provided by the Syccess core are all designed to ignore a non existing value, an undefined value or an empty string. If you want that giving those leads to an error, then you must use the required validator of Syccess::Validator::Required. If you need to check against those values, for example you use Syccess::Validator::Code and in some cases an undefined value is valid and sometimes not, then you must make a custom validator, see "custom_validator_namespaces".



Required ArrayRef containing the definition of the fields for the validation. It always first the name of the field and then an ArrayRef again with the validators. Those will be dispatched to instantiation Syccess::Field to create the fields objects. See more about validators on its attribute at Syccess::Field. You can provide a validator several times, like several regex or several code validators.


This attribute is the main namespace collection, where Syccess searches for its validators. Normally you do not set it directly, instead you set "custom_validator_namespaces", else you would remove Syccess::Validator and the SyccessX::Validator, which are automatically added after the "custom_validator_namespaces" by default here.


Here you define an ArrayRef of the namespaces that should be used additional to the default ones. For example, if you add validator foo_bar, then Syccess would search first with your custom namespace, for example MyApp::Validator::FooBar, and after that it checks for Syccess::Validator::FooBar and finally SyccessX::Validator::FooBar.

For making custom validator, you must use the Syccess::Validator role, which allows to check over all params given. If you just want to make a simple validator that checks against only the relevant value of the field, then you can use Syccess::ValidatorSimple.

Please use SyccessX::Validator as namespace if you want to upload a new general validator to CPAN.


The class which is used for the result. Default is Syccess::Result.


The class which is used for errors. Default is Syccess::Error.


The class which is used for the fields. Default is Syccess::Field.


Traits to be added to the Syccess::Result class. See with_traits at MooX::Traits.


Traits to be added to the Syccess::Error class. See with_traits at MooX::Traits.


Traits to be added to the Syccess::Field class. See with_traits at MooX::Traits.


Here you can give custom attributes which are dispatched to the instantiation of the "error_class" objects.



See MooX::Traits.


Get the Syccess::Field for the name given as parameter.


Get all Syccess::Field of the Syccess object.


This is the main function to produce a "result_class" object, which will then hold the result and the errors of the validation process. This function must be called with a Hash (no HashRef yet supported) of the values to check for the validation.

Core Validators


Syccess::Validator::Call - Calling a method on an object for validation


Syccess::Validator::Code - Using a CodeRef to validate


Syccess::Validator::In - Checking if a value is in a given list of values


Syccess::Validator::IsNumber - Check if the value is a number


Syccess::Validator::Length - Check for length of the string, if its specific or min or max values.


Syccess::Validator::Regex - Check the value against a regex


Syccess::Validator::Required - Value must be provided, and cant be empty

Label Concept

The system is designed to deliver a validation only, which leaded to the decision to not include the ability to give fields specific attributes. As a consequence out of this, the implementation of a label concept (so a visual representation of the field name in the error message) is done with a special trick, as seen in the "SYNOPSIS", through giving it as just another validator, it will then be consumed as label for the field instead of the load of another validator object.


One bigger feature planned is adding the ability to stack Syccess objects to allow cascaded parameters for validation. Currently this is not implemented, because, if you integrate Syccess in a bigger context, you will want to control the cascading yourself (in my case SyForm takes the control of this). But I hope I will find later the time to make this possible.



  Join and msg Getty

  Pull request and additional contributors are welcome

Issue Tracker


Torsten Raudssus <>


This software is copyright (c) 2017 by Torsten Raudssus.

This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.